63 lines
2.6 KiB
TypeScript
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 };
|