99 lines
3.2 KiB
TypeScript
99 lines
3.2 KiB
TypeScript
|
|
/**
|
||
|
|
* Catalog Domain - Schemas
|
||
|
|
*
|
||
|
|
* Zod schemas for runtime validation of catalog product data.
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { z } from "zod";
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// Base Catalog Product Schema
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
export const catalogProductBaseSchema = z.object({
|
||
|
|
id: z.string(),
|
||
|
|
sku: z.string(),
|
||
|
|
name: z.string(),
|
||
|
|
description: z.string().optional(),
|
||
|
|
displayOrder: z.number().optional(),
|
||
|
|
billingCycle: z.string().optional(),
|
||
|
|
monthlyPrice: z.number().optional(),
|
||
|
|
oneTimePrice: z.number().optional(),
|
||
|
|
unitPrice: z.number().optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// PricebookEntry Schema
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
export const catalogPricebookEntrySchema = z.object({
|
||
|
|
id: z.string().optional(),
|
||
|
|
name: z.string().optional(),
|
||
|
|
unitPrice: z.number().optional(),
|
||
|
|
pricebook2Id: z.string().optional(),
|
||
|
|
product2Id: z.string().optional(),
|
||
|
|
isActive: z.boolean().optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// Internet Product Schemas
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
export const internetCatalogProductSchema = catalogProductBaseSchema.extend({
|
||
|
|
internetPlanTier: z.string().optional(),
|
||
|
|
internetOfferingType: z.string().optional(),
|
||
|
|
features: z.array(z.string()).optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
export const internetPlanTemplateSchema = z.object({
|
||
|
|
tierDescription: z.string(),
|
||
|
|
description: z.string().optional(),
|
||
|
|
features: z.array(z.string()).optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
export const internetPlanCatalogItemSchema = internetCatalogProductSchema.extend({
|
||
|
|
catalogMetadata: z.object({
|
||
|
|
tierDescription: z.string().optional(),
|
||
|
|
features: z.array(z.string()).optional(),
|
||
|
|
isRecommended: z.boolean().optional(),
|
||
|
|
}).optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
export const internetInstallationCatalogItemSchema = internetCatalogProductSchema.extend({
|
||
|
|
catalogMetadata: z.object({
|
||
|
|
installationTerm: z.enum(["One-time", "12-Month", "24-Month"]),
|
||
|
|
}).optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
export const internetAddonCatalogItemSchema = internetCatalogProductSchema.extend({
|
||
|
|
isBundledAddon: z.boolean().optional(),
|
||
|
|
bundledAddonId: z.string().optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// SIM Product Schemas
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
export const simCatalogProductSchema = catalogProductBaseSchema.extend({
|
||
|
|
simDataSize: z.string().optional(),
|
||
|
|
simPlanType: z.string().optional(),
|
||
|
|
simHasFamilyDiscount: z.boolean().optional(),
|
||
|
|
isBundledAddon: z.boolean().optional(),
|
||
|
|
bundledAddonId: z.string().optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
export const simActivationFeeCatalogItemSchema = simCatalogProductSchema.extend({
|
||
|
|
catalogMetadata: z.object({
|
||
|
|
isDefault: z.boolean(),
|
||
|
|
}).optional(),
|
||
|
|
});
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// VPN Product Schema
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
export const vpnCatalogProductSchema = catalogProductBaseSchema.extend({
|
||
|
|
vpnRegion: z.string().optional(),
|
||
|
|
});
|
||
|
|
|