116 lines
4.0 KiB
TypeScript
116 lines
4.0 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
export const loginSchema = z.object({
|
|
email: z.string().email('Invalid email address'),
|
|
password: z.string().min(1, 'Password is required'),
|
|
})
|
|
|
|
export const registerSchema = z.object({
|
|
email: z.string().email('Invalid email address'),
|
|
password: z
|
|
.string()
|
|
.min(12, 'Password must be at least 12 characters')
|
|
.regex(/[A-Z]/, 'Password must contain at least one uppercase letter')
|
|
.regex(/[a-z]/, 'Password must contain at least one lowercase letter')
|
|
.regex(/[0-9]/, 'Password must contain at least one number')
|
|
.regex(/[^A-Za-z0-9]/, 'Password must contain at least one symbol'),
|
|
name: z.string().min(1, 'Name is required').max(100),
|
|
})
|
|
|
|
export const changePasswordSchema = z.object({
|
|
currentPassword: z.string().min(1, 'Current password is required'),
|
|
newPassword: z
|
|
.string()
|
|
.min(12, 'Password must be at least 12 characters')
|
|
.regex(/[A-Z]/, 'Password must contain at least one uppercase letter')
|
|
.regex(/[a-z]/, 'Password must contain at least one lowercase letter')
|
|
.regex(/[0-9]/, 'Password must contain at least one number')
|
|
.regex(/[^A-Za-z0-9]/, 'Password must contain at least one symbol'),
|
|
})
|
|
|
|
export const productTypeSchema = z.object({
|
|
name: z.string().min(1, 'Name is required').max(100),
|
|
slug: z
|
|
.string()
|
|
.min(1, 'Slug is required')
|
|
.max(100)
|
|
.regex(/^[a-z0-9-]+$/, 'Slug must contain only lowercase letters, numbers, and hyphens'),
|
|
schema: z.record(z.any()),
|
|
})
|
|
|
|
export const productSchema = z.object({
|
|
typeId: z.string().min(1, 'Product type is required'),
|
|
title: z.string().min(1, 'Title is required').max(200),
|
|
slug: z
|
|
.string()
|
|
.min(1, 'Slug is required')
|
|
.max(200)
|
|
.regex(/^[a-z0-9-]+$/, 'Slug must contain only lowercase letters, numbers, and hyphens'),
|
|
description: z.string().min(1, 'Description is required'),
|
|
basePrice: z.number().int().min(0, 'Price must be non-negative'),
|
|
currency: z.string().length(3, 'Currency must be 3 characters'),
|
|
status: z.enum(['DRAFT', 'PUBLISHED', 'ARCHIVED']),
|
|
attributes: z.record(z.any()),
|
|
stock: z.number().int().min(0).nullable().optional(),
|
|
categoryIds: z.array(z.string()).optional(),
|
|
})
|
|
|
|
export const categorySchema = z.object({
|
|
name: z.string().min(1, 'Name is required').max(100),
|
|
slug: z
|
|
.string()
|
|
.min(1, 'Slug is required')
|
|
.max(100)
|
|
.regex(/^[a-z0-9-]+$/, 'Slug must contain only lowercase letters, numbers, and hyphens'),
|
|
parentId: z.string().nullable().optional(),
|
|
})
|
|
|
|
export const reviewSchema = z.object({
|
|
productId: z.string().min(1, 'Product ID is required'),
|
|
rating: z.number().int().min(1).max(5),
|
|
title: z.string().max(200).optional(),
|
|
comment: z.string().max(2000).optional(),
|
|
})
|
|
|
|
export const cartItemSchema = z.object({
|
|
productId: z.string().min(1),
|
|
quantity: z.number().int().min(1).max(100),
|
|
variantId: z.string().optional(),
|
|
})
|
|
|
|
export const checkoutSchema = z.object({
|
|
items: z.array(
|
|
z.object({
|
|
productId: z.string(),
|
|
quantity: z.number().int().min(1),
|
|
variantId: z.string().optional(),
|
|
})
|
|
).min(1, 'Cart is empty'),
|
|
})
|
|
|
|
export const settingSchema = z.object({
|
|
key: z.string().min(1),
|
|
value: z.any(),
|
|
})
|
|
|
|
export const adminUserSchema = z.object({
|
|
email: z.string().email(),
|
|
name: z.string().min(1).max(100),
|
|
role: z.enum(['ADMIN', 'OWNER']),
|
|
password: z
|
|
.string()
|
|
.min(12, 'Password must be at least 12 characters')
|
|
.regex(/[A-Z]/, 'Password must contain at least one uppercase letter')
|
|
.regex(/[a-z]/, 'Password must contain at least one lowercase letter')
|
|
.regex(/[0-9]/, 'Password must contain at least one number')
|
|
.regex(/[^A-Za-z0-9]/, 'Password must contain at least one symbol'),
|
|
})
|
|
|
|
export type LoginInput = z.infer<typeof loginSchema>
|
|
export type RegisterInput = z.infer<typeof registerSchema>
|
|
export type ProductTypeInput = z.infer<typeof productTypeSchema>
|
|
export type ProductInput = z.infer<typeof productSchema>
|
|
export type CategoryInput = z.infer<typeof categorySchema>
|
|
export type ReviewInput = z.infer<typeof reviewSchema>
|
|
export type CheckoutInput = z.infer<typeof checkoutSchema>
|