Product
Source: src/data/product/
Service
The product service is a stub (export {}). Not yet implemented.
Repository
ProductRepository
| Method | Parameters | Returns |
|---|---|---|
| getById | (ctx: RequestContext, id: string) | Promise<ProductRecord | null> |
| listByTenant | (ctx: RequestContext) | Promise<ProductRecord[]> |
| create | (ctx: RequestContext, record: ProductRecord) | Promise<void> |
| update | (ctx: RequestContext, id: string, patch: Partial<Omit<ProductRecord, 'id' | 'tenantId'>>) | Promise<ProductRecord> |
| delete | (ctx: RequestContext, id: string) | Promise<void> |
ProductRecord
| Field | Type |
|---|---|
| id | string |
| tenantId | string |
| createdAt | Date |
| updatedAt | Date |
| data | Record<string, unknown> (optional) |
Validators
currencySchema
string — exactly 3 characters, defaults to 'USD'.
productSchema
| Field | Type | Required | Default |
|---|---|---|---|
| tenantId | string | Yes | — |
| name | string | Yes | — |
| description | string | No | — |
| sku | string | Yes | — |
| priceCents | number (int, ≥ 0) | Yes | — |
| currency | currencySchema | No | 'USD' |
| requiredRoleIds | string[] | No | [] |
| grantedRoleIds | string[] | No | [] |
| isDigital | boolean | No | false |
| isActive | boolean | No | true |
| inventoryTracked | boolean | No | true |
| costCents | number (int, ≥ 0) | No | 0 |
| qtyVisibility | enum('public' | 'private' | 'inherit') | No | 'inherit' |
| createdAt | Date (coerced) | Yes | — |
| updatedAt | Date (coerced) | Yes | — |
productPublicSchema
productSchema.omit({ costCents: true }) — customer-facing output shape. costCents is admin-only and must never appear in public responses.
Inferred Types
Product—z.infer<typeof productSchema>ProductPublic—z.infer<typeof productPublicSchema>