Files
cfw-autumn/shared/models/productV2Models/productV2Models.ts
2026-04-20 19:11:12 +01:00

48 lines
1.4 KiB
TypeScript

import { ApiFreeTrialSchema } from "@api/models.js";
import { z } from "zod/v4";
import { AppEnv } from "../genModels/genEnums.js";
import { ProductConfigSchema } from "../productModels/productConfig/productConfig.js";
import { ProductItemSchema } from "./productItemModels/productItemModels.js";
export const ProductV2Schema = z.object({
internal_id: z.string().nullish(),
id: z.string(),
name: z.string(),
description: z.string().nullish(),
is_add_on: z.boolean(),
is_default: z.boolean(),
version: z.number().default(1),
group: z.string().nullable(),
env: z.nativeEnum(AppEnv),
// free_trial: FreeTrialSchema.nullish(),
free_trial: ApiFreeTrialSchema.nullish(),
items: z.array(ProductItemSchema),
created_at: z.number(),
stripe_id: z.string().nullish(),
archived: z.boolean().default(false).nullish(),
config: ProductConfigSchema.partial().optional(),
});
// 1. Create a new type called FrontendProduct
export const FrontendProductSchema = ProductV2Schema.extend({
planType: z.enum(["free", "paid"]).nullable(),
basePriceType: z
.enum(["recurring", "one-off", "usage"])
.default("recurring")
.nullable(),
external_processors: z
.object({
revenuecat: z
.object({
linked_product_id: z.string().nullish(),
})
.nullish(),
})
.nullish(),
});
export type ProductV2 = z.infer<typeof ProductV2Schema>;
export type FrontendProduct = z.infer<typeof FrontendProductSchema>;