const { Menu, Member } = require('../models'); const { Op } = require('sequelize'); /** * 사용자의 접근 가능한 메뉴 목록을 반환합니다. */ exports.getUserMenus = async (req, res) => { try { const { clubId, role = 'user' } = req.body; const userId = req.user.id; // JWT 토큰에서 사용자 ID 가져오기 if (!clubId) { return res.status(400).json({ success: false, message: '클럽 ID가 필요합니다.' }); } // 멤버 정보 조회 const member = await Member.findOne({ where: { clubId, userId } }); const menus = await getAccessibleMenus(clubId, role, member); res.json({ success: true, data: menus }); } catch (error) { console.error('메뉴 조회 중 오류 발생:', error); res.status(500).json({ success: false, message: '메뉴 조회 중 오류가 발생했습니다.' }); } } /** * 사용자 권한과 클럽의 구독/기능 상태에 따라 접근 가능한 메뉴 목록을 조회합니다. */ const { clubHasFeature } = require('../utils/featureAccess'); async function getAccessibleMenus(clubId, userRole, member) { // 1. 모든 visible 메뉴 조회 const allMenus = await Menu.findAll({ where: { visible: true }, order: [['order', 'ASC']] }); // 2. 각 메뉴별로 featureCode가 있으면 clubHasFeature로 체크 async function isAccessible(menu) { if (!menu.featureCode) return true; return await clubHasFeature(clubId, menu.featureCode); } // 3. 트리 구조로 접근 가능한 메뉴만 반환 async function buildMenuTree(parentId = null) { const filteredMenus = []; for (const menu of allMenus.filter(m => m.parentId === parentId)) { if (await isAccessible(menu)) { const children = await buildMenuTree(menu.id); filteredMenus.push({ ...menu.toJSON(), children }); } } return filteredMenus; } return await buildMenuTree(); } exports.getAccessibleMenus = getAccessibleMenus;