91 lines
2.1 KiB
TypeScript
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);
|
|
};
|