72 lines
2.0 KiB
JavaScript
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; |