Files
cfw-autumn/shared/models/productModels/productItemModels.ts
2025-04-14 16:47:34 +01:00

66 lines
1.6 KiB
TypeScript

import { z } from "zod";
import { FeatureSchema, FeatureType } from "../featureModels/featureModels.js";
export const TierInfinite = "inf";
export const Infinite = "inf";
export enum ProductItemInterval {
// None = "none",
// Reset interval
Minute = "minute",
Hour = "hour",
Day = "day",
// Billing interval
Month = "month",
Quarter = "quarter",
SemiAnnual = "semi_annual",
Year = "year",
}
export enum ProductItemType {
Feature = "feature",
FeaturePrice = "feature_price",
Price = "price",
}
export const PriceTierSchema = z.object({
to: z.number().or(z.literal(TierInfinite)),
amount: z.number(),
});
export enum ProductItemBehavior {
Prepaid = "prepaid",
PayPerUse = "pay_per_use",
}
export const ProductItemSchema = z.object({
// Feature stuff
feature_id: z.string().nullish(),
included_usage: z.union([z.number(), z.literal(Infinite)]).nullish(),
interval: z.nativeEnum(ProductItemInterval).nullish(),
reset_interval: z.nativeEnum(ProductItemInterval).nullish(),
reset_usage_on_billing: z.boolean().nullish(),
// Price config
behavior: z.nativeEnum(ProductItemBehavior).nullish(),
amount: z.number().nullish(),
tiers: z.array(PriceTierSchema).nullish(),
billing_units: z.number().nullish(), // amount per billing unit (eg. $9 / 250 units)
// Others
entity_feature_id: z.string().nullish(),
carry_over_usage: z.boolean().nullish(),
// Stored in backend
created_at: z.number().nullish(),
entitlement_id: z.string().nullish(),
price_id: z.string().nullish(),
price_config: z.any().nullish(),
});
export type ProductItem = z.infer<typeof ProductItemSchema>;