111 lines
2.8 KiB
TypeScript
111 lines
2.8 KiB
TypeScript
import { query } from '../../../utils/db'
|
|
import { requireAdmin } from '../../../utils/session'
|
|
|
|
/**
|
|
* 사용자 목록 조회 (권한 정보 + 최근 로그인 포함)
|
|
* GET /api/admin/user/list
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
await requireAdmin(event)
|
|
|
|
const queryParams = getQuery(event)
|
|
const company = queryParams.company as string || ''
|
|
const name = queryParams.name as string || ''
|
|
const email = queryParams.email as string || ''
|
|
const phone = queryParams.phone as string || ''
|
|
const status = queryParams.status as string || 'active' // 기본값: 활성
|
|
|
|
// 1. 사용자 목록 조회 (최근 로그인 포함)
|
|
let userQuery = `
|
|
SELECT
|
|
e.employee_id,
|
|
e.employee_name,
|
|
e.employee_email,
|
|
e.employee_phone,
|
|
e.employee_position,
|
|
e.company,
|
|
e.join_date,
|
|
e.is_active,
|
|
e.created_at,
|
|
(
|
|
SELECT MAX(login_at)
|
|
FROM wr_login_history
|
|
WHERE employee_id = e.employee_id
|
|
) as last_login_at
|
|
FROM wr_employee_info e
|
|
WHERE 1=1
|
|
`
|
|
const params: any[] = []
|
|
|
|
// 소속사 검색
|
|
if (company) {
|
|
params.push(`%${company}%`)
|
|
userQuery += ` AND e.company ILIKE $${params.length}`
|
|
}
|
|
|
|
// 이름 검색
|
|
if (name) {
|
|
params.push(`%${name}%`)
|
|
userQuery += ` AND e.employee_name ILIKE $${params.length}`
|
|
}
|
|
|
|
// 이메일 검색
|
|
if (email) {
|
|
params.push(`%${email}%`)
|
|
userQuery += ` AND e.employee_email ILIKE $${params.length}`
|
|
}
|
|
|
|
// 전화번호 검색
|
|
if (phone) {
|
|
params.push(`%${phone}%`)
|
|
userQuery += ` AND e.employee_phone ILIKE $${params.length}`
|
|
}
|
|
|
|
// 상태 검색
|
|
if (status === 'active') {
|
|
userQuery += ` AND e.is_active = true`
|
|
} else if (status === 'inactive') {
|
|
userQuery += ` AND e.is_active = false`
|
|
}
|
|
// status === 'all' 이면 조건 없음
|
|
|
|
userQuery += ` ORDER BY e.company, e.employee_position, e.employee_name`
|
|
|
|
const users = await query<any>(userQuery, params)
|
|
|
|
// 2. 모든 권한 목록 조회
|
|
const roles = await query<any>(`
|
|
SELECT role_id, role_code, role_name, sort_order
|
|
FROM wr_role
|
|
WHERE is_active = true
|
|
ORDER BY sort_order
|
|
`)
|
|
|
|
// 3. 사용자별 권한 매핑 조회
|
|
const userRoles = await query<any>(`
|
|
SELECT employee_id, role_id
|
|
FROM wr_employee_role
|
|
`)
|
|
|
|
// 4. 사용자별 권한 배열 생성
|
|
const userRoleMap = new Map<number, number[]>()
|
|
for (const ur of userRoles) {
|
|
if (!userRoleMap.has(ur.employee_id)) {
|
|
userRoleMap.set(ur.employee_id, [])
|
|
}
|
|
userRoleMap.get(ur.employee_id)!.push(ur.role_id)
|
|
}
|
|
|
|
// 5. 사용자 데이터에 권한 정보 추가
|
|
const usersWithRoles = users.map(u => ({
|
|
...u,
|
|
roleIds: userRoleMap.get(u.employee_id) || []
|
|
}))
|
|
|
|
return {
|
|
users: usersWithRoles,
|
|
roles,
|
|
total: users.length
|
|
}
|
|
})
|