# BFF Business Validation Migration to Domain ## Investigation Summary Found the following validator services in BFF: 1. ✅ **MappingValidatorService** - Already migrated to domain 2. ✅ **OrderValidator** - Already uses domain validation helpers 3. 🔄 **InvoiceValidatorService** - Has pure validation functions to migrate 4. ❌ **OrderFulfillmentValidator** - Pure infrastructure (DB/API calls) 5. ❌ **SimValidationService** - Pure infrastructure (DB lookups) ## Candidates for Migration ### 1. Invoice Validation Functions → `domain/billing/validation.ts` **Source**: `apps/bff/src/modules/invoices/validators/invoice-validator.service.ts` **Pure validation functions to migrate**: ```typescript // Input validation (no dependencies) - validateInvoiceId(invoiceId: number): ValidationResult - validateUserId(userId: string): ValidationResult - validateWhmcsClientId(clientId: number): ValidationResult - validatePaymentGateway(gatewayName: string): ValidationResult - validateReturnUrl(returnUrl: string): ValidationResult - validatePagination(options): ValidationResult - validateGetInvoicesOptions(options): InvoiceValidationResult ``` **Already in domain** (correctly placed): - `INVOICE_PAGINATION` constants ✅ - `VALID_INVOICE_STATUSES` ✅ - `isValidInvoiceStatus()` ✅ - `sanitizePaginationLimit()` ✅ - `sanitizePaginationPage()` ✅ ### 2. Invoice Validation Result Type → `domain/billing/contract.ts` **Source**: `apps/bff/src/modules/invoices/types/invoice-service.types.ts` ```typescript export interface InvoiceValidationResult { isValid: boolean; errors: string[]; } ``` ### Status Check: Orders & Subscriptions **Orders Validation** ✅ Already good! - Business rules already in `domain/orders/validation.ts` - Helpers: `getOrderTypeValidationError`, `hasSimServicePlan`, etc. - BFF only does infrastructure (DB, API calls, logging) **Subscriptions/SIM Validation** ✅ Already good! - `SimValidationService` is pure infrastructure (fetches from DB, checks subscription type) - No pure business logic to extract ## Migration Plan ### Phase 1: Invoice Validation 1. Create `packages/domain/billing/validation.ts` with pure validation functions 2. Add `InvoiceValidationResult` to `packages/domain/billing/contract.ts` 3. Update `packages/domain/billing/index.ts` to export validation 4. Refactor `InvoiceValidatorService` to delegate to domain functions 5. Add logging wrapper (infrastructure concern) in BFF service ### Phase 2: Common URL Validation The `validateReturnUrl()` function is generic enough for `domain/common/validation.ts`: ```typescript export function validateUrl(url: string): ValidationResult { try { new URL(url); return { isValid: true, errors: [] }; } catch { return { isValid: false, errors: ["Invalid URL format"] }; } } ``` ## Architecture Pattern (Confirmed Correct) ``` ┌─────────────────────────────────────────────┐ │ Domain Layer (Pure Business Logic) │ ├─────────────────────────────────────────────┤ │ - domain/*/schema.ts (Zod schemas) │ │ - domain/*/validation.ts (pure functions) │ │ - domain/*/contract.ts (types) │ │ - domain/common/validation.ts (helpers) │ └─────────────────────────────────────────────┘ ↑ │ imports │ ┌─────────────────────────────────────────────┐ │ BFF Infrastructure Layer │ ├─────────────────────────────────────────────┤ │ - *-validator.service.ts (thin wrappers) │ │ - Database queries │ │ - HTTP/API calls │ │ - Logging │ │ - Caching │ │ - Error handling │ └─────────────────────────────────────────────┘ ``` ## What Stays in BFF (Infrastructure) These are correctly placed and should NOT be moved: 1. **Database-dependent validation** - `validateUserMapping()` - queries DB for mappings - `validatePaymentMethod()` - queries WHMCS API - `validateSKUs()` - queries Salesforce - `validateInternetDuplication()` - queries WHMCS for existing products - `validateSimSubscription()` - queries DB for subscription details 2. **Service orchestration** - `validateCompleteOrder()` - orchestrates multiple validations - `validateFulfillmentRequest()` - orchestrates SF + payment checks 3. **Infrastructure types** - `InvoiceServiceStats` (monitoring) - `InvoiceHealthStatus` (health checks) - `MappingCacheKey`, `CachedMapping` (caching) ## Implementation Order 1. ✅ Common validation utilities (completed) 2. ✅ Mapping validation (completed) 3. 🔄 **Next**: Invoice validation functions 4. Document pattern in architecture guide