v0.1.40 - 관리자 대시보드 기본 구조 추가
This commit is contained in:
@@ -45,6 +45,15 @@ const passwordResetConfirmSchema = z.object({
|
||||
})
|
||||
|
||||
const TOKEN_TTL_MS = 1000 * 60 * 30
|
||||
const adminEmails = new Set(
|
||||
env.ADMIN_EMAILS.split(',')
|
||||
.map((email) => email.trim().toLowerCase())
|
||||
.filter(Boolean),
|
||||
)
|
||||
|
||||
function resolveUserRole(email) {
|
||||
return adminEmails.has(email.toLowerCase()) ? 'admin' : 'user'
|
||||
}
|
||||
|
||||
function buildPreviewUrl(pathname, token) {
|
||||
const url = new URL(pathname, env.APP_BASE_URL)
|
||||
@@ -99,7 +108,9 @@ function sanitizeUser(user) {
|
||||
id: user.id,
|
||||
email: user.email,
|
||||
nickname: user.nickname,
|
||||
role: user.role,
|
||||
emailVerifiedAt: user.emailVerifiedAt,
|
||||
lastLoginAt: user.lastLoginAt,
|
||||
createdAt: user.createdAt,
|
||||
updatedAt: user.updatedAt,
|
||||
}
|
||||
@@ -133,6 +144,7 @@ export async function registerAuthRoutes(app) {
|
||||
|
||||
const now = new Date()
|
||||
const passwordHash = await hashPassword(password)
|
||||
const role = resolveUserRole(normalizedEmail)
|
||||
|
||||
const [user] = await db
|
||||
.insert(users)
|
||||
@@ -140,7 +152,9 @@ export async function registerAuthRoutes(app) {
|
||||
email: normalizedEmail,
|
||||
passwordHash,
|
||||
nickname,
|
||||
role,
|
||||
emailVerifiedAt: null,
|
||||
lastLoginAt: now,
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
})
|
||||
@@ -189,12 +203,25 @@ export async function registerAuthRoutes(app) {
|
||||
})
|
||||
}
|
||||
|
||||
const now = new Date()
|
||||
const role = resolveUserRole(user.email)
|
||||
|
||||
const [updatedUser] = await db
|
||||
.update(users)
|
||||
.set({
|
||||
role,
|
||||
lastLoginAt: now,
|
||||
updatedAt: now,
|
||||
})
|
||||
.where(eq(users.id, user.id))
|
||||
.returning()
|
||||
|
||||
const { token } = await createSession(user.id)
|
||||
|
||||
return {
|
||||
message: '로그인에 성공했습니다.',
|
||||
token,
|
||||
user: sanitizeUser(user),
|
||||
user: sanitizeUser(updatedUser),
|
||||
}
|
||||
})
|
||||
|
||||
@@ -207,6 +234,23 @@ export async function registerAuthRoutes(app) {
|
||||
})
|
||||
}
|
||||
|
||||
const resolvedRole = resolveUserRole(user.email)
|
||||
|
||||
if (user.role !== resolvedRole) {
|
||||
const [updatedUser] = await db
|
||||
.update(users)
|
||||
.set({
|
||||
role: resolvedRole,
|
||||
updatedAt: new Date(),
|
||||
})
|
||||
.where(eq(users.id, user.id))
|
||||
.returning()
|
||||
|
||||
return {
|
||||
user: sanitizeUser(updatedUser),
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
user: sanitizeUser(user),
|
||||
}
|
||||
@@ -249,6 +293,7 @@ export async function registerAuthRoutes(app) {
|
||||
.set({
|
||||
email: normalizedEmail,
|
||||
nickname: payload.data.nickname,
|
||||
role: resolveUserRole(normalizedEmail),
|
||||
updatedAt: new Date(),
|
||||
})
|
||||
.where(eq(users.id, user.id))
|
||||
|
||||
Reference in New Issue
Block a user