이메일 인증 재발송과 관리자 승인 개선

This commit is contained in:
2026-06-25 16:51:29 +09:00
parent 5fbd58bd07
commit a5b7d720d6
26 changed files with 688 additions and 91 deletions

View File

@@ -69,7 +69,8 @@ export function createAdminRouter(db) {
`).get(like, like, like).c;
rows = db.prepare(`
SELECT id, email, username, display_name AS displayName, avatar_url AS avatarUrl,
role, is_active AS isActive, last_login_at AS lastLoginAt,
role, is_active AS isActive, email_verified_at AS emailVerifiedAt,
last_login_at AS lastLoginAt,
created_at AS createdAt, updated_at AS updatedAt
FROM users
WHERE email LIKE ? OR username LIKE ? OR display_name LIKE ?
@@ -79,7 +80,8 @@ export function createAdminRouter(db) {
total = db.prepare('SELECT COUNT(*) AS c FROM users').get().c;
rows = db.prepare(`
SELECT id, email, username, display_name AS displayName, avatar_url AS avatarUrl,
role, is_active AS isActive, last_login_at AS lastLoginAt,
role, is_active AS isActive, email_verified_at AS emailVerifiedAt,
last_login_at AS lastLoginAt,
created_at AS createdAt, updated_at AS updatedAt
FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?
`).all(Number(limit), offset);
@@ -102,7 +104,8 @@ export function createAdminRouter(db) {
router.get('/users/:id', (req, res) => {
const user = db.prepare(`
SELECT id, email, username, display_name AS displayName, avatar_url AS avatarUrl,
role, is_active AS isActive, last_login_at AS lastLoginAt,
role, is_active AS isActive, email_verified_at AS emailVerifiedAt,
last_login_at AS lastLoginAt,
created_at AS createdAt, updated_at AS updatedAt
FROM users WHERE id = ?
`).get(req.params.id);
@@ -210,7 +213,8 @@ export function createAdminRouter(db) {
const updated = db.prepare(`
SELECT id, email, username, display_name AS displayName, avatar_url AS avatarUrl,
role, is_active AS isActive, last_login_at AS lastLoginAt,
role, is_active AS isActive, email_verified_at AS emailVerifiedAt,
last_login_at AS lastLoginAt,
created_at AS createdAt, updated_at AS updatedAt
FROM users WHERE id = ?
`).get(targetId);
@@ -219,6 +223,38 @@ export function createAdminRouter(db) {
res.json({ user: updated });
});
router.post('/users/:id/verify-email', (req, res) => {
const targetId = Number(req.params.id);
const user = db.prepare(`
SELECT id, email_verified_at AS emailVerifiedAt
FROM users WHERE id = ?
`).get(targetId);
if (!user) {
return res.status(404).json({ error: '사용자를 찾을 수 없습니다.' });
}
const verifiedAt = user.emailVerifiedAt || nowIso();
const transaction = db.transaction(() => {
db.prepare(`
UPDATE users
SET email_verified_at = ?, updated_at = ?
WHERE id = ?
`).run(verifiedAt, nowIso(), targetId);
db.prepare(`
UPDATE auth_tokens
SET used_at = ?
WHERE user_id = ? AND type = 'verify_email' AND used_at IS NULL
`).run(nowIso(), targetId);
});
transaction();
res.json({
ok: true,
emailVerifiedAt: verifiedAt,
message: '이메일 인증을 승인했습니다.',
});
});
router.post('/users/:id/reset-password', (req, res) => {
const user = db.prepare('SELECT id FROM users WHERE id = ?').get(req.params.id);
if (!user) {