import { z } from 'zod' // ================================ // Enums // ================================ export const ProjectStatusEnum = z.enum(['ACTIVE', 'ARCHIVED']) export const LinkTypeEnum = z.enum(['WEBSITE', 'GITHUB', 'HUGGINGFACE', 'PAPER']) // ================================ // Base Schemas // ================================ export const ExternalLinkSchema = z.object({ type: LinkTypeEnum, url: z.string().url('Invalid URL format'), title: z.string().max(200).optional() }) export const TagSchema = z.object({ name: z.string().min(1).max(50), nameEn: z.string().max(50).optional() }) // ================================ // Project Schemas // ================================ export const ProjectBaseSchema = z.object({ name: z.string().min(1).max(200), nameEn: z.string().max(200).optional(), description: z.string().min(10).max(500), descriptionEn: z.string().max(500).optional(), content: z.string().max(10000).optional(), contentEn: z.string().max(10000).optional(), status: ProjectStatusEnum.default('ACTIVE'), source: z.string().max(100).optional() }) export const ProjectInputSchema = ProjectBaseSchema.extend({ tags: z.array(TagSchema).min(1, 'At least one tag is required').max(10), links: z.array(ExternalLinkSchema).min(1, 'At least one link is required').max(10) }) // ================================ // Webhook Schemas // ================================ export const WebhookAuthSchema = z.object({ apiKey: z.string().min(32, 'Invalid API key format') }) export const WebhookPayloadSchema = WebhookAuthSchema.extend({ projects: z.array(ProjectInputSchema).min(1).max(100) }) // ================================ // Query Schemas // ================================ export const ProjectQuerySchema = z.object({ search: z.string().max(100).optional(), tags: z.array(z.string()).optional(), status: ProjectStatusEnum.optional(), page: z.coerce.number().int().positive().default(1), limit: z.coerce.number().int().positive().max(100).default(20) }) // ================================ // Types // ================================ export type ExternalLink = z.infer export type Tag = z.infer export type ProjectInput = z.infer export type WebhookPayload = z.infer export type ProjectQuery = z.infer