import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import { product } from "./product"; const builtins = (params: { itemType?: TailorAnyDBType }) => { const itemId = db.uuid().description("Foreign key to generated Item in item-management"); return { productId: db .uuid() .relation({ type: "n-1", toward: { type: product, as: "product" }, backward: "productVariants", }) .description("Foreign key to Product"), axisValueKey: db .string() .description("Canonical key derived from sorted axis value IDs (e.g., value-1|value-3)"), itemId: params.itemType ? itemId.relation({ type: "n-1", toward: { type: params.itemType, as: "item" }, backward: "productVariants", }) : itemId, }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateProductVariantTypeParams> { fields?: NoReservedFields; itemType?: TailorAnyDBType; } export function createProductVariantType>( params: CreateProductVariantTypeParams, ) { return db .table("ProductVariant", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["productId", "axisValueKey"], unique: true, name: "product_variant_unique_idx", }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const productVariant = createProductVariantType({});