import z from 'zod'; import { updateUsage, usage } from '../interfaces/Usage'; import { authedServiceRequest, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; export const zInvoiceStatus = z.enum(['Pending', 'Fulfilled', 'Canceled', 'Failed']); export const invoice = z.object({ _id: z.string(), organizationId: z.string(), subscriptionId: z.string(), stripeCustomerId: z.string(), stripeSubscriptionId: z.string().nullable(), stripeInvoiceId: z.string().nullable(), stripeProductId: z.string().nullable(), stripePriceId: z.string().nullable(), status: zInvoiceStatus, usage, usageLimits: usage, meta: metadata, }); export type Invoice = z.infer; export type InvoiceUsage = z.infer; export interface InvoiceService { create(request: CreateInvoiceRequest): Promise; updateLatest(request: UpdateLatestInvoiceRequest): Promise; latest(request: LatestInvoiceRequest): Promise; get(request: GetInvoiceRequest): Promise; list(request: ListInvoicesRequest): Promise; superSetUsageLimits(request: SuperSetInvoiceUsageLimitsRequest): Promise; } /** ****************************************************************************** * Create Invoice ******************************************************************************* */ export const createInvoiceParams = z.object({ stripeInvoiceId: z.string().nullable(), status: zInvoiceStatus, }); export const createInvoiceRequest = authedServiceRequest.merge( z.object({ params: createInvoiceParams, }), ); export const createInvoiceResponse = serviceResponse.merge( z.object({ invoice: invoice.optional(), }), ); export type CreateInvoiceParams = z.infer; export type CreateInvoiceRequest = z.infer; export type CreateInvoiceResponse = z.infer; /** ****************************************************************************** * Update Latest Invoice ******************************************************************************* */ export const updateLatestInvoiceParams = z.object({ organizationId: z.string(), usageDiff: updateUsage.optional(), }); export const updateLatestInvoiceRequest = serviceRequest.merge( z.object({ params: updateLatestInvoiceParams, }), ); export const updateLatestInvoiceResponse = serviceResponse.merge( z.object({ invoice: invoice.optional(), }), ); export type UpdateLatestInvoiceParams = z.infer; export type UpdateLatestInvoiceRequest = z.infer; export type UpdateLatestInvoiceResponse = z.infer; /** ****************************************************************************** * Get Latest Invoice ******************************************************************************* */ export const latestInvoiceParams = z.object({}); export const latestInvoiceRequest = authedServiceRequest.merge( z.object({ params: latestInvoiceParams, }), ); export const latestInvoiceResponse = serviceResponse.merge( z.object({ invoice: invoice.optional(), }), ); export type LatestInvoiceParams = z.infer; export type LatestInvoiceRequest = z.infer; export type LatestInvoiceResponse = z.infer; /** ****************************************************************************** * Get Invoice ******************************************************************************* */ export const getInvoiceParams = z.object({ invoiceId: z.string(), }); export const getInvoiceRequest = authedServiceRequest.merge( z.object({ params: getInvoiceParams, }), ); export const getInvoiceResponse = serviceResponse.merge( z.object({ invoice: invoice.nullable().optional(), }), ); export type GetInvoiceParams = z.infer; export type GetInvoiceRequest = z.infer; export type GetInvoiceResponse = z.infer; /** ****************************************************************************** * List Invoices ******************************************************************************* */ export const listInvoicesParams = z.object({}); export const listInvoicesRequest = authedServiceRequest.merge( z.object({ params: listInvoicesParams, }), ); export const listInvoicesResponse = serviceResponse.merge( z.object({ invoices: z.array(invoice).optional(), }), ); export type ListInvoicesParams = z.infer; export type ListInvoicesRequest = z.infer; export type ListInvoicesResponse = z.infer; /** ****************************************************************************** * Super Set invoice Usage Limits ******************************************************************************* */ export const superSetInvoiceUsageLimitsParams = z.object({ usageLimits: usage, resetCurrentUsage: z.boolean(), }); export const superSetInvoiceUsageLimitsRequest = authedServiceRequest.merge( z.object({ params: superSetInvoiceUsageLimitsParams, }), ); export const superSetInvoiceUsageLimitsResponse = serviceResponse.merge( z.object({ invoice: invoice.optional(), }), ); export type SuperSetInvoiceUsageLimitsParams = z.infer; export type SuperSetInvoiceUsageLimitsRequest = z.infer; export type SuperSetInvoiceUsageLimitsResponse = z.infer;