doxa-maps-cdn/server/api/profile/name.patch.ts
2026-04-21 12:12:54 +01:00

67 lines
1.5 KiB
TypeScript

import { sql } from 'kysely'
export default defineEventHandler(async (event) => {
// Require authentication
const user = requireAuth(event)
// Get request body
const body = await readBody(event)
const { display_name } = body
// Validate input
if (!display_name || typeof display_name !== 'string') {
throw createError({
statusCode: 400,
statusMessage: 'Display name is required'
})
}
const trimmedName = display_name.trim()
if (trimmedName.length === 0) {
throw createError({
statusCode: 400,
statusMessage: 'Display name cannot be empty'
})
}
if (trimmedName.length > 100) {
throw createError({
statusCode: 400,
statusMessage: 'Display name is too long (max 100 characters)'
})
}
// Update display name in database
const updated = await db
.updateTable('users')
.set({ display_name: trimmedName, updated: sql`now()` })
.where('id', '=', user.userId)
.returning(['id', 'email', 'display_name'])
.executeTakeFirst()
if (!updated) {
throw createError({
statusCode: 404,
statusMessage: 'User not found'
})
}
// Log activity
logEvent({
eventType: 'PROFILE_NAME_UPDATED',
tableName: 'users',
recordId: user.userId,
userId: user.userId,
userAgent: getHeader(event, 'user-agent') || undefined,
metadata: {
old_name: user.display_name,
new_name: trimmedName
}
})
return {
success: true,
user: updated
}
})