import { z } from 'zod'; // --- Payment Settings --- export const updatePaymentSettingsSchema = z.object({ stripeSecretKey: z.string().max(500).optional(), stripePublishableKey: z.string().max(500).optional(), stripeWebhookSecret: z.string().max(500).optional(), defaultCurrency: z.string().min(3).max(3).optional(), enableDonations: z.boolean().optional(), donationSuggestedAmounts: z.array(z.number().int().min(100)).optional(), donationMinimum: z.number().int().min(100).optional(), donationPageTitle: z.string().max(200).optional(), donationPageDescription: z.string().max(2000).nullable().optional(), thankYouMessage: z.string().max(2000).optional(), }); export type UpdatePaymentSettingsInput = z.infer; // --- Subscription Plans --- export const createPlanSchema = z.object({ name: z.string().min(1).max(100), priceCAD: z.number().int().min(0), durationDays: z.number().int().min(1), yearlyPriceCAD: z.number().int().min(0).nullable().optional(), features: z.array(z.string()).optional(), description: z.string().max(2000).nullable().optional(), tier: z.number().int().min(0).optional(), displayOrder: z.number().int().min(0).optional(), isActive: z.boolean().optional(), coverPhoto: z.string().max(1000).nullable().optional(), coverVideoId: z.number().int().positive().nullable().optional(), richDescription: z.string().max(50000).nullable().optional(), ctaText: z.string().max(200).nullable().optional(), ctaSubtext: z.string().max(500).nullable().optional(), highlightPlan: z.boolean().optional(), }); export const updatePlanSchema = createPlanSchema.partial(); export const listPlansSchema = z.object({ page: z.coerce.number().int().min(1).default(1), limit: z.coerce.number().int().min(1).max(100).default(20), search: z.string().optional(), isActive: z.enum(['true', 'false']).optional(), }); // --- Subscribe --- export const createSubscriptionCheckoutSchema = z.object({ planId: z.number().int(), frequency: z.enum(['monthly', 'yearly']).default('monthly'), }); // --- Products --- export const createProductSchema = z.object({ title: z.string().min(1).max(200), slug: z.string().min(1).max(200).regex(/^[a-z0-9-]+$/), description: z.string().max(5000).nullable().optional(), priceCAD: z.number().int().min(0), type: z.enum(['DIGITAL', 'EVENT', 'DONATION']), isActive: z.boolean().optional(), imageUrl: z.string().url().nullable().optional().or(z.literal('')), photoId: z.number().int().positive().nullable().optional(), videoId: z.number().int().positive().nullable().optional(), galleryPhotoIds: z.array(z.number().int().positive()).nullable().optional(), downloadUrl: z.string().max(1000).nullable().optional(), metadata: z.record(z.unknown()).nullable().optional(), maxPurchases: z.number().int().min(1).nullable().optional(), }); export const updateProductSchema = createProductSchema.partial(); // --- Product Checkout --- export const createProductCheckoutSchema = z.object({ productId: z.string(), buyerEmail: z.string().email(), buyerName: z.string().max(200).optional(), }); // --- Donation --- export const createDonationCheckoutSchema = z.object({ amountCents: z.number().int().min(100).max(10000000), // max $100,000 email: z.string().email(), name: z.string().max(200).optional(), message: z.string().max(2000).optional(), isAnonymous: z.boolean().optional(), campaignId: z.string().optional(), }); // --- Refund --- export const refundDonationSchema = z.object({ reason: z.string().max(500).optional(), }); // --- Admin filters --- export const subscriptionFiltersSchema = z.object({ page: z.coerce.number().int().min(1).default(1), limit: z.coerce.number().int().min(1).max(100).default(20), status: z.enum(['active', 'cancelled', 'grace_period', 'delinquent', 'none', 'lifetime']).optional(), planId: z.coerce.number().int().optional(), search: z.string().optional(), }); export const orderFiltersSchema = z.object({ page: z.coerce.number().int().min(1).default(1), limit: z.coerce.number().int().min(1).max(100).default(20), status: z.enum(['PENDING', 'COMPLETED', 'FAILED', 'REFUNDED', 'DISPUTED']).optional(), type: z.enum(['product', 'donation']).optional(), search: z.string().optional(), });