Files
motovaultpro/backend/src/features/admin/api/users.validation.ts
T
2025-12-21 19:56:52 -06:00

58 lines
2.1 KiB
TypeScript

/**
* @ai-summary Request validation schemas for admin user management API
* @ai-context Uses Zod for runtime validation and type safety
*/
import { z } from 'zod';
// Subscription tier enum
export const subscriptionTierSchema = z.enum(['free', 'pro', 'enterprise']);
// Query params for listing users
export const listUsersQuerySchema = z.object({
page: z.coerce.number().min(1).default(1),
pageSize: z.coerce.number().min(1).max(100).default(20),
search: z.string().optional(),
tier: subscriptionTierSchema.optional(),
status: z.enum(['active', 'deactivated', 'all']).default('all'),
sortBy: z.enum(['email', 'createdAt', 'displayName', 'subscriptionTier']).default('createdAt'),
sortOrder: z.enum(['asc', 'desc']).default('desc'),
});
// Path param for user auth0Sub
export const userAuth0SubSchema = z.object({
auth0Sub: z.string().min(1, 'auth0Sub is required'),
});
// Body for updating subscription tier
export const updateTierSchema = z.object({
subscriptionTier: subscriptionTierSchema,
});
// Body for deactivating a user
export const deactivateUserSchema = z.object({
reason: z.string().max(500).optional(),
});
// Body for updating user profile (admin edit)
export const updateProfileSchema = z.object({
email: z.string().email('Invalid email address').optional(),
displayName: z.string().max(100, 'Display name must be 100 characters or less').optional(),
}).refine(
(data) => data.email !== undefined || data.displayName !== undefined,
{ message: 'At least one field (email or displayName) must be provided' }
);
// Body for promoting user to admin
export const promoteToAdminSchema = z.object({
role: z.enum(['admin', 'super_admin']).default('admin'),
});
// Type exports
export type ListUsersQueryInput = z.infer<typeof listUsersQuerySchema>;
export type UserAuth0SubInput = z.infer<typeof userAuth0SubSchema>;
export type UpdateTierInput = z.infer<typeof updateTierSchema>;
export type DeactivateUserInput = z.infer<typeof deactivateUserSchema>;
export type UpdateProfileInput = z.infer<typeof updateProfileSchema>;
export type PromoteToAdminInput = z.infer<typeof promoteToAdminSchema>;