Server-Side System Architecture (NestJS Backend)
Server-Side System Architecture (NestJS Backend)
Executive Summary
The Learnille Server (server/) is an enterprise-grade NestJS RESTful API backend engineered for multi-tenant online learning, 1-on-1 expert consultations, real-time presence, wallet payouts, and multi-currency transaction processing.
🏛 1. High-Level Server System Diagram
+------------------------------------+ | Client Apps (Student, Admin, | | Instructor, Consultant) | +-----------------+------------------+ | HTTPS / REST / WebSockets | v+---------------------------------------------------------------------------------------------------+| NESTJS SERVER BACKEND (`server/`) || || +---------------------------------------------------------------------------------------------+ || | ENTRY PIPELINE: Helmet -> Cors -> CookieParser -> ThrottlerGuard -> RequestLoggerMiddleware | || +----------------------------------------------+----------------------------------------------+ || | || +----------------------------------------------v----------------------------------------------+ || | GLOBAL INTERCEPTORS & FILTERS: ResponseInterceptor, AllExceptionsFilter, CurrencyConversion | || +----------------------------------------------+----------------------------------------------+ || | || +----------------------------------------------v----------------------------------------------+ || | FEATURE MODULE DOMAINS: | || | - AuthModule (JWT RS256, Passport, Google/Apple OAuth, CASL RBAC) | || | - CourseModule (Curriculum Editor, Sections, Video Progress) | || | - ConsultationModule (Availability Calendar, Booking Engine, Slot Resolution) | || | - WalletModule & WithdrawalModule (Escrow Hold, NGN Bank Resolution, OTP Verification) | || | - ProductModule & ValidationModule (Quality Assurance Queue, State Machine) | || | - PaymentModule (Paystack & Flutterwave Gateways, Webhook Verification) | || | - OpenSearchModule (Vector Indexing, Full-Text Catalog Search) | || | - InstantdbModule (Real-Time Room State & Sync) | || | - OutboxModule & BullmqModule (Transactional Outbox Pattern, Async Queues) | || | - NotificationModule (Novu Framework & Soketi WebSocket Channels) | || +----------------------------------------------+----------------------------------------------+ |+-------------------------------------------------|-------------------------------------------------+ | +--------------------+---------------------+--------------------+--------------------+ | | | | | v v v v v+--------------+ +--------------+ +--------------+ +--------------+ +--------------+| Self-Hosted | | Self-Hosted | | Cloudflare | | OpenSearch | | New Relic || PostgreSQL | | Redis | | R2 S3 | | Index Engine | | APM & Logs || (TypeORM DB) | | (BullMQ) | | (Storage) | | (Vector Srch)| | & Sentry |+--------------+ +--------------+ +--------------+ +--------------+ +--------------+🛠 2. Request Handling Pipeline & Lifecycle
When an HTTP request enters the NestJS server, it passes through a deterministic processing chain:
[ Incoming HTTP Request ] | v1. [ Security & Middleware Layer ] - Helmet (Security headers) - Cookie Parser - AppRequestLoggerMiddleware (Pino/Winston request logger) | v2. [ Rate Limiting Guard ] - ThrottlerGuard (Redis-backed rate limiting with RedisThrottlerStorage) | v3. [ Authentication & Authorization Guards ] - JwtAuthGuard (Passport JWT RS256/HS256 validation) - RolesGuard / CASL AbilityGuard (Role checks: STUDENT, INSTRUCTOR, CONSULTANT, ADMIN) | v4. [ DTO Input Validation Pipe ] - ValidationPipe (class-validator DTO checking with transform: true) | v5. [ Controller Action Handler ] - Extracts payload via @Body(), user via @CurrentUser() - Delegates business logic to domain service | v6. [ Interceptors & Exception Filters ] - CurrencyConversionInterceptor (converts prices dynamically via dynamic header) - ResponseInterceptor (wraps output into standard { statusCode, message, data } JSON) - AllExceptionsFilter (catches and formats HTTP and system errors for client & Sentry) | v[ Formatted HTTP Response ]📦 3. Deep Domain Module Architecture
3.1. Authentication & Security Subsystem (auth/, casl/, crypto/)
- Token Architecture: RS256 asymmetric key pairs (
CryptoModule). Short-lived JWT access tokens + Redis-rotated refresh tokens. - Social Login: OAuth flow handling for Google (
google/) and Apple (auth/). Account linking endpoints permit attaching social credentials to an existing user account. - CASL Role Permissions: Fine-grained access control supporting 4 primary roles (
Student,Instructor,Consultant,Admin).
3.2. Course Curriculum Engine (course/, category/)
- Normalized Curriculum: Supports hierarchical structure:
Course->Section->Subsection->Item(Video, Document, Quiz). - Progress Tracking: Continuous video timestamp tracking via heartbeat endpoints (
/course/video-progress) recalculating student completion percentage dynamically. - Category Hierarchy: Category tree mapping supporting parent-child categories, featured flags, and display order batch updating.
3.3. Consultation Booking & Availability (consultation/, consultant/)
- Dual Mode: Supports
ONEOFF(specific single date/time) andRECURRING(weekly interval windows) consultations. - Availability Engine: Calculates available time slots dynamically by cross-referencing consultant weekly hours, booked slot reservations, minimum notice buffers (e.g. 2 hours notice required), and timezone offsets.
- Reschedule Workflow: Multi-party rescheduling protocol allowing students or consultants to propose pending slot changes.
3.4. Escrow, Wallet & Withdrawal System (wallet/, withdrawal/, payments/)
- Escrow Payment Hold: Funds from course sales or bookings enter
pending_holdin provider wallets, releasing toavailable_balanceupon course refund window expiry or consultation completion. - Dual Payment Gateways: Paystack and Flutterwave adapters with strict webhook signature verification (
x-paystack-signature, Flutterwave hash). - Multi-Step Withdrawal Flow:
- Add bank account method (
/withdrawals/methods). Bank account holder name is resolved via Flutterwave NGN lookup. - Verify account via SMS/email OTP (
/withdrawals/methods/verify). - Initiate withdrawal request (
/withdrawals/request). - Verify withdrawal with secondary OTP (
/withdrawals/:id/verify). - Admin approves and executes automated bank payout (
/withdrawals/:id/approve).
- Add bank account method (
3.5. Transactional Outbox & Background Processing (outbox/, bullmq/)
- Outbox Pattern: Changes to database entities write an outbox event in the same DB transaction (
outbox_events). - BullMQ Workers: BullMQ worker polls and processes outbox events asynchronously, handling external webhook dispatches, email triggers via Novu, and real-time Soketi broadcasts with automatic retries and dead-letter queues.
3.6. Search & Vector Engine (opensearch/)
- Catalog Indexing: Auto-indexes published courses and consultations into OpenSearch.
- Vector Search: Supports hybrid keyword search and semantic vector embeddings for recommendations and fast discovery.
🗄 4. Database & Persistence Standards
- Primary Database: PostgreSQL accessed via TypeORM.
- Naming Standard: All database columns use
snake_casetransformation (created_at,user_id,is_published). - Migrations: TypeORM migration scripts (
server/src/migrations/) maintain database schema changes. Direct schema alteration in production is strictly prohibited.
📊 5. Server Configuration & Observability
- Centralized Config:
ConfigModulevalidates all environment variables on boot viavalidateConfiginserver/src/config.ts. - Monitoring: Integrated with New Relic APM for transaction tracing, New Relic Log Enrichment for Winston logs, and Sentry for real-time exception reporting.
- Health Diagnostics:
HealthModulepowered by NestJS Terminus monitoring DB connection status, Redis availability, and host memory usage (/health).