/** * Subscriptions Domain - Schemas * * Zod validation schemas for subscription domain types. */ import { z } from "zod"; // Subscription Status Schema export const subscriptionStatusSchema = z.enum([ "Active", "Inactive", "Pending", "Cancelled", "Suspended", "Terminated", "Completed", ]); // Subscription Cycle Schema export const subscriptionCycleSchema = z.enum([ "Monthly", "Quarterly", "Semi-Annually", "Annually", "Biennially", "Triennially", "One-time", "Free", ]); // Subscription Schema export const subscriptionSchema = z.object({ id: z.number().int().positive("Subscription id must be positive"), serviceId: z.number().int().positive("Service id must be positive"), productName: z.string().min(1, "Product name is required"), domain: z.string().optional(), cycle: subscriptionCycleSchema, status: subscriptionStatusSchema, nextDue: z.string().optional(), amount: z.number(), currency: z.string().min(1, "Currency is required"), currencySymbol: z.string().optional(), registrationDate: z.string().min(1, "Registration date is required"), notes: z.string().optional(), customFields: z.record(z.string(), z.string()).optional(), orderNumber: z.string().optional(), groupName: z.string().optional(), paymentMethod: z.string().optional(), serverName: z.string().optional(), }); // Subscription List Schema export const subscriptionListSchema = z.object({ subscriptions: z.array(subscriptionSchema), totalCount: z.number().int().nonnegative(), }); // ============================================================================ // Query Parameter Schemas // ============================================================================ /** * Schema for subscription query parameters */ export const subscriptionQueryParamsSchema = z.object({ page: z.coerce.number().int().positive().optional(), limit: z.coerce.number().int().positive().max(100).optional(), status: subscriptionStatusSchema.optional(), type: z.string().optional(), }); export type SubscriptionQueryParams = z.infer; export const subscriptionQuerySchema = subscriptionQueryParamsSchema; export type SubscriptionQuery = SubscriptionQueryParams; // ============================================================================ // Inferred Types from Schemas (Schema-First Approach) // ============================================================================ export type SubscriptionStatus = z.infer; export type SubscriptionCycle = z.infer; export type Subscription = z.infer; export type SubscriptionList = z.infer;