Files
weeklyreport/backend/api/admin/menu/list.get.ts

74 lines
1.8 KiB
TypeScript

import { query } from '../../../utils/db'
import { requireAdmin } from '../../../utils/session'
/**
* 메뉴 목록 조회 (권한 포함)
* GET /api/admin/menu/list
*/
export default defineEventHandler(async (event) => {
await requireAdmin(event)
// 메뉴 목록 조회
const menus = await query<any>(`
SELECT
m.menu_id,
m.menu_code,
m.menu_name,
m.menu_path,
m.menu_icon,
m.parent_menu_id,
m.sort_order,
m.is_active,
m.created_at,
m.updated_at,
pm.menu_name AS parent_menu_name
FROM wr_menu m
LEFT JOIN wr_menu pm ON m.parent_menu_id = pm.menu_id
ORDER BY m.parent_menu_id NULLS FIRST, m.sort_order
`)
// 권한 목록 조회
const roles = await query<any>(`
SELECT role_id, role_code, role_name
FROM wr_role
ORDER BY role_id
`)
// 메뉴-권한 매핑 조회
const menuRoles = await query<any>(`
SELECT menu_id, role_id
FROM wr_menu_role
`)
// 메뉴별 권한 매핑 정리
const menuRoleMap: Record<number, number[]> = {}
for (const mr of menuRoles) {
if (!menuRoleMap[mr.menu_id]) {
menuRoleMap[mr.menu_id] = []
}
menuRoleMap[mr.menu_id].push(mr.role_id)
}
return {
menus: menus.map(m => ({
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,
parentMenuName: m.parent_menu_name,
sortOrder: m.sort_order,
isActive: m.is_active,
createdAt: m.created_at,
updatedAt: m.updated_at,
roleIds: menuRoleMap[m.menu_id] || []
})),
roles: roles.map((r: any) => ({
roleId: r.role_id,
roleCode: r.role_code,
roleName: r.role_name
}))
}
})