# Customer Portal Architecture ## 🏗️ **System Overview** The Customer Portal is a modern monorepo with clean separation between frontend (Next.js) and backend (NestJS), designed for maintainability and scalability. ### **High-Level Structure** ``` apps/ portal/ # Next.js frontend bff/ # NestJS Backend-for-Frontend packages/ domain/ # Pure domain/types/utils (isomorphic) logging/ # Centralized logging utilities validation/ # Shared validation schemas ``` ## 🎯 **Architecture Principles** ### **1. Separation of Concerns** - **Dev vs Prod**: Clear separation with appropriate tooling - **Services vs Apps**: Development runs apps locally, production containerizes everything - **Configuration vs Code**: Environment variables for configuration, code for logic ### **2. Single Source of Truth** - **One environment template**: `.env.example` - **One Docker Compose** per environment - **One script** per operation type ### **3. Clean Dependencies** - **Portal**: Uses `@/lib/*` for shared utilities and services - **BFF**: Feature-aligned modules with shared concerns in `src/common/` - **Domain**: Framework-agnostic types and utilities ## 🚀 **Portal (Next.js) Architecture** ``` src/ app/ # App Router routes components/ # Design system (atomic design) atoms/ # Basic UI elements molecules/ # Component combinations organisms/ # Complex UI sections templates/ # Page layouts features/ # Feature modules (auth, billing, etc.) lib/ # Core utilities and services api/ # Zod-aware fetch client + helpers hooks/ # Shared React hooks utils/ # Utility functions providers/ # Context providers styles/ # Global styles ``` ### **Conventions** - Use `@/lib/*` for shared frontend utilities and services - Feature modules own their `components/`, `hooks/`, `services/`, and `types/` - Cross-feature UI belongs in `components/` (atomic design) - Avoid duplicate layers - no `core/` or `shared/` inside apps ## 🔧 **BFF (NestJS) Architecture** ``` src/ modules/ # Feature-aligned modules auth/ # Authentication billing/ # Invoice and payment management catalog/ # Product catalog orders/ # Order processing subscriptions/ # Service management core/ # Core services and utilities integrations/ # External service integrations salesforce/ # Salesforce CRM integration whmcs/ # WHMCS billing integration common/ # Nest providers/interceptors/guards main.ts # Application entry point ``` ### **Conventions** - Prefer `modules/*` over flat directories per domain - Keep DTOs and validators in-module - Reuse `packages/domain` for domain types - External integrations in dedicated modules ## 📦 **Shared Packages** ### **Layered Type System Architecture** The codebase follows a strict layering pattern to ensure single source of truth for all types and prevent drift: ``` @customer-portal/contracts (Pure TypeScript types) ↓ @customer-portal/schemas (Runtime validation with Zod) ↓ @customer-portal/integrations (Mappers for external APIs) ↓ Applications (BFF, Portal) ``` #### **1. Contracts Package (`packages/contracts/`)** - **Purpose**: Pure TypeScript interface definitions - single source of truth - **Contents**: Cross-layer contracts for billing, subscriptions, payments, SIM, orders - **Exports**: Organized by domain (e.g., `@customer-portal/contracts/billing`) - **Rule**: ZERO runtime dependencies, only pure types #### **2. Schemas Package (`packages/schemas/`)** - **Purpose**: Runtime validation schemas using Zod - **Contents**: Matching Zod validators for each contract + integration-specific payload schemas - **Exports**: Organized by domain and integration provider - **Usage**: Validate external API responses, request payloads, and user input #### **3. Integration Packages (`packages/integrations/`)** - **Purpose**: Transform raw provider data into shared contracts - **Structure**: - `packages/integrations/whmcs/` - WHMCS billing integration - `packages/integrations/freebit/` - Freebit SIM provider integration - **Contents**: Mappers, utilities, and helper functions - **Rule**: Must use `@customer-portal/schemas` for validation at boundaries #### **4. Application Layers** - **BFF** (`apps/bff/`): Import from contracts/schemas, never define duplicate interfaces - **Portal** (`apps/portal/`): Import from contracts/schemas, use shared types everywhere - **Rule**: Applications only consume, never define domain types ### **Legacy: Domain Package (Deprecated)** - **Status**: Being phased out in favor of contracts + schemas - **Migration**: Re-exports now point to contracts package for backward compatibility - **Rule**: New code should import from `@customer-portal/contracts` or `@customer-portal/schemas` ### **Logging Package** - **Purpose**: Centralized structured logging - **Features**: Pino-based logging with correlation IDs - **Security**: Automatic PII redaction [[memory:6689308]] ## 🔗 **Integration Architecture** ### **API Client** - **Implementation**: Fetch wrapper using shared Zod schemas from `@customer-portal/domain` - **Features**: CSRF protection, auth handling, consistent `ApiResponse` helpers - **Location**: `apps/portal/src/lib/api/` ### **External Services** - **WHMCS**: Billing system integration - **Salesforce**: CRM and order management - **Redis**: Caching and session storage - **PostgreSQL**: Primary data store ## 🔒 **Security Architecture** ### **Authentication Flow** - Portal-native authentication with JWT tokens - Optional MFA support - Secure token rotation with Redis backing ### **Error Handling** - Never leak sensitive details to end users [[memory:6689308]] - Centralized error mapping to user-friendly messages - Comprehensive audit trails ### **Data Protection** - PII minimization with encryption at rest/in transit - Row-level security (users can only access their data) - Idempotency keys on all mutating operations ## 🚀 **Development Workflow** ### **Path Aliases** - **Portal**: `@/*`, `@/lib/*`, `@/features/*`, `@/components/*` - **BFF**: `@/*` mapped to `apps/bff/src` - **Domain**: Import via `@customer-portal/domain` ### **Code Quality** - Strict TypeScript rules enforced repository-wide - ESLint and Prettier for consistent formatting - Pre-commit hooks for quality gates ## 📈 **Performance & Scalability** ### **Caching Strategy** - **Invoices**: 60-120s per page; bust on WHMCS webhook - **Cases**: 30-60s; bust after create/update - **Catalog**: 5-15m; manual bust on changes - **Keys include user_id** to prevent cross-user leakage ### **Database Optimization** - Connection pooling with Prisma - Proper indexing on frequently queried fields - Optional mirrors for external system data --- *This architecture supports clean, maintainable code with clear separation of concerns and production-ready security.*