import { PROTECTED_TEAM_URLS } from '@documenso/lib/constants/teams'; import { ZNameSchema } from '@documenso/lib/types/name'; import { zEmail } from '@documenso/lib/utils/zod'; import { TeamMemberRole } from '@prisma/client'; import { z } from 'zod'; /** * Restrict team URLs schema. * * Allowed characters: * - Alphanumeric * - Lowercase * - Dashes * - Underscores * * Conditions: * - 3-30 characters * - Cannot start and end with underscores or dashes. * - Cannot contain consecutive underscores or dashes. * - Cannot be a reserved URL in the PROTECTED_TEAM_URLS list */ export const ZTeamUrlSchema = z .string() .trim() .min(3, { message: 'Team URL must be at least 3 characters long.' }) .max(30, { message: 'Team URL must not exceed 30 characters.' }) .toLowerCase() .regex(/^[a-z0-9].*[^_-]$/, 'Team URL cannot start or end with dashes or underscores.') .regex(/^(?!.*[-_]{2})/, 'Team URL cannot contain consecutive dashes or underscores.') .regex(/^[a-z0-9]+(?:[-_][a-z0-9]+)*$/, 'Team URL can only contain letters, numbers, dashes and underscores.') .refine((value) => !PROTECTED_TEAM_URLS.includes(value), { message: 'This URL is already in use.', }); export const ZCreateTeamEmailVerificationMutationSchema = z.object({ teamId: z.number(), name: ZNameSchema, email: zEmail().trim().toLowerCase().min(1, 'Please enter a valid email.'), }); export const ZDeleteTeamEmailMutationSchema = z.object({ teamId: z.number(), }); export const ZDeleteTeamEmailVerificationMutationSchema = z.object({ teamId: z.number(), }); export const ZGetTeamMembersQuerySchema = z.object({ teamId: z.number(), }); export const ZUpdateTeamEmailMutationSchema = z.object({ teamId: z.number(), data: z.object({ name: ZNameSchema, }), }); export const ZUpdateTeamMemberMutationSchema = z.object({ teamId: z.number(), teamMemberId: z.number(), data: z.object({ role: z.nativeEnum(TeamMemberRole), }), }); export const ZResendTeamEmailVerificationMutationSchema = z.object({ teamId: z.number(), }); export type TCreateTeamEmailVerificationMutationSchema = z.infer; export type TDeleteTeamEmailMutationSchema = z.infer; export type TGetTeamMembersQuerySchema = z.infer; export type TUpdateTeamEmailMutationSchema = z.infer; export type TResendTeamEmailVerificationMutationSchema = z.infer;