All checks were successful
CI / Unit & Component Tests (push) Successful in 1m49s
CI / Backend Unit Tests (push) Successful in 2m14s
CI / E2E Tests (push) Successful in 17m50s
CI / Unit & Component Tests (pull_request) Successful in 1m49s
CI / Backend Unit Tests (pull_request) Successful in 2m9s
CI / E2E Tests (pull_request) Successful in 16m37s
V5 Flyway migration adds TEXT notes column; Person entity, service, and controller updated to persist notes. Frontend edit form adds textarea and view mode renders the notes section. Backed by 2 new service unit tests (persist + blank clears). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
71 lines
2.4 KiB
TypeScript
71 lines
2.4 KiB
TypeScript
import { error, fail, redirect } from '@sveltejs/kit';
|
|
import { createApiClient } from '$lib/api.server';
|
|
import { getErrorMessage } from '$lib/errors';
|
|
|
|
export async function load({ params, fetch }) {
|
|
const { id } = params;
|
|
const api = createApiClient(fetch);
|
|
|
|
const [personResult, docsResult] = await Promise.all([
|
|
api.GET('/api/persons/{id}', { params: { path: { id } } }),
|
|
api.GET('/api/persons/{id}/documents', { params: { path: { id } } })
|
|
]);
|
|
|
|
if (!personResult.response.ok) {
|
|
const code = (personResult.error as unknown as { code?: string })?.code;
|
|
throw error(personResult.response.status, getErrorMessage(code));
|
|
}
|
|
|
|
return {
|
|
person: personResult.data!,
|
|
documents: docsResult.data ?? []
|
|
};
|
|
}
|
|
|
|
export const actions = {
|
|
update: async ({ request, params, fetch }) => {
|
|
const formData = await request.formData();
|
|
const firstName = formData.get('firstName')?.toString().trim();
|
|
const lastName = formData.get('lastName')?.toString().trim();
|
|
const alias = formData.get('alias')?.toString().trim() || undefined;
|
|
const notes = formData.get('notes')?.toString().trim() || undefined;
|
|
|
|
if (!firstName || !lastName) {
|
|
return fail(400, { updateError: 'Vor- und Nachname sind Pflichtfelder.' });
|
|
}
|
|
|
|
const api = createApiClient(fetch);
|
|
const { error: apiError } = await api.PUT('/api/persons/{id}', {
|
|
params: { path: { id: params.id } },
|
|
body: { firstName, lastName, ...(alias ? { alias } : {}), ...(notes ? { notes } : {}) }
|
|
});
|
|
|
|
if (apiError) {
|
|
return fail(400, { updateError: 'Speichern fehlgeschlagen.' });
|
|
}
|
|
|
|
return { updated: true };
|
|
},
|
|
|
|
merge: async ({ request, params, fetch }) => {
|
|
const formData = await request.formData();
|
|
const targetPersonId = formData.get('targetPersonId')?.toString();
|
|
|
|
if (!targetPersonId) {
|
|
return fail(400, { mergeError: 'Bitte eine Zielperson auswählen.' });
|
|
}
|
|
|
|
const api = createApiClient(fetch);
|
|
const { error: apiError } = await api.POST('/api/persons/{id}/merge', {
|
|
params: { path: { id: params.id } },
|
|
body: { targetPersonId }
|
|
});
|
|
|
|
if (apiError) {
|
|
return fail(400, { mergeError: 'Zusammenführen fehlgeschlagen.' });
|
|
}
|
|
|
|
throw redirect(303, `/persons/${targetPersonId}`);
|
|
}
|
|
};
|