llzai's picture
Upload 1793 files
9853396 verified
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<typeof userStatusSchema>;
// Project-level user schema - includes project-specific information
export const projectUserSchema = z.object({
id: z.string(),
userID: z.string(),
projectID: z.string(),
isOwner: z.boolean(),
scopes: z.array(z.string()).optional().nullable(),
user: 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(),
roles: z
.object({
edges: z.array(
z.object({
node: z.object({
id: z.string(),
name: z.string(),
code: z.string().optional(),
level: z.string().optional(),
}),
})
),
})
.optional(),
}),
});
// Combined schema for display - flattens user and project info
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(),
projectUserId: z.string().optional(), // ID of the project_user relationship
roles: z
.object({
edges: z.array(
z.object({
node: z.object({
id: z.string(),
name: z.string(),
code: z.string().optional(),
level: z.string().optional(),
}),
})
),
})
.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 ProjectUser = z.infer<typeof projectUserSchema>;
export type User = z.infer<typeof userSchema>;
export type UserConnection = z.infer<typeof userConnectionSchema>;
export type CreateUserForm = z.infer<typeof createUserFormSchema>;
export type CreateUserInput = z.infer<typeof createUserInputSchema>;
export type UpdateUserInput = z.infer<typeof updateUserInputSchema>;
export type ChangePasswordForm = z.infer<ReturnType<typeof changePasswordFormSchema>>;
export type ChangePasswordInput = z.infer<typeof changePasswordInputSchema>;
// User List schema for table display
export const userListSchema = z.array(userSchema);
export type UserList = z.infer<typeof userListSchema>;