Module Build Status
Tracks where each module is in the pipeline. Updated at each milestone.
Pipeline stages: design-lock → service-skeleton → admin-pages → ship
| Module | Design Lock | DB Migration | Service Layer | Admin Pages | Ship |
|---|---|---|---|---|---|
| platform | ✅ locked (21 tables) | ✅ applied (local) | 🔄 skeleton (see below) | — | — |
platform — Service Layer Detail
Status: skeleton / in-progress — NOT done.
What exists:
packages/db— Drizzle schema (21 tables), migration applied locally, 15set_updated_attriggersapps/api/src/database/DatabaseModule— providesDB,ADMIN_DB,TENANT_DBas global NestJS providersapps/api/src/platform/TenantContextMiddleware— extractsx-tenant-idheader, validates UUID, stores on request. TODO: replace with JWT claim extraction at identity integration.apps/api/src/platform/decorators/AdminRoute— marks a route as admin/cross-tenant (uses adminDb, skips tenant-ID requirement)apps/api/src/platform/PlatformService— 41 methods:- 21 reads (thin-functional): real Drizzle queries, return rows. listTenants, getTenant, getTenantBySlug, getProfile, getContacts, getBillingAccount, getSubscription, listInvoices, getPayments, getTierCatalog, getTier, getEntitlements, resolveEntitlements, hasEntitlement, getAiCreditAccount, getContracts, getPromoCodes, validatePromoCode, getCurrentAgreement, getAcceptances, getSetupTasks, getUsage
- 3 NotImplemented stubs: startDunning, advanceDunning, recoverDunning, consumeAiCredit (all require state machine / atomic logic — see spec §9/§10 and OPEN_ITEMS)
- 17 naive-write stubs: createTenant, updateTenantStatus, changeTier, pauseSubscription, resumeSubscription, cancelSubscription, recordInvoice, recordPayment, grantEntitlementOverride, revokeEntitlement, incrementUsage, grantAiCredit, purchaseAiCredit, createContract, updateContractStatus, recordAcceptance, recordUsageSummary, recordOperatorAction
apps/api/src/platform/dto/platform.dto.ts— 17 input DTOs with class-validator decoratorspackages/db/seeds/dev-seed.ts— DEV/LOCAL ONLY. 3 tiers, 5 tenants (mixed verticals, varied statuses), profiles/contacts/subscriptions/entitlements.npm run dev-seed -w @vrida/db
What is NOT done (deferred):
- HTTP controllers (step 11)
- Automated tests (post-identity)
- State machine enforcement in updateTenantStatus (spec §8 legal transitions)
- Dunning workflow execution (spec §10, AI-driven, vendor-dependent)
- Entitlement precedence/stacking in resolveEntitlements (spec §9)
- AI credit atomic consumption (consumeAiCredit — balance check + spend limit + ledger)
- Per-request tenantDB transaction wrapping (deferred to identity integration)
- Remote Supabase link (user action — requires browser auth)