권한, 사용자, 메뉴 등에 대한 기능 업데이트

This commit is contained in:
2026-01-10 16:54:06 +09:00
parent 134a68d9db
commit ef7914d5c6
34 changed files with 2678 additions and 650 deletions

View File

@@ -1,7 +1,8 @@
import { getSession, refreshSession, getSessionIdFromCookie, deleteSessionCookie } from '../../utils/session'
import { getDbSession, refreshSession, getSessionIdFromCookie, deleteSessionCookie, getUserRoles } from '../../utils/session'
import { queryOne, execute, query } from '../../utils/db'
/**
* 현재 로그인 사용자 정보
* 현재 로그인 사용자 정보 (권한 포함)
* GET /api/auth/current-user
*/
export default defineEventHandler(async (event) => {
@@ -43,12 +44,16 @@ export default defineEventHandler(async (event) => {
`, [session.loginHistoryId])
}
// 사용자 권한 조회
const roles = await getUserRoles(employee.employee_id)
return {
user: {
employeeId: employee.employee_id,
employeeName: employee.employee_name,
employeeEmail: employee.employee_email,
employeePosition: employee.employee_position
employeePosition: employee.employee_position,
roles // 권한 코드 배열 추가
}
}
})

View File

@@ -28,7 +28,11 @@ export default defineEventHandler(async (event) => {
employee_position,
company,
join_date,
is_active
is_active,
created_at,
created_ip,
updated_at,
updated_ip
FROM wr_employee_info
WHERE employee_id = $1
`, [session.employeeId])
@@ -46,7 +50,11 @@ export default defineEventHandler(async (event) => {
employeePosition: employee.employee_position,
company: employee.company,
joinDate: employee.join_date,
isActive: employee.is_active
isActive: employee.is_active,
createdAt: employee.created_at,
createdIp: employee.created_ip,
updatedAt: employee.updated_at,
updatedIp: employee.updated_ip
}
}
})

View File

@@ -0,0 +1,80 @@
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 }
})