import { z } from 'zod'; import { pageInfoSchema } from '@/gql/pagination'; import { passwordSchema } from '@/lib/validation'; export const userStatusSchema = z.enum(['activated', 'deactivated']); export type UserStatus = z.infer; export const userSchema = z.object({ id: z.string(), createdAt: z.string(), updatedAt: z.string(), email: z.string(), status: userStatusSchema, preferLanguage: z.string().optional(), firstName: z.string().optional(), lastName: z.string().optional(), isOwner: z.boolean().optional(), scopes: z.array(z.string()).optional().nullable(), roles: z .object({ edges: z.array( z.object({ node: z.object({ id: z.string(), name: z.string(), }), }) ), }) .optional(), }); export const userConnectionSchema = z.object({ edges: z.array( z.object({ node: userSchema, }) ), pageInfo: pageInfoSchema, }); // 前端表单验证模式(包含 confirmPassword) export const createUserFormSchema = z .object({ createdAt: z.string().optional(), updatedAt: z.string().optional(), email: z.email('Invalid email address'), firstName: z.string().optional(), lastName: z.string().optional(), password: z.string().min(6, 'Password must be at least 6 characters'), confirmPassword: z.string(), isOwner: z.boolean().optional(), scopes: z.array(z.string()).optional(), roleIDs: z.array(z.string()).optional(), }) .refine((data) => data.password === data.confirmPassword, { message: "Passwords don't match", path: ['confirmPassword'], }); // API 输入模式(不包含 confirmPassword) export const createUserInputSchema = z.object({ createdAt: z.string().optional(), updatedAt: z.string().optional(), email: z.string().email('Invalid email address'), firstName: z.string().optional(), lastName: z.string().optional(), password: z.string().min(6, 'Password must be at least 6 characters'), isOwner: z.boolean().optional(), scopes: z.array(z.string()).optional(), roleIDs: z.array(z.string()).optional(), }); // 修改密码的前端表单模式 export const changePasswordFormSchema = (t: (key: string) => string) => z .object({ newPassword: passwordSchema(t), confirmPassword: z.string(), }) .refine((data) => data.newPassword === data.confirmPassword, { message: t('users.validation.passwordsNotMatch'), path: ['confirmPassword'], }); // 修改密码的 API 输入模式 export const changePasswordInputSchema = z.object({ newPassword: z.string().min(6, 'Password must be at least 6 characters'), }); export const updateUserInputSchema = z.object({ updatedAt: z.string().optional(), email: z.string().email('Invalid email address').optional(), firstName: z.string().optional(), lastName: z.string().optional(), isOwner: z.boolean().optional(), scopes: z.array(z.string()).optional(), appendScopes: z.array(z.string()).optional(), clearScopes: z.boolean().optional(), addRoleIDs: z.array(z.string()).optional(), removeRoleIDs: z.array(z.string()).optional(), clearRoles: z.boolean().optional(), }); export type User = z.infer; export type UserConnection = z.infer; export type CreateUserForm = z.infer; export type CreateUserInput = z.infer; export type UpdateUserInput = z.infer; export type ChangePasswordForm = z.infer>; export type ChangePasswordInput = z.infer; // User List schema for table display export const userListSchema = z.array(userSchema); export type UserList = z.infer;