Skip to content

Commit 8f238de

Browse files
committed
feat: add products.list contract
Add products contract with: - ProductSchema (id, name, description, recurringInterval, prices) - ProductPriceSchema (amountType, amounts, meterId) - listProductsContract for products.list endpoint
1 parent 9ca92c9 commit 8f238de

2 files changed

Lines changed: 41 additions & 1 deletion

File tree

src/contracts/products.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { oc } from "@orpc/contract";
2+
import { z } from "zod";
3+
4+
export const ProductPriceSchema = z.object({
5+
id: z.string(),
6+
amountType: z.enum(["FIXED", "CUSTOM", "FREE", "METERED"]),
7+
priceAmount: z.number().nullable(),
8+
minimumAmount: z.number().nullable(),
9+
maximumAmount: z.number().nullable(),
10+
presetAmount: z.number().nullable(),
11+
unitAmount: z.number().nullable(),
12+
capAmount: z.number().nullable(),
13+
meterId: z.string().nullable(),
14+
});
15+
16+
export const ProductSchema = z.object({
17+
id: z.string(),
18+
name: z.string(),
19+
description: z.string().nullable(),
20+
recurringInterval: z.enum(["MONTH", "QUARTER", "YEAR"]).nullable(),
21+
prices: z.array(ProductPriceSchema),
22+
});
23+
24+
export const ListProductsOutputSchema = z.object({
25+
products: z.array(ProductSchema),
26+
});
27+
28+
export type Product = z.infer<typeof ProductSchema>;
29+
export type ProductPrice = z.infer<typeof ProductPriceSchema>;
30+
31+
export const listProductsContract = oc
32+
.input(z.object({}).optional())
33+
.output(ListProductsOutputSchema);
34+
35+
export const products = {
36+
list: listProductsContract,
37+
};

src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { checkout } from "./contracts/checkout";
22
import { onboarding } from "./contracts/onboarding";
3+
import { products } from "./contracts/products";
34

45
export type {
56
ConfirmCheckout,
@@ -18,8 +19,10 @@ export type {
1819
} from "./contracts/onboarding";
1920
export type { Checkout } from "./schemas/checkout";
2021
export { CheckoutSchema } from "./schemas/checkout";
22+
export type { Product, ProductPrice } from "./contracts/products";
23+
export { ProductSchema, ProductPriceSchema, ListProductsOutputSchema } from "./contracts/products";
2124

22-
export const contract = { checkout, onboarding };
25+
export const contract = { checkout, onboarding, products };
2326

2427
export type { MetadataValidationError } from "./validation/metadata-validation";
2528
export {

0 commit comments

Comments
 (0)