cal.pub0.org/lib/validations/user.ts

63 lines
2.6 KiB
TypeScript

import { withValidation } from "next-validations";
import { schemaEventType } from "./eventType";
// import { schemaCredential } from "./credential";
// import { schemaMembership } from "./membership";
// import { schemaBooking } from "./booking";
// import { schemaSchedule } from "./schedule";
// import { schemaSelectedCalendar } from "./selectedCalendar";
// import { schemaAvailability } from "./availability";
// import { schemaWebhook } from "./webhook";
import { z } from "zod";
import { schemaApiKey } from "./apiKey";
const schemaUser = z
.object({
username: z.string().min(3),
name: z.string().min(3),
email: z.string().email(), // max is a full day.
emailVerified: z.date().optional(),
password: z.string().optional(),
bio: z.string().min(3).optional(),
avatar: z.string().optional(),
timeZone: z.string().default("Europe/London"),
weekStart: z.string().default("Sunday"),
bufferTime: z.number().default(0),
hideBranding: z.boolean().default(false),
theme: z.string().optional(),
trialEndsAt: z.date().optional(),
eventTypes: z.array((schemaEventType)).optional(),
// credentials: z.array((schemaCredentials)).optional(),
// teams: z.array((schemaMembership)).optional(),
// bookings: z.array((schemaBooking)).optional(),
// schedules: z.array((schemaSchedule)).optional(),
defaultScheduleId: z.number().optional(),
// selectedCalendars: z.array((schemaSelectedCalendar)).optional(),
completedOnboarding: z.boolean().default(false),
locale: z.string().optional(),
timeFormat: z.number().optional().default(12),
twoFactorEnabled: z.boolean().default(false),
twoFactorSecret: z.string().optional(),
identityProvider: z.enum(["CAL", "SAML", "GOOGLE"]).optional().default("CAL"),
identityProviderId: z.string().optional(),
// availavility: z.array((schemaAvailavility)).optional(),
invitedTo: z.number().optional(),
plan: z.enum(['FREE', 'TRIAL', 'PRO']).default("TRIAL"),
// webhooks: z.array((schemaWebhook)).optional(),
brandColor: z.string().default("#292929"),
darkBrandColor: z.string().default("#fafafa"),
// destinationCalendar: z.instanceof(schemaEventType).optional(), // FIXME: instanceof doesnt work here
away: z.boolean().default(false),
metadata: z.object({}).optional(),
verified: z.boolean().default(false),
apiKeys: z.array((schemaApiKey)).optional(),
})
.strict(); // Adding strict so that we can disallow passing in extra fields
const withValidUser = withValidation({
schema: schemaUser,
type: "Zod",
mode: "body",
});
export { schemaUser, withValidUser };