67 lines
1.5 KiB
TypeScript
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
|
|
}
|
|
})
|