5.3 KiB
5.3 KiB
BFF Business Validation Migration to Domain
Investigation Summary
Found the following validator services in BFF:
- ✅ MappingValidatorService - Already migrated to domain
- ✅ OrderValidator - Already uses domain validation helpers
- 🔄 InvoiceValidatorService - Has pure validation functions to migrate
- ❌ OrderFulfillmentValidator - Pure infrastructure (DB/API calls)
- ❌ 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:
// 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_PAGINATIONconstants ✅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
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!
SimValidationServiceis pure infrastructure (fetches from DB, checks subscription type)- No pure business logic to extract
Migration Plan
Phase 1: Invoice Validation
- Create
packages/domain/billing/validation.tswith pure validation functions - Add
InvoiceValidationResulttopackages/domain/billing/contract.ts - Update
packages/domain/billing/index.tsto export validation - Refactor
InvoiceValidatorServiceto delegate to domain functions - Add logging wrapper (infrastructure concern) in BFF service
Phase 2: Common URL Validation
The validateReturnUrl() function is generic enough for domain/common/validation.ts:
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:
-
Database-dependent validation
validateUserMapping()- queries DB for mappingsvalidatePaymentMethod()- queries WHMCS APIvalidateSKUs()- queries SalesforcevalidateInternetDuplication()- queries WHMCS for existing productsvalidateSimSubscription()- queries DB for subscription details
-
Service orchestration
validateCompleteOrder()- orchestrates multiple validationsvalidateFulfillmentRequest()- orchestrates SF + payment checks
-
Infrastructure types
InvoiceServiceStats(monitoring)InvoiceHealthStatus(health checks)MappingCacheKey,CachedMapping(caching)
Implementation Order
- ✅ Common validation utilities (completed)
- ✅ Mapping validation (completed)
- 🔄 Next: Invoice validation functions
- Document pattern in architecture guide