Files
Calbook/lib/validators/public.ts

53 lines
1.7 KiB
TypeScript

import { z } from "zod";
import { isValidTimeZone } from "@/lib/date";
const tokenSchema = z
.string()
.trim()
.regex(/^[a-zA-Z0-9]{32,128}$/, "Token ist ungültig");
const timezoneSchema = z
.string()
.trim()
.min(1)
.max(100)
.refine((value) => isValidTimeZone(value), "Zeitzone ist ungültig");
export const slotsQuerySchema = z.object({
mitarbeiterId: z.string().trim().min(1).max(128).optional(),
datum: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
timezone: timezoneSchema.optional()
});
export const monthSlotsQuerySchema = z
.object({
mitarbeiterId: z.string().trim().min(1).max(128).optional(),
monat: z.string().regex(/^\d{4}-\d{2}$/),
timezone: timezoneSchema.optional(),
requireAll: z
.string()
.trim()
.toLowerCase()
.optional()
.transform((value) => value === "1" || value === "true" || value === "yes")
})
.refine((input) => !(input.requireAll && input.mitarbeiterId), {
message: "mitarbeiterId und requireAll dürfen nicht zusammen genutzt werden"
});
export const createAppointmentSchema = z.object({
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
time: z.string().regex(/^\d{2}:\d{2}$/),
timezone: timezoneSchema.optional(),
mitarbeiterId: z.string().trim().min(1).max(128).optional(),
requireAll: z.boolean().optional(),
rescheduleToken: tokenSchema.optional(),
customerFirstName: z.string().trim().min(1, "Vorname ist erforderlich").max(120),
customerLastName: z.string().trim().min(1, "Nachname ist erforderlich").max(120),
customerEmail: z.string().trim().email("E-Mail ist ungültig").max(320),
customerPhone: z.string().trim().max(64).optional(),
notes: z.string().trim().max(2000).optional()
});
export const cancelSchema = z.object({ token: tokenSchema });