74 lines
1.8 KiB
TypeScript
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
|
|
}))
|
|
}
|
|
})
|