import { query } from '../../utils/db' import { getDbSession, getSessionIdFromCookie } from '../../utils/session' /** * 현재 사용자 접근 가능 메뉴 조회 * GET /api/auth/menu */ export default defineEventHandler(async (event) => { const sessionId = getSessionIdFromCookie(event) if (!sessionId) { throw createError({ statusCode: 401, message: '로그인이 필요합니다.' }) } const session = await getDbSession(sessionId) if (!session) { throw createError({ statusCode: 401, message: '세션이 만료되었습니다.' }) } // 사용자의 권한 목록 조회 const userRoles = await query(` SELECT r.role_id, r.role_code FROM wr_employee_role er JOIN wr_role r ON er.role_id = r.role_id WHERE er.employee_id = $1 `, [session.employeeId]) const roleIds = userRoles.map(r => r.role_id) if (roleIds.length === 0) { return { menus: [] } } // 접근 가능한 메뉴 조회 const menus = await query(` SELECT DISTINCT m.menu_id, m.menu_code, m.menu_name, m.menu_path, m.menu_icon, m.parent_menu_id, m.sort_order FROM wr_menu m JOIN wr_menu_role mr ON m.menu_id = mr.menu_id WHERE mr.role_id = ANY($1) AND m.is_active = true ORDER BY m.parent_menu_id NULLS FIRST, m.sort_order `, [roleIds]) // 계층 구조로 변환 const menuMap = new Map() const rootMenus: any[] = [] for (const m of menus) { const menuItem = { menuId: m.menu_id, menuCode: m.menu_code, menuName: m.menu_name, menuPath: m.menu_path, menuIcon: m.menu_icon, parentMenuId: m.parent_menu_id, sortOrder: m.sort_order, children: [] } menuMap.set(m.menu_id, menuItem) } for (const m of menus) { const menuItem = menuMap.get(m.menu_id) if (m.parent_menu_id && menuMap.has(m.parent_menu_id)) { menuMap.get(m.parent_menu_id).children.push(menuItem) } else if (!m.parent_menu_id) { rootMenus.push(menuItem) } } return { menus: rootMenus } })