From a23a5593f7430e90a201e3f40cebfef7c6f8388f Mon Sep 17 00:00:00 2001 From: barsa Date: Thu, 15 Jan 2026 18:50:52 +0900 Subject: [PATCH] refactor(bff): restructure service architecture with clearer naming conventions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename integration orchestrators to facades: - WhmcsConnectionOrchestratorService → WhmcsConnectionFacade - FreebitOperationsService → FreebitFacade - SalesforceService → SalesforceFacade - Rename module orchestrator: - SimOrchestratorService → SimOrchestrator - Rename aggregators for clarity: - MeStatusService → MeStatusAggregator - UserProfileService → UserProfileAggregator - Move integration facades to dedicated facades/ folders: - whmcs/facades/whmcs.facade.ts - salesforce/facades/salesforce.facade.ts - freebit/facades/freebit.facade.ts This establishes clearer architectural boundaries between: - Facades: unified entry points for integration subsystems - Orchestrators: coordinate workflows across multiple services - Aggregators: read-only data composition from multiple sources Co-Authored-By: Claude Opus 4.5 --- .../freebit.facade.ts} | 25 ++++++++++--------- .../integrations/freebit/freebit.module.ts | 6 ++--- .../integrations/freebit/services/index.ts | 2 +- .../salesforce.facade.ts} | 15 ++++++----- .../salesforce/salesforce.module.ts | 6 ++--- .../whmcs.facade.ts} | 23 +++++++++++------ .../whmcs-account-discovery.service.ts | 4 +-- .../whmcs/services/whmcs-client.service.ts | 4 +-- .../whmcs/services/whmcs-currency.service.ts | 4 +-- .../whmcs/services/whmcs-invoice.service.ts | 4 +-- .../whmcs/services/whmcs-order.service.ts | 4 +-- .../whmcs/services/whmcs-payment.service.ts | 4 +-- .../whmcs/services/whmcs-sso.service.ts | 4 +-- .../services/whmcs-subscription.service.ts | 4 +-- .../src/integrations/whmcs/whmcs.module.ts | 8 +++--- .../auth/application/auth-health.service.ts | 8 +++--- .../modules/auth/application/auth.facade.ts | 4 +-- .../workflows/get-started-workflow.service.ts | 4 +-- .../workflows/signup-workflow.service.ts | 4 +-- .../signup/signup-account-resolver.service.ts | 4 +-- .../workflows/whmcs-link-workflow.service.ts | 4 +-- .../modules/me-status/me-status.controller.ts | 4 +-- .../src/modules/me-status/me-status.module.ts | 4 +-- .../modules/me-status/me-status.service.ts | 9 ++++++- .../orders/queue/provisioning.processor.ts | 4 +-- .../order-fulfillment-orchestrator.service.ts | 4 +-- .../order-fulfillment-validator.service.ts | 4 +-- .../services/order-validator.service.ts | 4 +-- .../services/payment-validator.service.ts | 4 +-- .../services/sim-fulfillment.service.ts | 4 +-- .../application/sim-services.service.ts | 4 +-- .../services/internet-cancellation.service.ts | 4 +-- .../subscriptions/sim-management.service.ts | 4 +-- .../subscriptions/sim-management/index.ts | 2 +- .../queue/sim-management.processor.ts | 4 +-- .../services/esim-management.service.ts | 4 +-- .../services/sim-cancellation.service.ts | 4 +-- .../services/sim-details.service.ts | 4 +-- .../services/sim-orchestrator.service.ts | 7 +++++- .../services/sim-plan.service.ts | 4 +-- .../services/sim-topup.service.ts | 4 +-- .../services/sim-usage.service.ts | 4 +-- .../sim-management/sim-management.module.ts | 6 ++--- .../sim-order-activation.service.ts | 4 +-- .../subscriptions/subscriptions.service.ts | 4 +-- .../modules/users/application/users.facade.ts | 4 +-- .../users/infra/user-profile.service.ts | 13 +++++++--- apps/bff/src/modules/users/users.module.ts | 6 ++--- 48 files changed, 152 insertions(+), 120 deletions(-) rename apps/bff/src/integrations/freebit/{services/freebit-operations.service.ts => facades/freebit.facade.ts} (89%) rename apps/bff/src/integrations/salesforce/{salesforce.service.ts => facades/salesforce.facade.ts} (94%) rename apps/bff/src/integrations/whmcs/{connection/services/whmcs-connection-orchestrator.service.ts => facades/whmcs.facade.ts} (93%) diff --git a/apps/bff/src/integrations/freebit/services/freebit-operations.service.ts b/apps/bff/src/integrations/freebit/facades/freebit.facade.ts similarity index 89% rename from apps/bff/src/integrations/freebit/services/freebit-operations.service.ts rename to apps/bff/src/integrations/freebit/facades/freebit.facade.ts index 5f75be7c..4273196b 100644 --- a/apps/bff/src/integrations/freebit/services/freebit-operations.service.ts +++ b/apps/bff/src/integrations/freebit/facades/freebit.facade.ts @@ -1,23 +1,24 @@ import { Injectable } from "@nestjs/common"; -import { FreebitAccountService } from "./freebit-account.service.js"; -import { FreebitUsageService } from "./freebit-usage.service.js"; -import { FreebitPlanService } from "./freebit-plan.service.js"; -import { FreebitVoiceService } from "./freebit-voice.service.js"; -import { FreebitCancellationService } from "./freebit-cancellation.service.js"; -import { FreebitEsimService, type EsimActivationParams } from "./freebit-esim.service.js"; -import { FreebitMapperService } from "./freebit-mapper.service.js"; +import { FreebitAccountService } from "../services/freebit-account.service.js"; +import { FreebitUsageService } from "../services/freebit-usage.service.js"; +import { FreebitPlanService } from "../services/freebit-plan.service.js"; +import { FreebitVoiceService } from "../services/freebit-voice.service.js"; +import { FreebitCancellationService } from "../services/freebit-cancellation.service.js"; +import { FreebitEsimService, type EsimActivationParams } from "../services/freebit-esim.service.js"; +import { FreebitMapperService } from "../services/freebit-mapper.service.js"; import type { SimDetails, SimUsage, SimTopUpHistory } from "../interfaces/freebit.types.js"; /** - * Freebit Operations Facade + * Freebit Facade * - * Unified interface for all Freebit SIM operations. + * Unified entry point for all Freebit SIM operations. * Delegates to specialized services for each operation type. * - * This service handles account normalization automatically, so consumers + * This facade handles account normalization automatically, so consumers * don't need to worry about formatting phone numbers correctly. * - * Services: + * @remarks + * Specialized services: * - FreebitAccountService: SIM details, health checks * - FreebitUsageService: Usage queries, top-ups, quota history * - FreebitPlanService: Plan changes (PA05-21) @@ -26,7 +27,7 @@ import type { SimDetails, SimUsage, SimTopUpHistory } from "../interfaces/freebi * - FreebitEsimService: eSIM profile management */ @Injectable() -export class FreebitOperationsService { +export class FreebitFacade { constructor( private readonly accountService: FreebitAccountService, private readonly usageService: FreebitUsageService, diff --git a/apps/bff/src/integrations/freebit/freebit.module.ts b/apps/bff/src/integrations/freebit/freebit.module.ts index 00ae6e2e..4f89f8c2 100644 --- a/apps/bff/src/integrations/freebit/freebit.module.ts +++ b/apps/bff/src/integrations/freebit/freebit.module.ts @@ -1,6 +1,6 @@ import { Module } from "@nestjs/common"; import { FreebitMapperService } from "./services/freebit-mapper.service.js"; -import { FreebitOperationsService } from "./services/freebit-operations.service.js"; +import { FreebitFacade } from "./facades/freebit.facade.js"; import { FreebitClientService } from "./services/freebit-client.service.js"; import { FreebitAuthService } from "./services/freebit-auth.service.js"; import { FreebitRateLimiterService } from "./services/freebit-rate-limiter.service.js"; @@ -30,13 +30,13 @@ import { VoiceOptionsModule } from "../../modules/voice-options/voice-options.mo FreebitCancellationService, FreebitEsimService, // Facade (delegates to specialized services, handles account normalization) - FreebitOperationsService, + FreebitFacade, ], exports: [ // Export error handler FreebitErrorHandlerService, // Export main facade for all Freebit operations - FreebitOperationsService, + FreebitFacade, // Export specialized services for direct access if needed FreebitAccountService, FreebitUsageService, diff --git a/apps/bff/src/integrations/freebit/services/index.ts b/apps/bff/src/integrations/freebit/services/index.ts index da34e24b..6822bbe7 100644 --- a/apps/bff/src/integrations/freebit/services/index.ts +++ b/apps/bff/src/integrations/freebit/services/index.ts @@ -1,6 +1,6 @@ // Export all Freebit services export { FreebitMapperService } from "./freebit-mapper.service.js"; -export { FreebitOperationsService } from "./freebit-operations.service.js"; +export { FreebitFacade } from "../facades/freebit.facade.js"; export { FreebitRateLimiterService } from "./freebit-rate-limiter.service.js"; export { FreebitAccountService } from "./freebit-account.service.js"; export { FreebitUsageService } from "./freebit-usage.service.js"; diff --git a/apps/bff/src/integrations/salesforce/salesforce.service.ts b/apps/bff/src/integrations/salesforce/facades/salesforce.facade.ts similarity index 94% rename from apps/bff/src/integrations/salesforce/salesforce.service.ts rename to apps/bff/src/integrations/salesforce/facades/salesforce.facade.ts index 00bf24ad..a3681f1a 100644 --- a/apps/bff/src/integrations/salesforce/salesforce.service.ts +++ b/apps/bff/src/integrations/salesforce/facades/salesforce.facade.ts @@ -3,19 +3,22 @@ import type { OnModuleInit } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { ConfigService } from "@nestjs/config"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; -import { SalesforceConnection } from "./services/salesforce-connection.service.js"; +import { SalesforceConnection } from "../services/salesforce-connection.service.js"; import { SalesforceAccountService, type SalesforceAccountPortalUpdate, type UpdateSalesforceContactAddressRequest, -} from "./services/salesforce-account.service.js"; +} from "../services/salesforce-account.service.js"; import { SalesforceOperationException } from "@bff/core/exceptions/domain-exceptions.js"; import type { SalesforceOrderRecord } from "@customer-portal/domain/orders/providers"; /** - * Salesforce Service - Facade for Salesforce operations + * Salesforce Facade * - * Account Methods (Actually Used): + * Unified entry point for Salesforce operations used across the BFF. + * + * @remarks + * Account Methods: * - findAccountByCustomerNumber() - Used in signup/WHMCS linking workflows * - getAccountDetails() - Used in signup to check WH_Account__c field * @@ -23,10 +26,10 @@ import type { SalesforceOrderRecord } from "@customer-portal/domain/orders/provi * - updateOrder() - Used in order provisioning * - getOrder() - Used to fetch order details * - * Note: Internet Eligibility checking happens in internet-catalog.service.ts + * Note: For complex queries, use specialized services (SalesforceOrderService, etc.) */ @Injectable() -export class SalesforceService implements OnModuleInit { +export class SalesforceFacade implements OnModuleInit { constructor( private configService: ConfigService, private connection: SalesforceConnection, diff --git a/apps/bff/src/integrations/salesforce/salesforce.module.ts b/apps/bff/src/integrations/salesforce/salesforce.module.ts index db2d7b8e..f547ccbf 100644 --- a/apps/bff/src/integrations/salesforce/salesforce.module.ts +++ b/apps/bff/src/integrations/salesforce/salesforce.module.ts @@ -1,7 +1,7 @@ import { Module } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; import { QueueModule } from "@bff/infra/queue/queue.module.js"; -import { SalesforceService } from "./salesforce.service.js"; +import { SalesforceFacade } from "./facades/salesforce.facade.js"; import { SalesforceConnection } from "./services/salesforce-connection.service.js"; import { SalesforceAccountService } from "./services/salesforce-account.service.js"; import { SalesforceOrderService } from "./services/salesforce-order.service.js"; @@ -31,14 +31,14 @@ import { SalesforceErrorHandlerService } from "./services/salesforce-error-handl // Opportunity facade (depends on decomposed services) SalesforceOpportunityService, OpportunityResolutionService, - SalesforceService, + SalesforceFacade, SalesforceReadThrottleGuard, SalesforceWriteThrottleGuard, ], exports: [ QueueModule, SalesforceErrorHandlerService, - SalesforceService, + SalesforceFacade, SalesforceConnection, SalesforceAccountService, SalesforceOrderService, diff --git a/apps/bff/src/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.ts b/apps/bff/src/integrations/whmcs/facades/whmcs.facade.ts similarity index 93% rename from apps/bff/src/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.ts rename to apps/bff/src/integrations/whmcs/facades/whmcs.facade.ts index 710a87d5..bde2d74a 100644 --- a/apps/bff/src/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.ts +++ b/apps/bff/src/integrations/whmcs/facades/whmcs.facade.ts @@ -2,9 +2,9 @@ import { Injectable, Inject } from "@nestjs/common"; import type { OnModuleInit } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; -import { WhmcsConfigService } from "../config/whmcs-config.service.js"; -import { WhmcsHttpClientService } from "./whmcs-http-client.service.js"; -import { WhmcsErrorHandlerService } from "./whmcs-error-handler.service.js"; +import { WhmcsConfigService } from "../connection/config/whmcs-config.service.js"; +import { WhmcsHttpClientService } from "../connection/services/whmcs-http-client.service.js"; +import { WhmcsErrorHandlerService } from "../connection/services/whmcs-error-handler.service.js"; import { WhmcsRequestQueueService } from "@bff/infra/queue/services/whmcs-request-queue.service.js"; import type { WhmcsAddClientParams, @@ -37,14 +37,23 @@ import type { } from "@customer-portal/domain/subscriptions/providers"; import type { WhmcsCatalogProductListResponse } from "@customer-portal/domain/services/providers"; import type { WhmcsErrorResponse } from "@customer-portal/domain/common/providers"; -import type { WhmcsRequestOptions, WhmcsConnectionStats } from "../types/connection.types.js"; +import type { + WhmcsRequestOptions, + WhmcsConnectionStats, +} from "../connection/types/connection.types.js"; /** - * Main orchestrator service for WHMCS connections - * Single path for all WHMCS requests with queue management and error handling + * WHMCS Connection Facade + * + * Single entry point for all WHMCS API operations. + * Provides unified interface with queue management, error handling, and request prioritization. + * + * @remarks + * All WHMCS entity services (Invoice, Client, Subscription, etc.) delegate to this facade + * for actual API communication. This ensures consistent error handling and rate limiting. */ @Injectable() -export class WhmcsConnectionOrchestratorService implements OnModuleInit { +export class WhmcsConnectionFacade implements OnModuleInit { constructor( @Inject(Logger) private readonly logger: Logger, private readonly configService: WhmcsConfigService, diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-account-discovery.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-account-discovery.service.ts index ff31d0ac..fe29b6fd 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-account-discovery.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-account-discovery.service.ts @@ -1,7 +1,7 @@ import { Injectable, NotFoundException, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import { transformWhmcsClientResponse } from "@customer-portal/domain/customer/providers"; import type { WhmcsClient } from "@customer-portal/domain/customer"; @@ -13,7 +13,7 @@ import type { WhmcsClient } from "@customer-portal/domain/customer"; @Injectable() export class WhmcsAccountDiscoveryService { constructor( - private readonly connectionService: WhmcsConnectionOrchestratorService, + private readonly connectionService: WhmcsConnectionFacade, private readonly cacheService: WhmcsCacheService, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-client.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-client.service.ts index 09a6feaf..19ce52b1 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-client.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-client.service.ts @@ -1,7 +1,7 @@ import { Injectable, NotFoundException, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import type { WhmcsValidateLoginParams, @@ -19,7 +19,7 @@ import { addressSchema, type Address, type WhmcsClient } from "@customer-portal/ @Injectable() export class WhmcsClientService { constructor( - private readonly connectionService: WhmcsConnectionOrchestratorService, + private readonly connectionService: WhmcsConnectionFacade, private readonly cacheService: WhmcsCacheService, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-currency.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-currency.service.ts index 86a8f5ab..e2583a24 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-currency.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-currency.service.ts @@ -3,7 +3,7 @@ import type { OnModuleInit, OnModuleDestroy } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions.js"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { FALLBACK_CURRENCY } from "@customer-portal/domain/billing"; import type { Currency } from "@customer-portal/domain/billing"; import type { WhmcsCurrenciesResponse } from "@customer-portal/domain/billing/providers"; @@ -17,7 +17,7 @@ export class WhmcsCurrencyService implements OnModuleInit, OnModuleDestroy { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly connectionService: WhmcsConnectionOrchestratorService + private readonly connectionService: WhmcsConnectionFacade ) {} async onModuleInit() { diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-invoice.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-invoice.service.ts index 6fe80e9d..1f7d869d 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-invoice.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-invoice.service.ts @@ -6,7 +6,7 @@ import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions. import { invoiceListSchema, invoiceSchema } from "@customer-portal/domain/billing"; import type { Invoice, InvoiceList } from "@customer-portal/domain/billing"; import { transformWhmcsInvoice } from "@customer-portal/domain/billing/providers"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { WhmcsCurrencyService } from "./whmcs-currency.service.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import type { @@ -31,7 +31,7 @@ export type InvoiceFilters = Partial<{ export class WhmcsInvoiceService { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly connectionService: WhmcsConnectionOrchestratorService, + private readonly connectionService: WhmcsConnectionFacade, private readonly currencyService: WhmcsCurrencyService, private readonly cacheService: WhmcsCacheService ) {} diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-order.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-order.service.ts index d6505e9b..32bcf133 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-order.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-order.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions.js"; @@ -21,7 +21,7 @@ export type { WhmcsOrderItem, WhmcsAddOrderParams, WhmcsOrderResult }; @Injectable() export class WhmcsOrderService { constructor( - private readonly connection: WhmcsConnectionOrchestratorService, + private readonly connection: WhmcsConnectionFacade, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-payment.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-payment.service.ts index 9ae64500..9f1aece2 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-payment.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-payment.service.ts @@ -13,7 +13,7 @@ import type { } from "@customer-portal/domain/payments"; import type { WhmcsCatalogProductNormalized } from "@customer-portal/domain/services/providers"; import { transformWhmcsCatalogProductsResponse } from "@customer-portal/domain/services/providers"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import type { WhmcsCreateSsoTokenParams } from "@customer-portal/domain/customer/providers"; import type { @@ -28,7 +28,7 @@ import type { export class WhmcsPaymentService { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly connectionService: WhmcsConnectionOrchestratorService, + private readonly connectionService: WhmcsConnectionFacade, private readonly cacheService: WhmcsCacheService ) {} diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-sso.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-sso.service.ts index 7e126bd5..5a3e74ba 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-sso.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-sso.service.ts @@ -1,7 +1,7 @@ import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { Logger } from "nestjs-pino"; import { Injectable, Inject } from "@nestjs/common"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import type { WhmcsCreateSsoTokenParams, WhmcsSsoResponse, @@ -11,7 +11,7 @@ import type { export class WhmcsSsoService { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly connectionService: WhmcsConnectionOrchestratorService + private readonly connectionService: WhmcsConnectionFacade ) {} /** diff --git a/apps/bff/src/integrations/whmcs/services/whmcs-subscription.service.ts b/apps/bff/src/integrations/whmcs/services/whmcs-subscription.service.ts index fd4d00db..f725057e 100644 --- a/apps/bff/src/integrations/whmcs/services/whmcs-subscription.service.ts +++ b/apps/bff/src/integrations/whmcs/services/whmcs-subscription.service.ts @@ -7,7 +7,7 @@ import { transformWhmcsSubscriptionListResponse, } from "@customer-portal/domain/subscriptions/providers"; import type { Subscription, SubscriptionList } from "@customer-portal/domain/subscriptions"; -import { WhmcsConnectionOrchestratorService } from "../connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "../facades/whmcs.facade.js"; import { WhmcsCurrencyService } from "./whmcs-currency.service.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import type { WhmcsGetClientsProductsParams } from "@customer-portal/domain/subscriptions/providers"; @@ -20,7 +20,7 @@ export interface SubscriptionFilters { export class WhmcsSubscriptionService { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly connectionService: WhmcsConnectionOrchestratorService, + private readonly connectionService: WhmcsConnectionFacade, private readonly currencyService: WhmcsCurrencyService, private readonly cacheService: WhmcsCacheService ) {} diff --git a/apps/bff/src/integrations/whmcs/whmcs.module.ts b/apps/bff/src/integrations/whmcs/whmcs.module.ts index 9b2ab233..1b771d2b 100644 --- a/apps/bff/src/integrations/whmcs/whmcs.module.ts +++ b/apps/bff/src/integrations/whmcs/whmcs.module.ts @@ -11,7 +11,7 @@ import { WhmcsOrderService } from "./services/whmcs-order.service.js"; import { WhmcsCurrencyService } from "./services/whmcs-currency.service.js"; import { WhmcsAccountDiscoveryService } from "./services/whmcs-account-discovery.service.js"; // Connection services -import { WhmcsConnectionOrchestratorService } from "./connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "./facades/whmcs.facade.js"; import { WhmcsConfigService } from "./connection/config/whmcs-config.service.js"; import { WhmcsHttpClientService } from "./connection/services/whmcs-http-client.service.js"; import { WhmcsErrorHandlerService } from "./connection/services/whmcs-error-handler.service.js"; @@ -19,8 +19,8 @@ import { WhmcsErrorHandlerService } from "./connection/services/whmcs-error-hand @Module({ imports: [ConfigModule, QueueModule], providers: [ - // Connection services (single path: orchestrator → httpClient) - WhmcsConnectionOrchestratorService, + // Connection facade (single path: facade → httpClient) + WhmcsConnectionFacade, WhmcsConfigService, WhmcsHttpClientService, WhmcsErrorHandlerService, @@ -36,7 +36,7 @@ import { WhmcsErrorHandlerService } from "./connection/services/whmcs-error-hand WhmcsAccountDiscoveryService, ], exports: [ - WhmcsConnectionOrchestratorService, + WhmcsConnectionFacade, WhmcsCacheService, WhmcsClientService, WhmcsOrderService, diff --git a/apps/bff/src/modules/auth/application/auth-health.service.ts b/apps/bff/src/modules/auth/application/auth-health.service.ts index 6284cd98..bc9beb88 100644 --- a/apps/bff/src/modules/auth/application/auth-health.service.ts +++ b/apps/bff/src/modules/auth/application/auth-health.service.ts @@ -5,8 +5,8 @@ import { Injectable, Inject } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; import { Logger } from "nestjs-pino"; import { UsersFacade } from "@bff/modules/users/application/users.facade.js"; -import { WhmcsConnectionOrchestratorService } from "@bff/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { WhmcsConnectionFacade } from "@bff/integrations/whmcs/facades/whmcs.facade.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; export interface AuthHealthCheckResult { @@ -32,8 +32,8 @@ export class AuthHealthService { constructor( private readonly usersFacade: UsersFacade, private readonly configService: ConfigService, - private readonly whmcsConnectionService: WhmcsConnectionOrchestratorService, - private readonly salesforceService: SalesforceService, + private readonly whmcsConnectionService: WhmcsConnectionFacade, + private readonly salesforceService: SalesforceFacade, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/auth/application/auth.facade.ts b/apps/bff/src/modules/auth/application/auth.facade.ts index 052a2a1a..97b6ab70 100644 --- a/apps/bff/src/modules/auth/application/auth.facade.ts +++ b/apps/bff/src/modules/auth/application/auth.facade.ts @@ -3,7 +3,7 @@ import { UsersFacade } from "@bff/modules/users/application/users.facade.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { WhmcsAccountDiscoveryService } from "@bff/integrations/whmcs/services/whmcs-account-discovery.service.js"; import { WhmcsSsoService } from "@bff/integrations/whmcs/services/whmcs-sso.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { AuditService, AuditAction } from "@bff/infra/audit/audit.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { Logger } from "nestjs-pino"; @@ -47,7 +47,7 @@ export class AuthFacade { private readonly mappingsService: MappingsService, private readonly whmcsSsoService: WhmcsSsoService, private readonly discoveryService: WhmcsAccountDiscoveryService, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly auditService: AuditService, private readonly tokenBlacklistService: TokenBlacklistService, private readonly signupWorkflow: SignupWorkflowService, diff --git a/apps/bff/src/modules/auth/infra/workflows/get-started-workflow.service.ts b/apps/bff/src/modules/auth/infra/workflows/get-started-workflow.service.ts index a54814c5..1b2d82bb 100644 --- a/apps/bff/src/modules/auth/infra/workflows/get-started-workflow.service.ts +++ b/apps/bff/src/modules/auth/infra/workflows/get-started-workflow.service.ts @@ -42,7 +42,7 @@ import { PORTAL_STATUS_ACTIVE, PORTAL_STATUS_NOT_YET, } from "@bff/modules/auth/constants/portal.constants.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; /** * Remove undefined properties from an object (for exactOptionalPropertyTypes compatibility) @@ -74,7 +74,7 @@ export class GetStartedWorkflowService { private readonly mappingsService: MappingsService, private readonly auditService: AuditService, private readonly salesforceAccountService: SalesforceAccountService, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly opportunityResolution: OpportunityResolutionService, private readonly workflowCases: WorkflowCaseManager, private readonly whmcsDiscovery: WhmcsAccountDiscoveryService, diff --git a/apps/bff/src/modules/auth/infra/workflows/signup-workflow.service.ts b/apps/bff/src/modules/auth/infra/workflows/signup-workflow.service.ts index e9330975..19b63549 100644 --- a/apps/bff/src/modules/auth/infra/workflows/signup-workflow.service.ts +++ b/apps/bff/src/modules/auth/infra/workflows/signup-workflow.service.ts @@ -5,7 +5,7 @@ import type { Request } from "express"; import { AuditService, AuditAction } from "@bff/infra/audit/audit.service.js"; import { UsersFacade } from "@bff/modules/users/application/users.facade.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { AuthTokenService } from "../token/token.service.js"; import { AuthRateLimitService } from "../rate-limiting/auth-rate-limit.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; @@ -42,7 +42,7 @@ export class SignupWorkflowService { constructor( private readonly usersFacade: UsersFacade, private readonly mappingsService: MappingsService, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly auditService: AuditService, private readonly tokenService: AuthTokenService, private readonly authRateLimitService: AuthRateLimitService, diff --git a/apps/bff/src/modules/auth/infra/workflows/signup/signup-account-resolver.service.ts b/apps/bff/src/modules/auth/infra/workflows/signup/signup-account-resolver.service.ts index 8b780636..4e9d0dbd 100644 --- a/apps/bff/src/modules/auth/infra/workflows/signup/signup-account-resolver.service.ts +++ b/apps/bff/src/modules/auth/infra/workflows/signup/signup-account-resolver.service.ts @@ -4,7 +4,7 @@ import { Injectable, Inject, BadRequestException, ConflictException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { CacheService } from "@bff/infra/cache/cache.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { SalesforceAccountService } from "@bff/integrations/salesforce/services/salesforce-account.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import type { SignupRequest } from "@customer-portal/domain/auth"; @@ -17,7 +17,7 @@ export class SignupAccountResolverService { private readonly cachePrefix = "auth:signup:account:"; constructor( - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly salesforceAccountService: SalesforceAccountService, private readonly cache: CacheService, @Inject(Logger) private readonly logger: Logger diff --git a/apps/bff/src/modules/auth/infra/workflows/whmcs-link-workflow.service.ts b/apps/bff/src/modules/auth/infra/workflows/whmcs-link-workflow.service.ts index 7aa8cbc6..d9d3b69a 100644 --- a/apps/bff/src/modules/auth/infra/workflows/whmcs-link-workflow.service.ts +++ b/apps/bff/src/modules/auth/infra/workflows/whmcs-link-workflow.service.ts @@ -10,7 +10,7 @@ import { UsersFacade } from "@bff/modules/users/application/users.facade.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { WhmcsAccountDiscoveryService } from "@bff/integrations/whmcs/services/whmcs-account-discovery.service.js"; import { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { mapPrismaUserToDomain } from "@bff/infra/mappers/index.js"; import { getCustomFieldValue } from "@customer-portal/domain/customer/providers"; @@ -28,7 +28,7 @@ export class WhmcsLinkWorkflowService { private readonly mappingsService: MappingsService, private readonly whmcsClientService: WhmcsClientService, private readonly discoveryService: WhmcsAccountDiscoveryService, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/me-status/me-status.controller.ts b/apps/bff/src/modules/me-status/me-status.controller.ts index 99413bb2..2ed963eb 100644 --- a/apps/bff/src/modules/me-status/me-status.controller.ts +++ b/apps/bff/src/modules/me-status/me-status.controller.ts @@ -1,12 +1,12 @@ import { Controller, Get, Req, UseGuards } from "@nestjs/common"; import type { RequestWithUser } from "@bff/modules/auth/auth.types.js"; import { SalesforceReadThrottleGuard } from "@bff/integrations/salesforce/guards/salesforce-read-throttle.guard.js"; -import { MeStatusService } from "./me-status.service.js"; +import { MeStatusAggregator } from "./me-status.service.js"; import type { MeStatus } from "@customer-portal/domain/dashboard"; @Controller("me") export class MeStatusController { - constructor(private readonly meStatus: MeStatusService) {} + constructor(private readonly meStatus: MeStatusAggregator) {} @UseGuards(SalesforceReadThrottleGuard) @Get("status") diff --git a/apps/bff/src/modules/me-status/me-status.module.ts b/apps/bff/src/modules/me-status/me-status.module.ts index e06f3711..ead92567 100644 --- a/apps/bff/src/modules/me-status/me-status.module.ts +++ b/apps/bff/src/modules/me-status/me-status.module.ts @@ -1,6 +1,6 @@ import { Module } from "@nestjs/common"; import { MeStatusController } from "./me-status.controller.js"; -import { MeStatusService } from "./me-status.service.js"; +import { MeStatusAggregator } from "./me-status.service.js"; import { UsersModule } from "@bff/modules/users/users.module.js"; import { OrdersModule } from "@bff/modules/orders/orders.module.js"; import { ServicesModule } from "@bff/modules/services/services.module.js"; @@ -22,6 +22,6 @@ import { SalesforceModule } from "@bff/integrations/salesforce/salesforce.module SalesforceModule, ], controllers: [MeStatusController], - providers: [MeStatusService], + providers: [MeStatusAggregator], }) export class MeStatusModule {} diff --git a/apps/bff/src/modules/me-status/me-status.service.ts b/apps/bff/src/modules/me-status/me-status.service.ts index aec1e607..7bc40761 100644 --- a/apps/bff/src/modules/me-status/me-status.service.ts +++ b/apps/bff/src/modules/me-status/me-status.service.ts @@ -22,8 +22,15 @@ import { } from "@customer-portal/domain/customer"; import type { OrderSummary } from "@customer-portal/domain/orders"; +/** + * Me Status Aggregator + * + * Read-only aggregator that combines data from multiple sources + * (users, orders, eligibility, verification, payments, notifications) + * to build the dashboard status response. + */ @Injectable() -export class MeStatusService { +export class MeStatusAggregator { constructor( private readonly users: UsersFacade, private readonly orders: OrderOrchestrator, diff --git a/apps/bff/src/modules/orders/queue/provisioning.processor.ts b/apps/bff/src/modules/orders/queue/provisioning.processor.ts index 94971e1d..be8a29d3 100644 --- a/apps/bff/src/modules/orders/queue/provisioning.processor.ts +++ b/apps/bff/src/modules/orders/queue/provisioning.processor.ts @@ -2,7 +2,7 @@ import { Processor, WorkerHost } from "@nestjs/bullmq"; import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { OrderFulfillmentOrchestrator } from "../services/order-fulfillment-orchestrator.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import type { ProvisioningJobData } from "./provisioning.queue.js"; import { QUEUE_NAMES } from "@bff/infra/queue/queue.constants.js"; @@ -11,7 +11,7 @@ import { QUEUE_NAMES } from "@bff/infra/queue/queue.constants.js"; export class ProvisioningProcessor extends WorkerHost { constructor( private readonly orchestrator: OrderFulfillmentOrchestrator, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, @Inject(Logger) private readonly logger: Logger ) { super(); diff --git a/apps/bff/src/modules/orders/services/order-fulfillment-orchestrator.service.ts b/apps/bff/src/modules/orders/services/order-fulfillment-orchestrator.service.ts index 85826937..8f08e747 100644 --- a/apps/bff/src/modules/orders/services/order-fulfillment-orchestrator.service.ts +++ b/apps/bff/src/modules/orders/services/order-fulfillment-orchestrator.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { SalesforceOpportunityService } from "@bff/integrations/salesforce/services/salesforce-opportunity.service.js"; import { WhmcsOrderService } from "@bff/integrations/whmcs/services/whmcs-order.service.js"; import type { WhmcsOrderResult } from "@bff/integrations/whmcs/services/whmcs-order.service.js"; @@ -54,7 +54,7 @@ export interface OrderFulfillmentContext { export class OrderFulfillmentOrchestrator { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly opportunityService: SalesforceOpportunityService, private readonly whmcsOrderService: WhmcsOrderService, private readonly orderOrchestrator: OrderOrchestrator, diff --git a/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts b/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts index d30ec6e5..f64d0b8c 100644 --- a/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts +++ b/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts @@ -1,6 +1,6 @@ import { Injectable, BadRequestException, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { sfOrderIdParamSchema } from "@customer-portal/domain/orders"; @@ -19,7 +19,7 @@ import { PaymentValidatorService } from "./payment-validator.service.js"; export class OrderFulfillmentValidator { constructor( @Inject(Logger) private readonly logger: Logger, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly mappingsService: MappingsService, private readonly paymentValidator: PaymentValidatorService ) {} diff --git a/apps/bff/src/modules/orders/services/order-validator.service.ts b/apps/bff/src/modules/orders/services/order-validator.service.ts index 541364bc..741a08f2 100644 --- a/apps/bff/src/modules/orders/services/order-validator.service.ts +++ b/apps/bff/src/modules/orders/services/order-validator.service.ts @@ -2,7 +2,7 @@ import { Injectable, BadRequestException, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { ZodError } from "zod"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; -import { WhmcsConnectionOrchestratorService } from "@bff/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "@bff/integrations/whmcs/facades/whmcs.facade.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { orderWithSkuValidationSchema, @@ -29,7 +29,7 @@ export class OrderValidator { constructor( @Inject(Logger) private readonly logger: Logger, private readonly mappings: MappingsService, - private readonly whmcs: WhmcsConnectionOrchestratorService, + private readonly whmcs: WhmcsConnectionFacade, private readonly pricebookService: OrderPricebookService, private readonly simCatalogService: SimServicesService, private readonly internetEligibilityService: InternetEligibilityService, diff --git a/apps/bff/src/modules/orders/services/payment-validator.service.ts b/apps/bff/src/modules/orders/services/payment-validator.service.ts index 0dd694a2..6b65fab3 100644 --- a/apps/bff/src/modules/orders/services/payment-validator.service.ts +++ b/apps/bff/src/modules/orders/services/payment-validator.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { WhmcsConnectionOrchestratorService } from "@bff/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "@bff/integrations/whmcs/facades/whmcs.facade.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; /** @@ -12,7 +12,7 @@ import { extractErrorMessage } from "@bff/core/utils/error.util.js"; @Injectable() export class PaymentValidatorService { constructor( - private readonly whmcs: WhmcsConnectionOrchestratorService, + private readonly whmcs: WhmcsConnectionFacade, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/orders/services/sim-fulfillment.service.ts b/apps/bff/src/modules/orders/services/sim-fulfillment.service.ts index 4dde7dd9..e311d57f 100644 --- a/apps/bff/src/modules/orders/services/sim-fulfillment.service.ts +++ b/apps/bff/src/modules/orders/services/sim-fulfillment.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import type { OrderDetails, OrderItemDetails } from "@customer-portal/domain/orders"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { @@ -16,7 +16,7 @@ export interface SimFulfillmentRequest { @Injectable() export class SimFulfillmentService { constructor( - private readonly freebit: FreebitOperationsService, + private readonly freebit: FreebitFacade, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/services/application/sim-services.service.ts b/apps/bff/src/modules/services/application/sim-services.service.ts index 64298442..8e2c591a 100644 --- a/apps/bff/src/modules/services/application/sim-services.service.ts +++ b/apps/bff/src/modules/services/application/sim-services.service.ts @@ -11,7 +11,7 @@ import { mapSimActivationFee, mapSimProduct } from "@customer-portal/domain/serv import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { SalesforceConnection } from "@bff/integrations/salesforce/services/salesforce-connection.service.js"; import { Logger } from "nestjs-pino"; -import { WhmcsConnectionOrchestratorService } from "@bff/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "@bff/integrations/whmcs/facades/whmcs.facade.js"; @Injectable() export class SimServicesService extends BaseServicesService { @@ -20,7 +20,7 @@ export class SimServicesService extends BaseServicesService { configService: ConfigService, @Inject(Logger) logger: Logger, private mappingsService: MappingsService, - private whmcs: WhmcsConnectionOrchestratorService, + private whmcs: WhmcsConnectionFacade, private catalogCache: ServicesCacheService ) { super(sf, configService, logger); diff --git a/apps/bff/src/modules/subscriptions/internet-management/services/internet-cancellation.service.ts b/apps/bff/src/modules/subscriptions/internet-management/services/internet-cancellation.service.ts index 61019d9e..a7e7e580 100644 --- a/apps/bff/src/modules/subscriptions/internet-management/services/internet-cancellation.service.ts +++ b/apps/bff/src/modules/subscriptions/internet-management/services/internet-cancellation.service.ts @@ -13,7 +13,7 @@ import { Injectable, Inject, BadRequestException, NotFoundException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { WhmcsConnectionOrchestratorService } from "@bff/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "@bff/integrations/whmcs/facades/whmcs.facade.js"; import { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { SalesforceOpportunityService } from "@bff/integrations/salesforce/services/salesforce-opportunity.service.js"; @@ -37,7 +37,7 @@ import { NOTIFICATION_SOURCE, NOTIFICATION_TYPE } from "@customer-portal/domain/ @Injectable() export class InternetCancellationService { constructor( - private readonly whmcsConnectionService: WhmcsConnectionOrchestratorService, + private readonly whmcsConnectionService: WhmcsConnectionFacade, private readonly whmcsClientService: WhmcsClientService, private readonly mappingsService: MappingsService, private readonly opportunityService: SalesforceOpportunityService, diff --git a/apps/bff/src/modules/subscriptions/sim-management.service.ts b/apps/bff/src/modules/subscriptions/sim-management.service.ts index b4c6c4b6..8240610d 100644 --- a/apps/bff/src/modules/subscriptions/sim-management.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management.service.ts @@ -1,5 +1,5 @@ import { Injectable } from "@nestjs/common"; -import { SimOrchestratorService } from "./sim-management/services/sim-orchestrator.service.js"; +import { SimOrchestrator } from "./sim-management/services/sim-orchestrator.service.js"; import type { SimDetails, SimUsage, @@ -14,7 +14,7 @@ import type { @Injectable() export class SimManagementService { - constructor(private readonly simOrchestrator: SimOrchestratorService) {} + constructor(private readonly simOrchestrator: SimOrchestrator) {} /** * Debug method to check subscription data for SIM services diff --git a/apps/bff/src/modules/subscriptions/sim-management/index.ts b/apps/bff/src/modules/subscriptions/sim-management/index.ts index 762700a2..c17b874e 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/index.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/index.ts @@ -1,5 +1,5 @@ // Services -export { SimOrchestratorService } from "./services/sim-orchestrator.service.js"; +export { SimOrchestrator } from "./services/sim-orchestrator.service.js"; export { SimDetailsService } from "./services/sim-details.service.js"; export { SimUsageService } from "./services/sim-usage.service.js"; export { SimTopUpService } from "./services/sim-topup.service.js"; diff --git a/apps/bff/src/modules/subscriptions/sim-management/queue/sim-management.processor.ts b/apps/bff/src/modules/subscriptions/sim-management/queue/sim-management.processor.ts index 7768ef71..68de0d3d 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/queue/sim-management.processor.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/queue/sim-management.processor.ts @@ -3,7 +3,7 @@ import { Inject, Injectable } from "@nestjs/common"; import type { Job } from "bullmq"; import { Logger } from "nestjs-pino"; import { QUEUE_NAMES } from "@bff/infra/queue/queue.constants.js"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { SIM_MANAGEMENT_JOB_NAMES as JOB_NAMES, @@ -14,7 +14,7 @@ import { @Injectable() export class SimManagementProcessor extends WorkerHost { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, @Inject(Logger) private readonly logger: Logger ) { super(); diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/esim-management.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/esim-management.service.ts index c2689be1..e6bd42e5 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/esim-management.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/esim-management.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { ConfigService } from "@nestjs/config"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { SimValidationService } from "./sim-validation.service.js"; @@ -12,7 +12,7 @@ import type { SimReissueRequest, SimReissueFullRequest } from "@customer-portal/ @Injectable() export class EsimManagementService { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, private readonly whmcsClientService: WhmcsClientService, private readonly mappingsService: MappingsService, private readonly simValidation: SimValidationService, diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-cancellation.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-cancellation.service.ts index 08c95953..6993332f 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-cancellation.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-cancellation.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { ConfigService } from "@nestjs/config"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { SalesforceOpportunityService } from "@bff/integrations/salesforce/services/salesforce-opportunity.service.js"; @@ -27,7 +27,7 @@ import { NOTIFICATION_SOURCE, NOTIFICATION_TYPE } from "@customer-portal/domain/ @Injectable() export class SimCancellationService { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, private readonly whmcsClientService: WhmcsClientService, private readonly mappingsService: MappingsService, private readonly opportunityService: SalesforceOpportunityService, diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts index 5ca9124c..d750f1e3 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { SimValidationService } from "./sim-validation.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import type { SimDetails } from "@customer-portal/domain/sim"; @@ -8,7 +8,7 @@ import type { SimDetails } from "@customer-portal/domain/sim"; @Injectable() export class SimDetailsService { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, private readonly simValidation: SimValidationService, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts index 50cfd10f..e90cfb65 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts @@ -22,8 +22,13 @@ import type { SimReissueRequest, } from "@customer-portal/domain/sim"; +/** + * SIM Orchestrator + * + * Coordinates all SIM management operations by delegating to specialized services. + */ @Injectable() -export class SimOrchestratorService { +export class SimOrchestrator { constructor( private readonly simDetails: SimDetailsService, private readonly simUsage: SimUsageService, diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-plan.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-plan.service.ts index 238b2f03..10e50f19 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-plan.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-plan.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { ConfigService } from "@nestjs/config"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { SimValidationService } from "./sim-validation.service.js"; import type { SimPlanChangeRequest, @@ -35,7 +35,7 @@ const FREEBIT_PLAN_CODE_TO_SKU: Record = Object.fromEntries( @Injectable() export class SimPlanService { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, private readonly simValidation: SimValidationService, private readonly simSchedule: SimScheduleService, private readonly simQueue: SimManagementQueueService, diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-topup.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-topup.service.ts index 92222612..fce87ffc 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-topup.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-topup.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { ConfigService } from "@nestjs/config"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { SimValidationService } from "./sim-validation.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; @@ -13,7 +13,7 @@ import { SimTopUpPricingService } from "./sim-topup-pricing.service.js"; @Injectable() export class SimTopUpService { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, private readonly mappingsService: MappingsService, private readonly simValidation: SimValidationService, private readonly simBilling: SimBillingService, diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-usage.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-usage.service.ts index cc4a1771..7bc23b1f 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-usage.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-usage.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { SimValidationService } from "./sim-validation.service.js"; import { SimUsageStoreService } from "../../sim-usage-store.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; @@ -14,7 +14,7 @@ import { SimScheduleService } from "./sim-schedule.service.js"; @Injectable() export class SimUsageService { constructor( - private readonly freebitService: FreebitOperationsService, + private readonly freebitService: FreebitFacade, private readonly simValidation: SimValidationService, private readonly usageStore: SimUsageStoreService, private readonly simSchedule: SimScheduleService, diff --git a/apps/bff/src/modules/subscriptions/sim-management/sim-management.module.ts b/apps/bff/src/modules/subscriptions/sim-management/sim-management.module.ts index 0af765a7..9e3b9884 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/sim-management.module.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/sim-management.module.ts @@ -11,7 +11,7 @@ import { SimManagementService } from "../sim-management.service.js"; // SimController is registered in SubscriptionsModule to ensure route order // Import all SIM management services -import { SimOrchestratorService } from "./services/sim-orchestrator.service.js"; +import { SimOrchestrator } from "./services/sim-orchestrator.service.js"; import { SimDetailsService } from "./services/sim-details.service.js"; import { SimUsageService } from "./services/sim-usage.service.js"; import { SimTopUpService } from "./services/sim-topup.service.js"; @@ -65,7 +65,7 @@ import { WorkflowModule } from "@bff/modules/shared/workflow/index.js"; SimPlanService, SimCancellationService, EsimManagementService, - SimOrchestratorService, + SimOrchestrator, SimBillingService, SimScheduleService, SimManagementQueueService, @@ -81,7 +81,7 @@ import { WorkflowModule } from "@bff/modules/shared/workflow/index.js"; }, ], exports: [ - SimOrchestratorService, + SimOrchestrator, // Export individual services in case they're needed elsewhere SimDetailsService, SimUsageService, diff --git a/apps/bff/src/modules/subscriptions/sim-order-activation.service.ts b/apps/bff/src/modules/subscriptions/sim-order-activation.service.ts index 07c3362b..45994837 100644 --- a/apps/bff/src/modules/subscriptions/sim-order-activation.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-order-activation.service.ts @@ -1,6 +1,6 @@ import { Injectable, BadRequestException, Inject, ConflictException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { FreebitOperationsService } from "@bff/integrations/freebit/services/freebit-operations.service.js"; +import { FreebitFacade } from "@bff/integrations/freebit/facades/freebit.facade.js"; import { WhmcsOrderService } from "@bff/integrations/whmcs/services/whmcs-order.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { CacheService } from "@bff/infra/cache/cache.service.js"; @@ -13,7 +13,7 @@ import { SimScheduleService } from "./sim-management/services/sim-schedule.servi @Injectable() export class SimOrderActivationService { constructor( - private readonly freebit: FreebitOperationsService, + private readonly freebit: FreebitFacade, private readonly whmcsOrderService: WhmcsOrderService, private readonly mappings: MappingsService, private readonly cache: CacheService, diff --git a/apps/bff/src/modules/subscriptions/subscriptions.service.ts b/apps/bff/src/modules/subscriptions/subscriptions.service.ts index 230cfc2c..c9e90138 100644 --- a/apps/bff/src/modules/subscriptions/subscriptions.service.ts +++ b/apps/bff/src/modules/subscriptions/subscriptions.service.ts @@ -11,7 +11,7 @@ import type { } from "@customer-portal/domain/subscriptions"; import type { Invoice, InvoiceItem, InvoiceList } from "@customer-portal/domain/billing"; import { WhmcsCacheService } from "@bff/integrations/whmcs/cache/whmcs-cache.service.js"; -import { WhmcsConnectionOrchestratorService } from "@bff/integrations/whmcs/connection/services/whmcs-connection-orchestrator.service.js"; +import { WhmcsConnectionFacade } from "@bff/integrations/whmcs/facades/whmcs.facade.js"; import { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js"; import { WhmcsInvoiceService } from "@bff/integrations/whmcs/services/whmcs-invoice.service.js"; import { WhmcsSubscriptionService } from "@bff/integrations/whmcs/services/whmcs-subscription.service.js"; @@ -30,7 +30,7 @@ export class SubscriptionsService { private readonly whmcsSubscriptionService: WhmcsSubscriptionService, private readonly whmcsInvoiceService: WhmcsInvoiceService, private readonly whmcsClientService: WhmcsClientService, - private readonly whmcsConnectionService: WhmcsConnectionOrchestratorService, + private readonly whmcsConnectionService: WhmcsConnectionFacade, private readonly cacheService: WhmcsCacheService, private readonly mappingsService: MappingsService, @Inject(Logger) private readonly logger: Logger diff --git a/apps/bff/src/modules/users/application/users.facade.ts b/apps/bff/src/modules/users/application/users.facade.ts index 118e836b..8e033f40 100644 --- a/apps/bff/src/modules/users/application/users.facade.ts +++ b/apps/bff/src/modules/users/application/users.facade.ts @@ -6,7 +6,7 @@ import type { BilingualAddress } from "@customer-portal/domain/address"; import type { DashboardSummary } from "@customer-portal/domain/dashboard"; import type { UpdateCustomerProfileRequest } from "@customer-portal/domain/auth"; import { UserAuthRepository } from "../infra/user-auth.repository.js"; -import { UserProfileService } from "../infra/user-profile.service.js"; +import { UserProfileAggregator } from "../infra/user-profile.service.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { mapPrismaUserToDomain } from "@bff/infra/mappers/index.js"; @@ -18,7 +18,7 @@ type AuthUpdateData = Partial< export class UsersFacade { constructor( private readonly authRepository: UserAuthRepository, - private readonly profileService: UserProfileService, + private readonly profileService: UserProfileAggregator, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/users/infra/user-profile.service.ts b/apps/bff/src/modules/users/infra/user-profile.service.ts index 2f004ce2..83b5e317 100644 --- a/apps/bff/src/modules/users/infra/user-profile.service.ts +++ b/apps/bff/src/modules/users/infra/user-profile.service.ts @@ -36,20 +36,27 @@ import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js"; import { WhmcsInvoiceService } from "@bff/integrations/whmcs/services/whmcs-invoice.service.js"; import { WhmcsSubscriptionService } from "@bff/integrations/whmcs/services/whmcs-subscription.service.js"; -import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service.js"; +import { SalesforceFacade } from "@bff/integrations/salesforce/facades/salesforce.facade.js"; import { withErrorHandling } from "@bff/core/utils/error-handler.util.js"; import { parseUuidOrThrow } from "@bff/core/utils/validation.util.js"; import { UserAuthRepository } from "./user-auth.repository.js"; +/** + * User Profile Aggregator + * + * Combines user data from multiple sources (Portal DB, WHMCS, Salesforce) + * to build comprehensive user profiles. Handles profile reads and + * coordinated updates across systems. + */ @Injectable() -export class UserProfileService { +export class UserProfileAggregator { constructor( private readonly userAuthRepository: UserAuthRepository, private readonly mappingsService: MappingsService, private readonly whmcsClientService: WhmcsClientService, private readonly whmcsInvoiceService: WhmcsInvoiceService, private readonly whmcsSubscriptionService: WhmcsSubscriptionService, - private readonly salesforceService: SalesforceService, + private readonly salesforceService: SalesforceFacade, private readonly configService: ConfigService, @Inject(Logger) private readonly logger: Logger ) {} diff --git a/apps/bff/src/modules/users/users.module.ts b/apps/bff/src/modules/users/users.module.ts index 095140c0..ee4122a7 100644 --- a/apps/bff/src/modules/users/users.module.ts +++ b/apps/bff/src/modules/users/users.module.ts @@ -1,7 +1,7 @@ import { Module } from "@nestjs/common"; import { UsersFacade } from "./application/users.facade.js"; import { UserAuthRepository } from "./infra/user-auth.repository.js"; -import { UserProfileService } from "./infra/user-profile.service.js"; +import { UserProfileAggregator } from "./infra/user-profile.service.js"; import { UsersController } from "./users.controller.js"; import { WhmcsModule } from "@bff/integrations/whmcs/whmcs.module.js"; import { SalesforceModule } from "@bff/integrations/salesforce/salesforce.module.js"; @@ -11,7 +11,7 @@ import { PrismaModule } from "@bff/infra/database/prisma.module.js"; @Module({ imports: [PrismaModule, WhmcsModule, SalesforceModule, MappingsModule], controllers: [UsersController], - providers: [UsersFacade, UserAuthRepository, UserProfileService], - exports: [UsersFacade, UserAuthRepository, UserProfileService], + providers: [UsersFacade, UserAuthRepository, UserProfileAggregator], + exports: [UsersFacade, UserAuthRepository, UserProfileAggregator], }) export class UsersModule {}