import { error, fail, redirect } from '@sveltejs/kit'; import { createApiClient } from '$lib/api.server'; import { getErrorMessage } from '$lib/errors'; import { normalizePersonType, validatePersonFields, resolveValidationMessage } from '$lib/person-validation'; export async function load({ locals }: { locals: App.Locals }) { const canWrite = locals.user?.groups?.some((g: { permissions: string[] }) => g.permissions.includes('WRITE_ALL') ) ?? false; if (!canWrite) throw error(403, 'Forbidden'); } export const actions = { default: async ({ request, fetch }) => { const formData = await request.formData(); const personType = normalizePersonType(formData.get('personType')?.toString()); const title = formData.get('title')?.toString().trim() || undefined; const firstName = formData.get('firstName')?.toString().trim(); const lastName = formData.get('lastName')?.toString().trim(); const alias = formData.get('alias')?.toString().trim() || undefined; const birthYearStr = formData.get('birthYear')?.toString().trim(); const deathYearStr = formData.get('deathYear')?.toString().trim(); const notes = formData.get('notes')?.toString().trim() || undefined; const validationKey = validatePersonFields(personType, firstName, lastName); if (validationKey) { return fail(400, { error: resolveValidationMessage(validationKey), personType, title, firstName: firstName ?? '', lastName: lastName ?? '', alias }); } const birthYear = birthYearStr ? parseInt(birthYearStr, 10) : undefined; const deathYear = deathYearStr ? parseInt(deathYearStr, 10) : undefined; const api = createApiClient(fetch); const result = await api.POST('/api/persons', { body: { personType, ...(title ? { title } : {}), ...(firstName ? { firstName } : {}), lastName: lastName!, ...(alias ? { alias } : {}), ...(birthYear ? { birthYear } : {}), ...(deathYear ? { deathYear } : {}), ...(notes ? { notes } : {}) } }); if (!result.response.ok) { const code = (result.error as unknown as { code?: string })?.code; return fail(result.response.status, { error: getErrorMessage(code), personType, title, firstName, lastName: lastName!, alias }); } throw redirect(303, `/persons/${result.data!.id}`); } };