import { billingParamsV0ToInvoiceModeParams } from "@api/billing/common/mappers/billingParamsV0ToInvoiceModeParams"; import { freeTrialParamsV0ToV1 } from "@api/common/freeTrial/mappers/freeTrialParamsV0ToV1"; import { ApiVersion } from "@api/versionUtils/ApiVersion"; import { AffectedResource, defineVersionChange, } from "@api/versionUtils/versionChangeUtils/VersionChange"; import { productItemsToCustomizePlanV1 } from "@utils/productV2Utils/productItemUtils/convertProductItem/productItemsToCustomizePlanV1"; import type { z } from "zod/v4"; import type { SharedContext } from "../../../../types/sharedContext"; import { UpdateSubscriptionV0ParamsSchema } from "../updateSubscriptionV0Params"; import { UpdateSubscriptionV1ParamsSchema } from "../updateSubscriptionV1Params"; export const V1_2_UpdateSubscriptionParamsChange = defineVersionChange({ name: "V1.2 Update Subscription Params Change", newVersion: ApiVersion.V2_0, oldVersion: ApiVersion.V1_Beta, description: [ "Maps free_trial {length,duration} to {duration_length,duration_type}", "Maps top-level items to customize.items", ], affectedResources: [AffectedResource.ApiSubscriptionUpdate], newSchema: UpdateSubscriptionV1ParamsSchema, oldSchema: UpdateSubscriptionV0ParamsSchema, affectsRequest: true, affectsResponse: false, transformRequest: ({ ctx, input, }: { ctx: SharedContext; input: z.infer; }): z.infer => { const itemsCustomize = input.items ? productItemsToCustomizePlanV1({ ctx, items: input.items, }) : undefined; const freeTrialV1 = freeTrialParamsV0ToV1({ freeTrialParamsV0: input.free_trial, }); const customizeV1 = itemsCustomize || freeTrialV1 !== undefined ? { ...itemsCustomize, free_trial: freeTrialV1, } : undefined; const newPlanId = input.product_id ?? undefined; const featureQuantities = input.options; const invoiceMode = billingParamsV0ToInvoiceModeParams({ input }); return { ...input, plan_id: newPlanId, invoice_mode: invoiceMode, feature_quantities: featureQuantities, customize: customizeV1, proration_behavior: input.billing_behavior, }; }, });