/** * rCart Automerge document schemas. * * Two document types: * - Catalog: one doc per space holding all catalog entries. * DocId: {space}:cart:catalog * - Orders: one doc per order (server-validated via Intent/Claim). * DocId: {space}:cart:orders:{orderId} */ import type { DocSchema } from '../../shared/local-first/document'; // ── Document types ── export interface CatalogEntry { id: string; artifactId: string; artifact: unknown; title: string; productType: string | null; requiredCapabilities: string[]; substrates: string[]; creatorId: string | null; sourceSpace: string | null; tags: string[]; status: string; createdAt: number; updatedAt: number; } export interface CatalogDoc { meta: { module: string; collection: string; version: number; spaceSlug: string; createdAt: number; }; items: Record; } export interface OrderMeta { id: string; catalogEntryId: string; artifactId: string; buyerId: string | null; buyerLocation: string | null; buyerContact: string | null; providerId: string | null; providerName: string | null; providerDistanceKm: number | null; quantity: number; productionCost: number | null; creatorPayout: number | null; communityPayout: number | null; totalPrice: number | null; currency: string; status: string; paymentMethod: string | null; paymentTx: string | null; paymentNetwork: string | null; createdAt: number; paidAt: number; acceptedAt: number; completedAt: number; updatedAt: number; } export interface OrderDoc { meta: { module: string; collection: string; version: number; spaceSlug: string; createdAt: number; }; order: OrderMeta; } // ── Schema registration ── export const catalogSchema: DocSchema = { module: 'cart', collection: 'catalog', version: 1, init: (): CatalogDoc => ({ meta: { module: 'cart', collection: 'catalog', version: 1, spaceSlug: '', createdAt: Date.now(), }, items: {}, }), }; export const orderSchema: DocSchema = { module: 'cart', collection: 'orders', version: 1, init: (): OrderDoc => ({ meta: { module: 'cart', collection: 'orders', version: 1, spaceSlug: '', createdAt: Date.now(), }, order: { id: '', catalogEntryId: '', artifactId: '', buyerId: null, buyerLocation: null, buyerContact: null, providerId: null, providerName: null, providerDistanceKm: null, quantity: 1, productionCost: null, creatorPayout: null, communityPayout: null, totalPrice: null, currency: 'USD', status: 'pending', paymentMethod: null, paymentTx: null, paymentNetwork: null, createdAt: Date.now(), paidAt: 0, acceptedAt: 0, completedAt: 0, updatedAt: Date.now(), }, }), }; // ── Helpers ── export function catalogDocId(space: string) { return `${space}:cart:catalog` as const; } export function orderDocId(space: string, orderId: string) { return `${space}:cart:orders:${orderId}` as const; }