62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import * as z from 'zod';
|
|
|
|
import {
|
|
apiError,
|
|
apiSuccess,
|
|
emailSchema,
|
|
requiredString,
|
|
} from '@kit/next/route-helpers';
|
|
import { getLogger } from '@kit/shared/logger';
|
|
import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client';
|
|
|
|
const CourseRegisterSchema = z.object({
|
|
courseId: requiredString('Kurs-ID'),
|
|
firstName: requiredString('Vorname'),
|
|
lastName: requiredString('Nachname'),
|
|
email: emailSchema,
|
|
phone: z.string().optional(),
|
|
});
|
|
|
|
export async function POST(request: Request) {
|
|
const logger = await getLogger();
|
|
|
|
try {
|
|
const body = await request.json();
|
|
const parsed = CourseRegisterSchema.safeParse(body);
|
|
|
|
if (!parsed.success) {
|
|
return apiError(parsed.error.issues[0]?.message ?? 'Ungültige Eingabe');
|
|
}
|
|
|
|
const { courseId, firstName, lastName, email, phone } = parsed.data;
|
|
|
|
const supabase = getSupabaseServerAdminClient();
|
|
|
|
const { error } = await supabase.from('course_participants').insert({
|
|
course_id: courseId,
|
|
first_name: firstName,
|
|
last_name: lastName,
|
|
email,
|
|
phone: phone || null,
|
|
status: 'enrolled',
|
|
enrolled_at: new Date().toISOString(),
|
|
});
|
|
|
|
if (error) {
|
|
logger.error(
|
|
{ error, context: 'course-register-insert' },
|
|
'[course-register] Insert error',
|
|
);
|
|
return apiError('Anmeldung fehlgeschlagen', 500);
|
|
}
|
|
|
|
return apiSuccess({ message: 'Anmeldung erfolgreich' });
|
|
} catch (err) {
|
|
logger.error(
|
|
{ error: err, context: 'course-register' },
|
|
'[course-register] Error',
|
|
);
|
|
return apiError('Serverfehler', 500);
|
|
}
|
|
}
|