Architecture
NestJS. Event-driven. Multi-tenant.
OrvexCore is built with Domain-Driven Design principles on a NestJS microservice architecture — with dedicated background workers, a multi-schema Prisma database, and an event-driven domain model.
What's covered
Monorepo structure
Turborepo monorepo with @orvexcore/api (NestJS HTTP), @orvexcore/workers (BullMQ consumers), and orvexadmin (Next.js 16) apps.
Domain modules
Isolated domain modules: auth, tenancy, fees, academics, notifications, audit. Each owns its controllers, use cases, and repositories.
Port / adapter pattern
Use cases depend on port interfaces injected via NestJS DI — no direct database access from business logic.
Multi-tenant context
Organization context injected at the framework level via ContextPort — every use case calls getOrganizationIdOrFail().
Event-driven workers
Domain events published after state changes, consumed by BullMQ workers in named queues per domain.
Prisma multi-schema
PostgreSQL with 8 isolated schemas. Migrations managed by Prisma Migrate with checksum-protected migration files.
