diff --git a/server/utils/schemas.js b/server/utils/schemas.js index 464f77c..0444622 100644 --- a/server/utils/schemas.js +++ b/server/utils/schemas.js @@ -163,15 +163,17 @@ export const seriesTicketEligibilitySchema = z.object({ // --- Admin schemas --- +const emptyStringToUndefined = (v) => (v === '' ? undefined : v) + export const adminEventCreateSchema = z.object({ title: z.string().min(1).max(500), description: z.string().min(1).max(50000), startDate: z.string().min(1), endDate: z.string().min(1), location: z.string().max(500).optional(), - maxAttendees: z.number().int().positive().optional(), + maxAttendees: z.preprocess(emptyStringToUndefined, z.number().int().positive().optional().nullable()), membersOnly: z.boolean().optional(), - registrationDeadline: z.string().optional(), + registrationDeadline: z.preprocess(emptyStringToUndefined, z.string().optional().nullable()), pricing: z.object({ paymentRequired: z.boolean().optional(), isFree: z.boolean().optional() @@ -183,16 +185,16 @@ export const adminEventCreateSchema = z.object({ name: z.string().max(200).optional(), description: z.string().max(2000).optional(), price: z.number().min(0).optional(), - quantity: z.number().int().positive().optional(), - earlyBirdPrice: z.number().min(0).optional(), - earlyBirdDeadline: z.string().optional() + quantity: z.preprocess(emptyStringToUndefined, z.number().int().positive().optional().nullable()), + earlyBirdPrice: z.preprocess(emptyStringToUndefined, z.number().min(0).optional().nullable()), + earlyBirdDeadline: z.preprocess(emptyStringToUndefined, z.string().optional().nullable()) }).optional() }).optional(), - image: z.string().url().optional(), + image: z.string().url().optional().nullable(), category: z.string().max(100).optional(), tags: z.array(z.string().max(100)).max(20).optional(), - series: z.string().optional() -}) + series: z.any().optional() +}).passthrough() export const adminEventUpdateSchema = z.object({ title: z.string().min(1).max(500), @@ -200,9 +202,9 @@ export const adminEventUpdateSchema = z.object({ startDate: z.string().min(1), endDate: z.string().min(1), location: z.string().max(500).optional(), - maxAttendees: z.number().int().positive().optional().nullable(), + maxAttendees: z.preprocess(emptyStringToUndefined, z.number().int().positive().optional().nullable()), membersOnly: z.boolean().optional(), - registrationDeadline: z.string().optional().nullable(), + registrationDeadline: z.preprocess(emptyStringToUndefined, z.string().optional().nullable()), pricing: z.object({ paymentRequired: z.boolean().optional(), isFree: z.boolean().optional(), @@ -215,10 +217,10 @@ export const adminEventUpdateSchema = z.object({ name: z.string().max(200).optional(), description: z.string().max(2000).optional(), price: z.number().min(0).optional(), - quantity: z.number().int().positive().optional().nullable(), + quantity: z.preprocess(emptyStringToUndefined, z.number().int().positive().optional().nullable()), sold: z.number().int().min(0).optional(), - earlyBirdPrice: z.number().min(0).optional().nullable(), - earlyBirdDeadline: z.string().optional().nullable() + earlyBirdPrice: z.preprocess(emptyStringToUndefined, z.number().min(0).optional().nullable()), + earlyBirdDeadline: z.preprocess(emptyStringToUndefined, z.string().optional().nullable()) }).optional() }).optional(), image: z.string().url().optional().nullable(),