feat: Add username uniqueness check during user registration
- commit
- 596c40cf4064b1aeb7bfa2e94faf792961061c58
- author
- Kit · · 2025-02-17 07:09 UTC
- parent
- ff2a41e
- signature
- SSH Unverified
SHA256:H91DFuEG4jpk5edzLA4aUKkpv4zv9Q339ipRmkph6TkThe key is unknown
1 file · +8 -0
M src/routes/api/register/+server.ts +8 -0
| @@ -5,6 +5,7 @@ import { users } from '$lib/db/schema'; | |||
| 5 | 5 | import { hashPassword } from '$lib/utils/password'; | |
| 6 | 6 | import { validateTurnstileToken } from '$lib/utils/turnstile.server'; | |
| 7 | 7 | import { createLogger } from '$lib/utils/logger.server'; | |
| 8 | + | import { eq } from 'drizzle-orm'; | |
| 8 | 9 | ||
| 9 | 10 | const log = createLogger('register-server'); | |
| 10 | 11 | ||
| @@ -122,6 +123,13 @@ export const POST: RequestHandler = async ({ request }) => { | |||
| 122 | 123 | return new Response(JSON.stringify({ error: 'Password must be between 8 and 64 characters' } as RegisterResponseError), { status: 400 }); | |
| 123 | 124 | } | |
| 124 | 125 | ||
| 126 | + | // Check if nickname already exists | |
| 127 | + | const existingUser = await db.select().from(users).where(eq(users.nickname, username)); | |
| 128 | + | if (existingUser.length > 0) { | |
| 129 | + | log.warn('Username already exists', { username }); | |
| 130 | + | return new Response(JSON.stringify({ error: 'This username is already taken' } as RegisterResponseError), { status: 409 }); | |
| 131 | + | } | |
| 132 | + | ||
| 125 | 133 | // Securely hash the user's password. | |
| 126 | 134 | let hashedPassword: string; | |
| 127 | 135 | try { | |
| @@ -5,6 +5,7 @@ import { users } from '$lib/db/schema'; | |||||
| 5 | import { hashPassword } from '$lib/utils/password'; | 5 | import { hashPassword } from '$lib/utils/password'; | ||
| 6 | import { validateTurnstileToken } from '$lib/utils/turnstile.server'; | 6 | import { validateTurnstileToken } from '$lib/utils/turnstile.server'; | ||
| 7 | import { createLogger } from '$lib/utils/logger.server'; | 7 | import { createLogger } from '$lib/utils/logger.server'; | ||
| 8 | + | import { eq } from 'drizzle-orm'; | |||
| 8 | 9 | ||||
| 9 | const log = createLogger('register-server'); | 10 | const log = createLogger('register-server'); | ||
| 10 | 11 | ||||
| @@ -122,6 +123,13 @@ export const POST: RequestHandler = async ({ request }) => { | |||||
| 122 | return new Response(JSON.stringify({ error: 'Password must be between 8 and 64 characters' } as RegisterResponseError), { status: 400 }); | 123 | return new Response(JSON.stringify({ error: 'Password must be between 8 and 64 characters' } as RegisterResponseError), { status: 400 }); | ||
| 123 | } | 124 | } | ||
| 124 | 125 | ||||
| 126 | + | // Check if nickname already exists | |||
| 127 | + | const existingUser = await db.select().from(users).where(eq(users.nickname, username)); | |||
| 128 | + | if (existingUser.length > 0) { | |||
| 129 | + | log.warn('Username already exists', { username }); | |||
| 130 | + | return new Response(JSON.stringify({ error: 'This username is already taken' } as RegisterResponseError), { status: 409 }); | |||
| 131 | + | } | |||
| 132 | + | ||||
| 125 | // Securely hash the user's password. | 133 | // Securely hash the user's password. | ||
| 126 | let hashedPassword: string; | 134 | let hashedPassword: string; | ||
| 127 | try { | 135 | try { | ||