76 lines
1.6 KiB
TypeScript
76 lines
1.6 KiB
TypeScript
import {
|
|
type BillingInterval,
|
|
type FixedPriceConfig,
|
|
isFixedPrice,
|
|
type Price,
|
|
type ProductItem,
|
|
type ProductV2,
|
|
} from "@autumn/shared";
|
|
import { isPriceItem } from "@/internal/products/product-items/productItemUtils/getItemType.js";
|
|
import { nullish } from "@/utils/genUtils.js";
|
|
|
|
export const addPrefixToProducts = ({
|
|
products,
|
|
prefix,
|
|
}: {
|
|
products: ProductV2[];
|
|
prefix: string;
|
|
}) => {
|
|
for (const product of products) {
|
|
product.id = `${prefix}_${product.id}`;
|
|
product.name = `${prefix} ${product.name}`;
|
|
product.group = prefix;
|
|
}
|
|
|
|
return products;
|
|
};
|
|
|
|
export const replaceItems = ({
|
|
featureId,
|
|
interval,
|
|
intervalCount,
|
|
newItem,
|
|
items,
|
|
}: {
|
|
featureId?: string;
|
|
interval?: BillingInterval;
|
|
intervalCount?: number;
|
|
newItem: ProductItem;
|
|
items: ProductItem[];
|
|
}) => {
|
|
const newItems = structuredClone(items);
|
|
|
|
let index;
|
|
if (featureId) {
|
|
index = newItems.findIndex((item) => item.feature_id === featureId);
|
|
}
|
|
|
|
if (interval) {
|
|
index = newItems.findIndex(
|
|
(item) =>
|
|
item.interval === (interval as any) &&
|
|
(intervalCount ? item.interval_count === intervalCount : true) &&
|
|
nullish(item.feature_id),
|
|
);
|
|
}
|
|
|
|
if (index === -1) {
|
|
throw new Error("Item not found");
|
|
}
|
|
|
|
newItems[index!] = newItem;
|
|
|
|
return newItems;
|
|
};
|
|
|
|
export const getBasePrice = ({ product }: { product: ProductV2 }) => {
|
|
return product.items.find((item) => isPriceItem(item))?.price || 0;
|
|
};
|
|
|
|
export const v1ProductToBasePrice = ({ prices }: { prices: Price[] }) => {
|
|
const fixedPrice = prices.find((price) => isFixedPrice(price));
|
|
if (fixedPrice) {
|
|
return (fixedPrice.config as FixedPriceConfig).amount;
|
|
} else return 0;
|
|
};
|