Files
cfw-autumn/shared/utils/cusProductUtils/classifyCusProduct.ts
2025-12-13 12:18:06 +00:00

91 lines
2.1 KiB
TypeScript

import type { FullCusProduct } from "@models/cusProductModels/cusProductModels.js";
import {
isFreeProduct,
isOneOffProduct,
} from "../productUtils/classifyProductUtils";
import { notNullish, nullish } from "../utils";
import { cusProductToPrices } from "./convertCusProduct";
import { ACTIVE_STATUSES } from "./cusProductConstants";
export const isCusProductOneOff = ({
cusProduct,
}: {
cusProduct?: FullCusProduct;
}) => {
if (!cusProduct) return false;
const prices = cusProductToPrices({ cusProduct });
return isOneOffProduct({ prices });
};
export const isCusProductCanceled = ({
cusProduct,
}: {
cusProduct?: FullCusProduct;
}) => {
if (!cusProduct) return false;
return cusProduct.canceled;
};
export const isCusProductTrialing = ({
cusProduct,
now,
}: {
cusProduct?: FullCusProduct;
now?: number;
}) => {
if (!cusProduct) return false;
return (
cusProduct.trial_ends_at && cusProduct.trial_ends_at > (now || Date.now())
);
};
// ATTACH PRIMITIVES
export const isCusProductOnEntity = ({
cusProduct,
internalEntityId,
}: {
cusProduct: FullCusProduct;
internalEntityId?: string;
}) => {
return internalEntityId
? cusProduct.internal_entity_id === internalEntityId
: nullish(cusProduct.internal_entity_id);
};
/**
* An "ongoing" customer product is one that:
* - Is NOT a "one off" (recurring or repeating, not a purchase-once type)
* - Has an "active" status (see ACTIVE_STATUSES)
*/
export const isCusProductOngoing = ({
cusProduct,
}: {
cusProduct: FullCusProduct;
}) => {
const isActive = ACTIVE_STATUSES.includes(cusProduct.status);
const prices = cusProductToPrices({ cusProduct });
const isNotOneOff = !isOneOffProduct({ prices });
return isActive && isNotOneOff;
};
// Note, this does not CONFIRM that the subscription is active (might be canceled in Stripe...)
export const cusProductHasSubscription = ({
cusProduct,
}: {
cusProduct: FullCusProduct;
}) => {
const prices = cusProductToPrices({ cusProduct });
if (isFreeProduct({ prices }) || isOneOffProduct({ prices })) return false;
const subId = cusProduct.subscription_ids?.[0];
return notNullish(subId);
};