81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
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<any>(`
|
|
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<any>(`
|
|
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<number, any>()
|
|
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 }
|
|
})
|