diff --git a/backend/src/models/training.model.ts b/backend/src/models/training.model.ts index 894514b..2431b66 100644 --- a/backend/src/models/training.model.ts +++ b/backend/src/models/training.model.ts @@ -133,7 +133,7 @@ export interface MemberParticipationStats { // Zod validation schemas — used in service layer and route middleware // --------------------------------------------------------------------------- -export const CreateUebungSchema = z.object({ +const UebungBaseSchema = z.object({ titel: z .string() .min(3, 'Titel muss mindestens 3 Zeichen haben') @@ -153,7 +153,9 @@ export const CreateUebungSchema = z.object({ pflichtveranstaltung: z.boolean().default(false), mindest_teilnehmer: z.number().int().positive().optional().nullable(), max_teilnehmer: z.number().int().positive().optional().nullable(), -}).refine( +}); + +export const CreateUebungSchema = UebungBaseSchema.refine( (d) => d.datum_bis >= d.datum_von, { message: 'datum_bis muss nach datum_von liegen', path: ['datum_bis'] } ).refine( @@ -166,9 +168,16 @@ export const CreateUebungSchema = z.object({ export type CreateUebungData = z.infer; -export const UpdateUebungSchema = CreateUebungSchema.partial().extend({ - // All fields optional on update, but retain type narrowing -}); +export const UpdateUebungSchema = UebungBaseSchema.partial().refine( + (d) => d.datum_bis == null || d.datum_von == null || d.datum_bis >= d.datum_von, + { message: 'datum_bis muss nach datum_von liegen', path: ['datum_bis'] } +).refine( + (d) => + d.max_teilnehmer == null || + d.mindest_teilnehmer == null || + d.max_teilnehmer >= d.mindest_teilnehmer, + { message: 'max_teilnehmer muss >= mindest_teilnehmer sein', path: ['max_teilnehmer'] } +); export type UpdateUebungData = z.infer;