Files
2025-04-24 12:01:51 +09:00

72 lines
2.0 KiB
JavaScript

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;