v0.1.51 - 관리자 사용자 상세 조회 추가
This commit is contained in:
@@ -112,6 +112,89 @@ export async function registerAdminRoutes(app) {
|
||||
}
|
||||
})
|
||||
|
||||
app.get('/api/admin/users/:userId/detail', async (request, reply) => {
|
||||
const adminUser = await requireAdminUser(request, reply)
|
||||
|
||||
if (!adminUser) {
|
||||
return
|
||||
}
|
||||
|
||||
const userIdResult = adminUserIdSchema.safeParse(request.params.userId)
|
||||
|
||||
if (!userIdResult.success) {
|
||||
return reply.code(400).send({
|
||||
message: '대상 사용자 값이 올바르지 않습니다.',
|
||||
})
|
||||
}
|
||||
|
||||
const userId = userIdResult.data
|
||||
|
||||
const detailResult = await db.execute(sql`
|
||||
select
|
||||
u.id,
|
||||
u.nickname,
|
||||
u.email,
|
||||
u.role,
|
||||
u.disabled_at as "disabledAt",
|
||||
u.created_at as "createdAt",
|
||||
u.updated_at as "updatedAt",
|
||||
u.email_verified_at as "emailVerifiedAt",
|
||||
u.last_login_at as "lastLoginAt",
|
||||
count(distinct pe.id)::int as "plannerEntryCount",
|
||||
count(distinct g.id)::int as "goalCount",
|
||||
count(distinct s.id)::int as "activeSessionCount"
|
||||
from users u
|
||||
left join planner_entries pe on pe.user_id = u.id
|
||||
left join goals g on g.user_id = u.id
|
||||
left join auth_sessions s on s.user_id = u.id and s.expires_at > now()
|
||||
where u.id = ${userId}
|
||||
group by u.id
|
||||
limit 1
|
||||
`)
|
||||
|
||||
const detailUser = detailResult.rows[0]
|
||||
|
||||
if (!detailUser) {
|
||||
return reply.code(404).send({
|
||||
message: '대상 사용자를 찾을 수 없습니다.',
|
||||
})
|
||||
}
|
||||
|
||||
const plannerEntriesResult = await db.execute(sql`
|
||||
select
|
||||
entry_date as "entryDate",
|
||||
payload,
|
||||
created_at as "createdAt",
|
||||
updated_at as "updatedAt"
|
||||
from planner_entries
|
||||
where user_id = ${userId}
|
||||
order by entry_date desc
|
||||
limit 12
|
||||
`)
|
||||
|
||||
const goalsResult = await db.execute(sql`
|
||||
select
|
||||
id,
|
||||
title,
|
||||
target_date as "targetDate",
|
||||
active_from as "activeFrom",
|
||||
active_until as "activeUntil",
|
||||
color,
|
||||
created_at as "createdAt",
|
||||
updated_at as "updatedAt"
|
||||
from goals
|
||||
where user_id = ${userId}
|
||||
order by updated_at desc, id desc
|
||||
limit 20
|
||||
`)
|
||||
|
||||
return {
|
||||
user: detailUser,
|
||||
plannerEntries: plannerEntriesResult.rows,
|
||||
goals: goalsResult.rows,
|
||||
}
|
||||
})
|
||||
|
||||
app.put('/api/admin/users/:userId/status', async (request, reply) => {
|
||||
const adminUser = await requireAdminUser(request, reply)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user