import z from 'zod'; import { authedServiceRequest, serviceResponse, } from '../interfaces/common'; const upgradeInfo = z.object({ total: z.number(), items: z.array(z.object({ name: z.string(), quantity: z.number(), amount: z.number(), })), }); export interface StripeService { listProducts(request: ListStripeProductsRequest): Promise; upgradeInfo(request: StripeUpgradeInfoRequest): Promise; createCustomer(request: CreateStripeCustomerRequest): Promise; createSession(request: CreateStripeSessionRequest): Promise; createBillingPortalSession(request: CreateStripeBillingPortalSessionRequest): Promise; } /** ****************************************************************************** * List Stripe Products ******************************************************************************* */ export const listStripeProductsParams = z.object({}); export const listStripeProductsRequest = authedServiceRequest .merge( z.object({ params: listStripeProductsParams.optional(), }), ); export const listStripeProductsResponse = serviceResponse.merge( z.object({ products: z.array(z.any()).optional(), }), ); export type ListStripeProductsParams = z.infer; export type ListStripeProductsRequest = z.infer; export type ListStripeProductsResponse = z.infer; /** ****************************************************************************** * Get Stripe Upgrade Info ******************************************************************************* */ export const stripeUpgradeInfoParams = z.object({ productId: z.string(), priceId: z.string(), }); export const stripeUpgradeInfoRequest = authedServiceRequest .merge( z.object({ params: stripeUpgradeInfoParams, }), ); export const stripeUpgradeInfoResponse = serviceResponse.merge( z.object({ upgradeInfo: upgradeInfo.nullable().optional(), }), ); export type StripeUpgradeInfoParams = z.infer; export type StripeUpgradeInfoRequest = z.infer; export type StripeUpgradeInfoResponse = z.infer; /** ****************************************************************************** * Create Stripe Customer ******************************************************************************* */ export const createStripeCustomerParams = z.object({ organizationId: z.string(), }); export const createStripeCustomerRequest = authedServiceRequest .merge( z.object({ params: createStripeCustomerParams, }), ); export const createStripeCustomerResponse = serviceResponse.merge( z.object({ customerId: z.string().optional(), }), ); export type CreateStripeCustomerParams = z.infer; export type CreateStripeCustomerRequest = z.infer; export type CreateStripeCustomerResponse = z.infer; /** ****************************************************************************** * Create Stripe Session ******************************************************************************* */ export const createStripeSessionParams = z.object({ priceId: z.string(), invoiceId: z.string().optional(), }); export const createStripeSessionRequest = authedServiceRequest .merge( z.object({ params: createStripeSessionParams, }), ); export const createStripeSessionResponse = serviceResponse.merge( z.object({ sessionId: z.string().optional(), sessionUrl: z.string().optional(), }), ); export type CreateStripeSessionParams = z.infer; export type CreateStripeSessionRequest = z.infer; export type CreateStripeSessionResponse = z.infer; /** ****************************************************************************** * Create Stripe Billing Portal Session ******************************************************************************* */ export const createStripeBillingPortalSessionParams = z.object({}); export const createStripeBillingPortalSessionRequest = authedServiceRequest .merge( z.object({ params: createStripeBillingPortalSessionParams, }), ); export const createStripeBillingPortalSessionResponse = serviceResponse.merge( z.object({ billingPortalUrl: z.string().optional(), }), ); export type CreateStripeBillingPortalSessionParams = z.infer; export type CreateStripeBillingPortalSessionRequest = z.infer; export type CreateStripeBillingPortalSessionResponse = z.infer;