import { z } from 'zod'; /** * Core auth entity schemas (PostgreSQL structure) * These define the fundamental auth data models */ // ============================================================================ // Base field schemas // ============================================================================ export const userIdSchema = z.string().uuid('Invalid user ID format'); export const emailSchema = z.string().email('Invalid email format').toLowerCase().trim(); export const passwordSchema = z.string(); export const nameSchema = z .string() .min(1, 'Name is required') .max(100, 'Name must be less than 100 characters') .trim(); export const roleSchema = z.enum(['authenticated', 'project_admin']); export const verificationMethodSchema = z.enum(['code', 'link']); // ============================================================================ // Core entity schemas // ============================================================================ /** * User entity schema - represents the _user table in PostgreSQL */ export const userSchema = z.object({ id: userIdSchema, email: emailSchema, name: nameSchema, emailVerified: z.boolean(), identities: z .array( z.object({ provider: z.string(), }) ) .optional(), providerType: z.string().optional(), createdAt: z.string(), // PostgreSQL timestamp updatedAt: z.string(), // PostgreSQL timestamp }); /** * OAuth state for redirect handling */ export const oAuthProvidersSchema = z.enum([ 'google', 'github', 'discord', 'linkedin', 'facebook', 'instagram', 'tiktok', 'apple', 'x', 'spotify', 'microsoft', ]); export const oAuthStateSchema = z.object({ provider: oAuthProvidersSchema, redirectUri: z.string().url().optional(), }); // OAuth provider configuration schema export const oAuthConfigSchema = z.object({ id: z.string().uuid(), provider: oAuthProvidersSchema, clientId: z.string().optional(), scopes: z.array(z.string()).optional(), redirectUri: z.string().optional(), useSharedKey: z.boolean(), createdAt: z.string(), // PostgreSQL timestamp updatedAt: z.string(), // PostgreSQL timestamp }); // Email authentication configuration schema export const authConfigSchema = z.object({ id: z.string().uuid(), requireEmailVerification: z.boolean(), passwordMinLength: z.number().min(4).max(128), requireNumber: z.boolean(), requireLowercase: z.boolean(), requireUppercase: z.boolean(), requireSpecialChar: z.boolean(), verifyEmailMethod: verificationMethodSchema, resetPasswordMethod: verificationMethodSchema, signInRedirectTo: z .union([z.string().url(), z.literal(''), z.null()]) .optional() .transform((val) => (val === '' ? null : val)), createdAt: z.string(), // PostgreSQL timestamp updatedAt: z.string(), // PostgreSQL timestamp }); /** * JWT token payload schema */ export const tokenPayloadSchema = z.object({ sub: userIdSchema, // Subject (user ID) email: emailSchema, role: roleSchema, iat: z.number().optional(), // Issued at exp: z.number().optional(), // Expiration }); // ============================================================================ // Type exports // ============================================================================ export type UserIdSchema = z.infer; export type EmailSchema = z.infer; export type PasswordSchema = z.infer; export type RoleSchema = z.infer; export type VerificationMethodSchema = z.infer; export type UserSchema = z.infer; export type TokenPayloadSchema = z.infer; export type OAuthConfigSchema = z.infer; export type OAuthProvidersSchema = z.infer; export type AuthConfigSchema = z.infer;