Files
cfw-autumn/shared/utils/planFeatureUtils/itemsToPlanFeatures.ts
amianthus 334d13ad94 fix: 🐛 crash
2025-10-20 11:12:29 +01:00

92 lines
2.5 KiB
TypeScript

import { ResetInterval } from "@api/models.js";
import {
type ApiPlanFeature,
ApiPlanFeatureSchema,
} from "@api/products/planFeature/apiPlanFeature.js";
import type { BillingInterval } from "@models/productModels/priceModels/priceEnums.js";
import { Infinite } from "@models/productModels/productEnums.js";
import {
type ProductItem,
TierInfinite,
type UsageModel,
} from "@models/productV2Models/productItemModels/productItemModels.js";
import {
itemIntvToResetIntv,
rolloverToResetIntv,
} from "./planFeatureIntervals.js";
/**
* Convert Product items back to Plan features for API responses
*/
export const itemsToPlanFeatures = ({
items,
}: {
items: ProductItem[];
}): ApiPlanFeature[] => {
return items.map((item) =>
ApiPlanFeatureSchema.parse({
feature_id: item.feature_id!,
// Handle unlimited vs granted
granted:
item.included_usage === Infinite ? 0 : (item.included_usage ?? 0),
unlimited: item.included_usage === Infinite,
// Convert intervals
reset_interval: item.interval
? (itemIntvToResetIntv(item.interval!) as ResetInterval)
: ResetInterval.OneOff,
...(item.interval_count !== undefined && item.interval_count !== null
? {
reset_interval_count: item.interval_count,
}
: {}),
// Convert price if exists
...(item.price
? {
price: {
interval: (item.interval || "month") as BillingInterval,
billing_units: item.billing_units ?? 1,
usage_model: (item.usage_model || "pay_per_use") as UsageModel,
max_purchase: 1,
amount: item.price || 0,
tiers: item.tiers?.map((tier) => ({
to: tier.to === TierInfinite ? TierInfinite : tier.to,
amount: tier.amount,
})),
interval_count: item.interval_count ?? undefined,
},
}
: {}),
// Convert rollover config
...(item.config?.rollover
? {
rollover: {
max: item.config.rollover.max ?? null,
expiry_duration_type: rolloverToResetIntv(
item.config.rollover.duration,
),
expiry_duration_length: item.config.rollover.length,
},
}
: {}),
// Convert proration config
...(item.config?.on_increase || item.config?.on_decrease
? {
proration: {
on_increase: item.config.on_increase ?? undefined,
on_decrease: item.config.on_decrease ?? undefined,
},
}
: {}),
// Other fields
reset_usage_on_enabled: item.reset_usage_when_enabled ?? true,
// entity_feature_id: item.entity_feature_id,
} satisfies ApiPlanFeature),
);
};