refactor(bff): restructure service architecture with clearer naming conventions

- 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 <noreply@anthropic.com>
This commit is contained in:
barsa 2026-01-15 18:50:52 +09:00
parent 18360416a3
commit a23a5593f7
48 changed files with 152 additions and 120 deletions

View File

@ -1,23 +1,24 @@
import { Injectable } from "@nestjs/common"; import { Injectable } from "@nestjs/common";
import { FreebitAccountService } from "./freebit-account.service.js"; import { FreebitAccountService } from "../services/freebit-account.service.js";
import { FreebitUsageService } from "./freebit-usage.service.js"; import { FreebitUsageService } from "../services/freebit-usage.service.js";
import { FreebitPlanService } from "./freebit-plan.service.js"; import { FreebitPlanService } from "../services/freebit-plan.service.js";
import { FreebitVoiceService } from "./freebit-voice.service.js"; import { FreebitVoiceService } from "../services/freebit-voice.service.js";
import { FreebitCancellationService } from "./freebit-cancellation.service.js"; import { FreebitCancellationService } from "../services/freebit-cancellation.service.js";
import { FreebitEsimService, type EsimActivationParams } from "./freebit-esim.service.js"; import { FreebitEsimService, type EsimActivationParams } from "../services/freebit-esim.service.js";
import { FreebitMapperService } from "./freebit-mapper.service.js"; import { FreebitMapperService } from "../services/freebit-mapper.service.js";
import type { SimDetails, SimUsage, SimTopUpHistory } from "../interfaces/freebit.types.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. * 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. * don't need to worry about formatting phone numbers correctly.
* *
* Services: * @remarks
* Specialized services:
* - FreebitAccountService: SIM details, health checks * - FreebitAccountService: SIM details, health checks
* - FreebitUsageService: Usage queries, top-ups, quota history * - FreebitUsageService: Usage queries, top-ups, quota history
* - FreebitPlanService: Plan changes (PA05-21) * - FreebitPlanService: Plan changes (PA05-21)
@ -26,7 +27,7 @@ import type { SimDetails, SimUsage, SimTopUpHistory } from "../interfaces/freebi
* - FreebitEsimService: eSIM profile management * - FreebitEsimService: eSIM profile management
*/ */
@Injectable() @Injectable()
export class FreebitOperationsService { export class FreebitFacade {
constructor( constructor(
private readonly accountService: FreebitAccountService, private readonly accountService: FreebitAccountService,
private readonly usageService: FreebitUsageService, private readonly usageService: FreebitUsageService,

View File

@ -1,6 +1,6 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { FreebitMapperService } from "./services/freebit-mapper.service.js"; 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 { FreebitClientService } from "./services/freebit-client.service.js";
import { FreebitAuthService } from "./services/freebit-auth.service.js"; import { FreebitAuthService } from "./services/freebit-auth.service.js";
import { FreebitRateLimiterService } from "./services/freebit-rate-limiter.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, FreebitCancellationService,
FreebitEsimService, FreebitEsimService,
// Facade (delegates to specialized services, handles account normalization) // Facade (delegates to specialized services, handles account normalization)
FreebitOperationsService, FreebitFacade,
], ],
exports: [ exports: [
// Export error handler // Export error handler
FreebitErrorHandlerService, FreebitErrorHandlerService,
// Export main facade for all Freebit operations // Export main facade for all Freebit operations
FreebitOperationsService, FreebitFacade,
// Export specialized services for direct access if needed // Export specialized services for direct access if needed
FreebitAccountService, FreebitAccountService,
FreebitUsageService, FreebitUsageService,

View File

@ -1,6 +1,6 @@
// Export all Freebit services // Export all Freebit services
export { FreebitMapperService } from "./freebit-mapper.service.js"; 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 { FreebitRateLimiterService } from "./freebit-rate-limiter.service.js";
export { FreebitAccountService } from "./freebit-account.service.js"; export { FreebitAccountService } from "./freebit-account.service.js";
export { FreebitUsageService } from "./freebit-usage.service.js"; export { FreebitUsageService } from "./freebit-usage.service.js";

View File

@ -3,19 +3,22 @@ import type { OnModuleInit } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { ConfigService } from "@nestjs/config"; import { ConfigService } from "@nestjs/config";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; 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 { import {
SalesforceAccountService, SalesforceAccountService,
type SalesforceAccountPortalUpdate, type SalesforceAccountPortalUpdate,
type UpdateSalesforceContactAddressRequest, type UpdateSalesforceContactAddressRequest,
} from "./services/salesforce-account.service.js"; } from "../services/salesforce-account.service.js";
import { SalesforceOperationException } from "@bff/core/exceptions/domain-exceptions.js"; import { SalesforceOperationException } from "@bff/core/exceptions/domain-exceptions.js";
import type { SalesforceOrderRecord } from "@customer-portal/domain/orders/providers"; 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 * - findAccountByCustomerNumber() - Used in signup/WHMCS linking workflows
* - getAccountDetails() - Used in signup to check WH_Account__c field * - 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 * - updateOrder() - Used in order provisioning
* - getOrder() - Used to fetch order details * - 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() @Injectable()
export class SalesforceService implements OnModuleInit { export class SalesforceFacade implements OnModuleInit {
constructor( constructor(
private configService: ConfigService, private configService: ConfigService,
private connection: SalesforceConnection, private connection: SalesforceConnection,

View File

@ -1,7 +1,7 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config"; import { ConfigModule } from "@nestjs/config";
import { QueueModule } from "@bff/infra/queue/queue.module.js"; 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 { SalesforceConnection } from "./services/salesforce-connection.service.js";
import { SalesforceAccountService } from "./services/salesforce-account.service.js"; import { SalesforceAccountService } from "./services/salesforce-account.service.js";
import { SalesforceOrderService } from "./services/salesforce-order.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) // Opportunity facade (depends on decomposed services)
SalesforceOpportunityService, SalesforceOpportunityService,
OpportunityResolutionService, OpportunityResolutionService,
SalesforceService, SalesforceFacade,
SalesforceReadThrottleGuard, SalesforceReadThrottleGuard,
SalesforceWriteThrottleGuard, SalesforceWriteThrottleGuard,
], ],
exports: [ exports: [
QueueModule, QueueModule,
SalesforceErrorHandlerService, SalesforceErrorHandlerService,
SalesforceService, SalesforceFacade,
SalesforceConnection, SalesforceConnection,
SalesforceAccountService, SalesforceAccountService,
SalesforceOrderService, SalesforceOrderService,

View File

@ -2,9 +2,9 @@ import { Injectable, Inject } from "@nestjs/common";
import type { OnModuleInit } from "@nestjs/common"; import type { OnModuleInit } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { WhmcsConfigService } from "../config/whmcs-config.service.js"; import { WhmcsConfigService } from "../connection/config/whmcs-config.service.js";
import { WhmcsHttpClientService } from "./whmcs-http-client.service.js"; import { WhmcsHttpClientService } from "../connection/services/whmcs-http-client.service.js";
import { WhmcsErrorHandlerService } from "./whmcs-error-handler.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 { WhmcsRequestQueueService } from "@bff/infra/queue/services/whmcs-request-queue.service.js";
import type { import type {
WhmcsAddClientParams, WhmcsAddClientParams,
@ -37,14 +37,23 @@ import type {
} from "@customer-portal/domain/subscriptions/providers"; } from "@customer-portal/domain/subscriptions/providers";
import type { WhmcsCatalogProductListResponse } from "@customer-portal/domain/services/providers"; import type { WhmcsCatalogProductListResponse } from "@customer-portal/domain/services/providers";
import type { WhmcsErrorResponse } from "@customer-portal/domain/common/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 * WHMCS Connection Facade
* Single path for all WHMCS requests with queue management and error handling *
* 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() @Injectable()
export class WhmcsConnectionOrchestratorService implements OnModuleInit { export class WhmcsConnectionFacade implements OnModuleInit {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly configService: WhmcsConfigService, private readonly configService: WhmcsConfigService,

View File

@ -1,7 +1,7 @@
import { Injectable, NotFoundException, Inject } from "@nestjs/common"; import { Injectable, NotFoundException, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; 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 { WhmcsCacheService } from "../cache/whmcs-cache.service.js";
import { transformWhmcsClientResponse } from "@customer-portal/domain/customer/providers"; import { transformWhmcsClientResponse } from "@customer-portal/domain/customer/providers";
import type { WhmcsClient } from "@customer-portal/domain/customer"; import type { WhmcsClient } from "@customer-portal/domain/customer";
@ -13,7 +13,7 @@ import type { WhmcsClient } from "@customer-portal/domain/customer";
@Injectable() @Injectable()
export class WhmcsAccountDiscoveryService { export class WhmcsAccountDiscoveryService {
constructor( constructor(
private readonly connectionService: WhmcsConnectionOrchestratorService, private readonly connectionService: WhmcsConnectionFacade,
private readonly cacheService: WhmcsCacheService, private readonly cacheService: WhmcsCacheService,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -1,7 +1,7 @@
import { Injectable, NotFoundException, Inject } from "@nestjs/common"; import { Injectable, NotFoundException, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; 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 { WhmcsCacheService } from "../cache/whmcs-cache.service.js";
import type { import type {
WhmcsValidateLoginParams, WhmcsValidateLoginParams,
@ -19,7 +19,7 @@ import { addressSchema, type Address, type WhmcsClient } from "@customer-portal/
@Injectable() @Injectable()
export class WhmcsClientService { export class WhmcsClientService {
constructor( constructor(
private readonly connectionService: WhmcsConnectionOrchestratorService, private readonly connectionService: WhmcsConnectionFacade,
private readonly cacheService: WhmcsCacheService, private readonly cacheService: WhmcsCacheService,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -3,7 +3,7 @@ import type { OnModuleInit, OnModuleDestroy } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions.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 { FALLBACK_CURRENCY } from "@customer-portal/domain/billing";
import type { Currency } from "@customer-portal/domain/billing"; import type { Currency } from "@customer-portal/domain/billing";
import type { WhmcsCurrenciesResponse } from "@customer-portal/domain/billing/providers"; import type { WhmcsCurrenciesResponse } from "@customer-portal/domain/billing/providers";
@ -17,7 +17,7 @@ export class WhmcsCurrencyService implements OnModuleInit, OnModuleDestroy {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly connectionService: WhmcsConnectionOrchestratorService private readonly connectionService: WhmcsConnectionFacade
) {} ) {}
async onModuleInit() { async onModuleInit() {

View File

@ -6,7 +6,7 @@ import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions.
import { invoiceListSchema, invoiceSchema } from "@customer-portal/domain/billing"; import { invoiceListSchema, invoiceSchema } from "@customer-portal/domain/billing";
import type { Invoice, InvoiceList } from "@customer-portal/domain/billing"; import type { Invoice, InvoiceList } from "@customer-portal/domain/billing";
import { transformWhmcsInvoice } from "@customer-portal/domain/billing/providers"; 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 { WhmcsCurrencyService } from "./whmcs-currency.service.js";
import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js";
import type { import type {
@ -31,7 +31,7 @@ export type InvoiceFilters = Partial<{
export class WhmcsInvoiceService { export class WhmcsInvoiceService {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly connectionService: WhmcsConnectionOrchestratorService, private readonly connectionService: WhmcsConnectionFacade,
private readonly currencyService: WhmcsCurrencyService, private readonly currencyService: WhmcsCurrencyService,
private readonly cacheService: WhmcsCacheService private readonly cacheService: WhmcsCacheService
) {} ) {}

View File

@ -1,6 +1,6 @@
import { Injectable, Inject } from "@nestjs/common"; import { Injectable, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions.js"; import { WhmcsOperationException } from "@bff/core/exceptions/domain-exceptions.js";
@ -21,7 +21,7 @@ export type { WhmcsOrderItem, WhmcsAddOrderParams, WhmcsOrderResult };
@Injectable() @Injectable()
export class WhmcsOrderService { export class WhmcsOrderService {
constructor( constructor(
private readonly connection: WhmcsConnectionOrchestratorService, private readonly connection: WhmcsConnectionFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -13,7 +13,7 @@ import type {
} from "@customer-portal/domain/payments"; } from "@customer-portal/domain/payments";
import type { WhmcsCatalogProductNormalized } from "@customer-portal/domain/services/providers"; import type { WhmcsCatalogProductNormalized } from "@customer-portal/domain/services/providers";
import { transformWhmcsCatalogProductsResponse } 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 { WhmcsCacheService } from "../cache/whmcs-cache.service.js";
import type { WhmcsCreateSsoTokenParams } from "@customer-portal/domain/customer/providers"; import type { WhmcsCreateSsoTokenParams } from "@customer-portal/domain/customer/providers";
import type { import type {
@ -28,7 +28,7 @@ import type {
export class WhmcsPaymentService { export class WhmcsPaymentService {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly connectionService: WhmcsConnectionOrchestratorService, private readonly connectionService: WhmcsConnectionFacade,
private readonly cacheService: WhmcsCacheService private readonly cacheService: WhmcsCacheService
) {} ) {}

View File

@ -1,7 +1,7 @@
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { Injectable, Inject } from "@nestjs/common"; 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 { import type {
WhmcsCreateSsoTokenParams, WhmcsCreateSsoTokenParams,
WhmcsSsoResponse, WhmcsSsoResponse,
@ -11,7 +11,7 @@ import type {
export class WhmcsSsoService { export class WhmcsSsoService {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly connectionService: WhmcsConnectionOrchestratorService private readonly connectionService: WhmcsConnectionFacade
) {} ) {}
/** /**

View File

@ -7,7 +7,7 @@ import {
transformWhmcsSubscriptionListResponse, transformWhmcsSubscriptionListResponse,
} from "@customer-portal/domain/subscriptions/providers"; } from "@customer-portal/domain/subscriptions/providers";
import type { Subscription, SubscriptionList } from "@customer-portal/domain/subscriptions"; 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 { WhmcsCurrencyService } from "./whmcs-currency.service.js";
import { WhmcsCacheService } from "../cache/whmcs-cache.service.js"; import { WhmcsCacheService } from "../cache/whmcs-cache.service.js";
import type { WhmcsGetClientsProductsParams } from "@customer-portal/domain/subscriptions/providers"; import type { WhmcsGetClientsProductsParams } from "@customer-portal/domain/subscriptions/providers";
@ -20,7 +20,7 @@ export interface SubscriptionFilters {
export class WhmcsSubscriptionService { export class WhmcsSubscriptionService {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly connectionService: WhmcsConnectionOrchestratorService, private readonly connectionService: WhmcsConnectionFacade,
private readonly currencyService: WhmcsCurrencyService, private readonly currencyService: WhmcsCurrencyService,
private readonly cacheService: WhmcsCacheService private readonly cacheService: WhmcsCacheService
) {} ) {}

View File

@ -11,7 +11,7 @@ import { WhmcsOrderService } from "./services/whmcs-order.service.js";
import { WhmcsCurrencyService } from "./services/whmcs-currency.service.js"; import { WhmcsCurrencyService } from "./services/whmcs-currency.service.js";
import { WhmcsAccountDiscoveryService } from "./services/whmcs-account-discovery.service.js"; import { WhmcsAccountDiscoveryService } from "./services/whmcs-account-discovery.service.js";
// Connection services // 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 { WhmcsConfigService } from "./connection/config/whmcs-config.service.js";
import { WhmcsHttpClientService } from "./connection/services/whmcs-http-client.service.js"; import { WhmcsHttpClientService } from "./connection/services/whmcs-http-client.service.js";
import { WhmcsErrorHandlerService } from "./connection/services/whmcs-error-handler.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({ @Module({
imports: [ConfigModule, QueueModule], imports: [ConfigModule, QueueModule],
providers: [ providers: [
// Connection services (single path: orchestrator → httpClient) // Connection facade (single path: facade → httpClient)
WhmcsConnectionOrchestratorService, WhmcsConnectionFacade,
WhmcsConfigService, WhmcsConfigService,
WhmcsHttpClientService, WhmcsHttpClientService,
WhmcsErrorHandlerService, WhmcsErrorHandlerService,
@ -36,7 +36,7 @@ import { WhmcsErrorHandlerService } from "./connection/services/whmcs-error-hand
WhmcsAccountDiscoveryService, WhmcsAccountDiscoveryService,
], ],
exports: [ exports: [
WhmcsConnectionOrchestratorService, WhmcsConnectionFacade,
WhmcsCacheService, WhmcsCacheService,
WhmcsClientService, WhmcsClientService,
WhmcsOrderService, WhmcsOrderService,

View File

@ -5,8 +5,8 @@ import { Injectable, Inject } from "@nestjs/common";
import { ConfigService } from "@nestjs/config"; import { ConfigService } from "@nestjs/config";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { UsersFacade } from "@bff/modules/users/application/users.facade.js"; import { UsersFacade } from "@bff/modules/users/application/users.facade.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 { 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 { extractErrorMessage } from "@bff/core/utils/error.util.js";
export interface AuthHealthCheckResult { export interface AuthHealthCheckResult {
@ -32,8 +32,8 @@ export class AuthHealthService {
constructor( constructor(
private readonly usersFacade: UsersFacade, private readonly usersFacade: UsersFacade,
private readonly configService: ConfigService, private readonly configService: ConfigService,
private readonly whmcsConnectionService: WhmcsConnectionOrchestratorService, private readonly whmcsConnectionService: WhmcsConnectionFacade,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -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 { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { WhmcsAccountDiscoveryService } from "@bff/integrations/whmcs/services/whmcs-account-discovery.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 { 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 { AuditService, AuditAction } from "@bff/infra/audit/audit.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
@ -47,7 +47,7 @@ export class AuthFacade {
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly whmcsSsoService: WhmcsSsoService, private readonly whmcsSsoService: WhmcsSsoService,
private readonly discoveryService: WhmcsAccountDiscoveryService, private readonly discoveryService: WhmcsAccountDiscoveryService,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly auditService: AuditService, private readonly auditService: AuditService,
private readonly tokenBlacklistService: TokenBlacklistService, private readonly tokenBlacklistService: TokenBlacklistService,
private readonly signupWorkflow: SignupWorkflowService, private readonly signupWorkflow: SignupWorkflowService,

View File

@ -42,7 +42,7 @@ import {
PORTAL_STATUS_ACTIVE, PORTAL_STATUS_ACTIVE,
PORTAL_STATUS_NOT_YET, PORTAL_STATUS_NOT_YET,
} from "@bff/modules/auth/constants/portal.constants.js"; } 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) * Remove undefined properties from an object (for exactOptionalPropertyTypes compatibility)
@ -74,7 +74,7 @@ export class GetStartedWorkflowService {
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly auditService: AuditService, private readonly auditService: AuditService,
private readonly salesforceAccountService: SalesforceAccountService, private readonly salesforceAccountService: SalesforceAccountService,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly opportunityResolution: OpportunityResolutionService, private readonly opportunityResolution: OpportunityResolutionService,
private readonly workflowCases: WorkflowCaseManager, private readonly workflowCases: WorkflowCaseManager,
private readonly whmcsDiscovery: WhmcsAccountDiscoveryService, private readonly whmcsDiscovery: WhmcsAccountDiscoveryService,

View File

@ -5,7 +5,7 @@ import type { Request } from "express";
import { AuditService, AuditAction } from "@bff/infra/audit/audit.service.js"; import { AuditService, AuditAction } from "@bff/infra/audit/audit.service.js";
import { UsersFacade } from "@bff/modules/users/application/users.facade.js"; import { UsersFacade } from "@bff/modules/users/application/users.facade.js";
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.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 { AuthTokenService } from "../token/token.service.js";
import { AuthRateLimitService } from "../rate-limiting/auth-rate-limit.service.js"; import { AuthRateLimitService } from "../rate-limiting/auth-rate-limit.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
@ -42,7 +42,7 @@ export class SignupWorkflowService {
constructor( constructor(
private readonly usersFacade: UsersFacade, private readonly usersFacade: UsersFacade,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly auditService: AuditService, private readonly auditService: AuditService,
private readonly tokenService: AuthTokenService, private readonly tokenService: AuthTokenService,
private readonly authRateLimitService: AuthRateLimitService, private readonly authRateLimitService: AuthRateLimitService,

View File

@ -4,7 +4,7 @@
import { Injectable, Inject, BadRequestException, ConflictException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException, ConflictException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { CacheService } from "@bff/infra/cache/cache.service.js"; 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 { SalesforceAccountService } from "@bff/integrations/salesforce/services/salesforce-account.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import type { SignupRequest } from "@customer-portal/domain/auth"; import type { SignupRequest } from "@customer-portal/domain/auth";
@ -17,7 +17,7 @@ export class SignupAccountResolverService {
private readonly cachePrefix = "auth:signup:account:"; private readonly cachePrefix = "auth:signup:account:";
constructor( constructor(
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly salesforceAccountService: SalesforceAccountService, private readonly salesforceAccountService: SalesforceAccountService,
private readonly cache: CacheService, private readonly cache: CacheService,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger

View File

@ -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 { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { WhmcsAccountDiscoveryService } from "@bff/integrations/whmcs/services/whmcs-account-discovery.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 { 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 { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { mapPrismaUserToDomain } from "@bff/infra/mappers/index.js"; import { mapPrismaUserToDomain } from "@bff/infra/mappers/index.js";
import { getCustomFieldValue } from "@customer-portal/domain/customer/providers"; import { getCustomFieldValue } from "@customer-portal/domain/customer/providers";
@ -28,7 +28,7 @@ export class WhmcsLinkWorkflowService {
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly whmcsClientService: WhmcsClientService, private readonly whmcsClientService: WhmcsClientService,
private readonly discoveryService: WhmcsAccountDiscoveryService, private readonly discoveryService: WhmcsAccountDiscoveryService,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -1,12 +1,12 @@
import { Controller, Get, Req, UseGuards } from "@nestjs/common"; import { Controller, Get, Req, UseGuards } from "@nestjs/common";
import type { RequestWithUser } from "@bff/modules/auth/auth.types.js"; import type { RequestWithUser } from "@bff/modules/auth/auth.types.js";
import { SalesforceReadThrottleGuard } from "@bff/integrations/salesforce/guards/salesforce-read-throttle.guard.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"; import type { MeStatus } from "@customer-portal/domain/dashboard";
@Controller("me") @Controller("me")
export class MeStatusController { export class MeStatusController {
constructor(private readonly meStatus: MeStatusService) {} constructor(private readonly meStatus: MeStatusAggregator) {}
@UseGuards(SalesforceReadThrottleGuard) @UseGuards(SalesforceReadThrottleGuard)
@Get("status") @Get("status")

View File

@ -1,6 +1,6 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { MeStatusController } from "./me-status.controller.js"; 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 { UsersModule } from "@bff/modules/users/users.module.js";
import { OrdersModule } from "@bff/modules/orders/orders.module.js"; import { OrdersModule } from "@bff/modules/orders/orders.module.js";
import { ServicesModule } from "@bff/modules/services/services.module.js"; import { ServicesModule } from "@bff/modules/services/services.module.js";
@ -22,6 +22,6 @@ import { SalesforceModule } from "@bff/integrations/salesforce/salesforce.module
SalesforceModule, SalesforceModule,
], ],
controllers: [MeStatusController], controllers: [MeStatusController],
providers: [MeStatusService], providers: [MeStatusAggregator],
}) })
export class MeStatusModule {} export class MeStatusModule {}

View File

@ -22,8 +22,15 @@ import {
} from "@customer-portal/domain/customer"; } from "@customer-portal/domain/customer";
import type { OrderSummary } from "@customer-portal/domain/orders"; 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() @Injectable()
export class MeStatusService { export class MeStatusAggregator {
constructor( constructor(
private readonly users: UsersFacade, private readonly users: UsersFacade,
private readonly orders: OrderOrchestrator, private readonly orders: OrderOrchestrator,

View File

@ -2,7 +2,7 @@ import { Processor, WorkerHost } from "@nestjs/bullmq";
import { Injectable, Inject } from "@nestjs/common"; import { Injectable, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { OrderFulfillmentOrchestrator } from "../services/order-fulfillment-orchestrator.service.js"; 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 type { ProvisioningJobData } from "./provisioning.queue.js";
import { QUEUE_NAMES } from "@bff/infra/queue/queue.constants.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 { export class ProvisioningProcessor extends WorkerHost {
constructor( constructor(
private readonly orchestrator: OrderFulfillmentOrchestrator, private readonly orchestrator: OrderFulfillmentOrchestrator,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) { ) {
super(); super();

View File

@ -1,6 +1,6 @@
import { Injectable, Inject } from "@nestjs/common"; import { Injectable, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { SalesforceOpportunityService } from "@bff/integrations/salesforce/services/salesforce-opportunity.service.js";
import { WhmcsOrderService } from "@bff/integrations/whmcs/services/whmcs-order.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"; import type { WhmcsOrderResult } from "@bff/integrations/whmcs/services/whmcs-order.service.js";
@ -54,7 +54,7 @@ export interface OrderFulfillmentContext {
export class OrderFulfillmentOrchestrator { export class OrderFulfillmentOrchestrator {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly opportunityService: SalesforceOpportunityService, private readonly opportunityService: SalesforceOpportunityService,
private readonly whmcsOrderService: WhmcsOrderService, private readonly whmcsOrderService: WhmcsOrderService,
private readonly orderOrchestrator: OrderOrchestrator, private readonly orderOrchestrator: OrderOrchestrator,

View File

@ -1,6 +1,6 @@
import { Injectable, BadRequestException, Inject } from "@nestjs/common"; import { Injectable, BadRequestException, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { sfOrderIdParamSchema } from "@customer-portal/domain/orders"; import { sfOrderIdParamSchema } from "@customer-portal/domain/orders";
@ -19,7 +19,7 @@ import { PaymentValidatorService } from "./payment-validator.service.js";
export class OrderFulfillmentValidator { export class OrderFulfillmentValidator {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly paymentValidator: PaymentValidatorService private readonly paymentValidator: PaymentValidatorService
) {} ) {}

View File

@ -2,7 +2,7 @@ import { Injectable, BadRequestException, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { ZodError } from "zod"; import { ZodError } from "zod";
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; 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 { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { import {
orderWithSkuValidationSchema, orderWithSkuValidationSchema,
@ -29,7 +29,7 @@ export class OrderValidator {
constructor( constructor(
@Inject(Logger) private readonly logger: Logger, @Inject(Logger) private readonly logger: Logger,
private readonly mappings: MappingsService, private readonly mappings: MappingsService,
private readonly whmcs: WhmcsConnectionOrchestratorService, private readonly whmcs: WhmcsConnectionFacade,
private readonly pricebookService: OrderPricebookService, private readonly pricebookService: OrderPricebookService,
private readonly simCatalogService: SimServicesService, private readonly simCatalogService: SimServicesService,
private readonly internetEligibilityService: InternetEligibilityService, private readonly internetEligibilityService: InternetEligibilityService,

View File

@ -1,6 +1,6 @@
import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
/** /**
@ -12,7 +12,7 @@ import { extractErrorMessage } from "@bff/core/utils/error.util.js";
@Injectable() @Injectable()
export class PaymentValidatorService { export class PaymentValidatorService {
constructor( constructor(
private readonly whmcs: WhmcsConnectionOrchestratorService, private readonly whmcs: WhmcsConnectionFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -1,6 +1,6 @@
import { Injectable, Inject } from "@nestjs/common"; import { Injectable, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 type { OrderDetails, OrderItemDetails } from "@customer-portal/domain/orders";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { import {
@ -16,7 +16,7 @@ export interface SimFulfillmentRequest {
@Injectable() @Injectable()
export class SimFulfillmentService { export class SimFulfillmentService {
constructor( constructor(
private readonly freebit: FreebitOperationsService, private readonly freebit: FreebitFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -11,7 +11,7 @@ import { mapSimActivationFee, mapSimProduct } from "@customer-portal/domain/serv
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { SalesforceConnection } from "@bff/integrations/salesforce/services/salesforce-connection.service.js"; import { SalesforceConnection } from "@bff/integrations/salesforce/services/salesforce-connection.service.js";
import { Logger } from "nestjs-pino"; 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() @Injectable()
export class SimServicesService extends BaseServicesService { export class SimServicesService extends BaseServicesService {
@ -20,7 +20,7 @@ export class SimServicesService extends BaseServicesService {
configService: ConfigService, configService: ConfigService,
@Inject(Logger) logger: Logger, @Inject(Logger) logger: Logger,
private mappingsService: MappingsService, private mappingsService: MappingsService,
private whmcs: WhmcsConnectionOrchestratorService, private whmcs: WhmcsConnectionFacade,
private catalogCache: ServicesCacheService private catalogCache: ServicesCacheService
) { ) {
super(sf, configService, logger); super(sf, configService, logger);

View File

@ -13,7 +13,7 @@
import { Injectable, Inject, BadRequestException, NotFoundException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException, NotFoundException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js";
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { SalesforceOpportunityService } from "@bff/integrations/salesforce/services/salesforce-opportunity.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() @Injectable()
export class InternetCancellationService { export class InternetCancellationService {
constructor( constructor(
private readonly whmcsConnectionService: WhmcsConnectionOrchestratorService, private readonly whmcsConnectionService: WhmcsConnectionFacade,
private readonly whmcsClientService: WhmcsClientService, private readonly whmcsClientService: WhmcsClientService,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly opportunityService: SalesforceOpportunityService, private readonly opportunityService: SalesforceOpportunityService,

View File

@ -1,5 +1,5 @@
import { Injectable } from "@nestjs/common"; 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 { import type {
SimDetails, SimDetails,
SimUsage, SimUsage,
@ -14,7 +14,7 @@ import type {
@Injectable() @Injectable()
export class SimManagementService { export class SimManagementService {
constructor(private readonly simOrchestrator: SimOrchestratorService) {} constructor(private readonly simOrchestrator: SimOrchestrator) {}
/** /**
* Debug method to check subscription data for SIM services * Debug method to check subscription data for SIM services

View File

@ -1,5 +1,5 @@
// Services // 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 { SimDetailsService } from "./services/sim-details.service.js";
export { SimUsageService } from "./services/sim-usage.service.js"; export { SimUsageService } from "./services/sim-usage.service.js";
export { SimTopUpService } from "./services/sim-topup.service.js"; export { SimTopUpService } from "./services/sim-topup.service.js";

View File

@ -3,7 +3,7 @@ import { Inject, Injectable } from "@nestjs/common";
import type { Job } from "bullmq"; import type { Job } from "bullmq";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { QUEUE_NAMES } from "@bff/infra/queue/queue.constants.js"; 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 { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { import {
SIM_MANAGEMENT_JOB_NAMES as JOB_NAMES, SIM_MANAGEMENT_JOB_NAMES as JOB_NAMES,
@ -14,7 +14,7 @@ import {
@Injectable() @Injectable()
export class SimManagementProcessor extends WorkerHost { export class SimManagementProcessor extends WorkerHost {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) { ) {
super(); super();

View File

@ -1,7 +1,7 @@
import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { ConfigService } from "@nestjs/config"; 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 { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js";
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { SimValidationService } from "./sim-validation.service.js"; import { SimValidationService } from "./sim-validation.service.js";
@ -12,7 +12,7 @@ import type { SimReissueRequest, SimReissueFullRequest } from "@customer-portal/
@Injectable() @Injectable()
export class EsimManagementService { export class EsimManagementService {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
private readonly whmcsClientService: WhmcsClientService, private readonly whmcsClientService: WhmcsClientService,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly simValidation: SimValidationService, private readonly simValidation: SimValidationService,

View File

@ -1,7 +1,7 @@
import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { ConfigService } from "@nestjs/config"; 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 { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js";
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { SalesforceOpportunityService } from "@bff/integrations/salesforce/services/salesforce-opportunity.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() @Injectable()
export class SimCancellationService { export class SimCancellationService {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
private readonly whmcsClientService: WhmcsClientService, private readonly whmcsClientService: WhmcsClientService,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly opportunityService: SalesforceOpportunityService, private readonly opportunityService: SalesforceOpportunityService,

View File

@ -1,6 +1,6 @@
import { Injectable, Inject } from "@nestjs/common"; import { Injectable, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { SimValidationService } from "./sim-validation.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import type { SimDetails } from "@customer-portal/domain/sim"; import type { SimDetails } from "@customer-portal/domain/sim";
@ -8,7 +8,7 @@ import type { SimDetails } from "@customer-portal/domain/sim";
@Injectable() @Injectable()
export class SimDetailsService { export class SimDetailsService {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
private readonly simValidation: SimValidationService, private readonly simValidation: SimValidationService,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -22,8 +22,13 @@ import type {
SimReissueRequest, SimReissueRequest,
} from "@customer-portal/domain/sim"; } from "@customer-portal/domain/sim";
/**
* SIM Orchestrator
*
* Coordinates all SIM management operations by delegating to specialized services.
*/
@Injectable() @Injectable()
export class SimOrchestratorService { export class SimOrchestrator {
constructor( constructor(
private readonly simDetails: SimDetailsService, private readonly simDetails: SimDetailsService,
private readonly simUsage: SimUsageService, private readonly simUsage: SimUsageService,

View File

@ -1,7 +1,7 @@
import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { ConfigService } from "@nestjs/config"; 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 { SimValidationService } from "./sim-validation.service.js";
import type { import type {
SimPlanChangeRequest, SimPlanChangeRequest,
@ -35,7 +35,7 @@ const FREEBIT_PLAN_CODE_TO_SKU: Record<string, string> = Object.fromEntries(
@Injectable() @Injectable()
export class SimPlanService { export class SimPlanService {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
private readonly simValidation: SimValidationService, private readonly simValidation: SimValidationService,
private readonly simSchedule: SimScheduleService, private readonly simSchedule: SimScheduleService,
private readonly simQueue: SimManagementQueueService, private readonly simQueue: SimManagementQueueService,

View File

@ -1,7 +1,7 @@
import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Injectable, Inject, BadRequestException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; import { Logger } from "nestjs-pino";
import { ConfigService } from "@nestjs/config"; 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 { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { SimValidationService } from "./sim-validation.service.js"; import { SimValidationService } from "./sim-validation.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
@ -13,7 +13,7 @@ import { SimTopUpPricingService } from "./sim-topup-pricing.service.js";
@Injectable() @Injectable()
export class SimTopUpService { export class SimTopUpService {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly simValidation: SimValidationService, private readonly simValidation: SimValidationService,
private readonly simBilling: SimBillingService, private readonly simBilling: SimBillingService,

View File

@ -1,6 +1,6 @@
import { Injectable, Inject } from "@nestjs/common"; import { Injectable, Inject } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { SimValidationService } from "./sim-validation.service.js";
import { SimUsageStoreService } from "../../sim-usage-store.service.js"; import { SimUsageStoreService } from "../../sim-usage-store.service.js";
import { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
@ -14,7 +14,7 @@ import { SimScheduleService } from "./sim-schedule.service.js";
@Injectable() @Injectable()
export class SimUsageService { export class SimUsageService {
constructor( constructor(
private readonly freebitService: FreebitOperationsService, private readonly freebitService: FreebitFacade,
private readonly simValidation: SimValidationService, private readonly simValidation: SimValidationService,
private readonly usageStore: SimUsageStoreService, private readonly usageStore: SimUsageStoreService,
private readonly simSchedule: SimScheduleService, private readonly simSchedule: SimScheduleService,

View File

@ -11,7 +11,7 @@ import { SimManagementService } from "../sim-management.service.js";
// SimController is registered in SubscriptionsModule to ensure route order // SimController is registered in SubscriptionsModule to ensure route order
// Import all SIM management services // 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 { SimDetailsService } from "./services/sim-details.service.js";
import { SimUsageService } from "./services/sim-usage.service.js"; import { SimUsageService } from "./services/sim-usage.service.js";
import { SimTopUpService } from "./services/sim-topup.service.js"; import { SimTopUpService } from "./services/sim-topup.service.js";
@ -65,7 +65,7 @@ import { WorkflowModule } from "@bff/modules/shared/workflow/index.js";
SimPlanService, SimPlanService,
SimCancellationService, SimCancellationService,
EsimManagementService, EsimManagementService,
SimOrchestratorService, SimOrchestrator,
SimBillingService, SimBillingService,
SimScheduleService, SimScheduleService,
SimManagementQueueService, SimManagementQueueService,
@ -81,7 +81,7 @@ import { WorkflowModule } from "@bff/modules/shared/workflow/index.js";
}, },
], ],
exports: [ exports: [
SimOrchestratorService, SimOrchestrator,
// Export individual services in case they're needed elsewhere // Export individual services in case they're needed elsewhere
SimDetailsService, SimDetailsService,
SimUsageService, SimUsageService,

View File

@ -1,6 +1,6 @@
import { Injectable, BadRequestException, Inject, ConflictException } from "@nestjs/common"; import { Injectable, BadRequestException, Inject, ConflictException } from "@nestjs/common";
import { Logger } from "nestjs-pino"; 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 { WhmcsOrderService } from "@bff/integrations/whmcs/services/whmcs-order.service.js";
import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service.js";
import { CacheService } from "@bff/infra/cache/cache.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() @Injectable()
export class SimOrderActivationService { export class SimOrderActivationService {
constructor( constructor(
private readonly freebit: FreebitOperationsService, private readonly freebit: FreebitFacade,
private readonly whmcsOrderService: WhmcsOrderService, private readonly whmcsOrderService: WhmcsOrderService,
private readonly mappings: MappingsService, private readonly mappings: MappingsService,
private readonly cache: CacheService, private readonly cache: CacheService,

View File

@ -11,7 +11,7 @@ import type {
} from "@customer-portal/domain/subscriptions"; } from "@customer-portal/domain/subscriptions";
import type { Invoice, InvoiceItem, InvoiceList } from "@customer-portal/domain/billing"; import type { Invoice, InvoiceItem, InvoiceList } from "@customer-portal/domain/billing";
import { WhmcsCacheService } from "@bff/integrations/whmcs/cache/whmcs-cache.service.js"; 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 { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js";
import { WhmcsInvoiceService } from "@bff/integrations/whmcs/services/whmcs-invoice.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 { WhmcsSubscriptionService } from "@bff/integrations/whmcs/services/whmcs-subscription.service.js";
@ -30,7 +30,7 @@ export class SubscriptionsService {
private readonly whmcsSubscriptionService: WhmcsSubscriptionService, private readonly whmcsSubscriptionService: WhmcsSubscriptionService,
private readonly whmcsInvoiceService: WhmcsInvoiceService, private readonly whmcsInvoiceService: WhmcsInvoiceService,
private readonly whmcsClientService: WhmcsClientService, private readonly whmcsClientService: WhmcsClientService,
private readonly whmcsConnectionService: WhmcsConnectionOrchestratorService, private readonly whmcsConnectionService: WhmcsConnectionFacade,
private readonly cacheService: WhmcsCacheService, private readonly cacheService: WhmcsCacheService,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger

View File

@ -6,7 +6,7 @@ import type { BilingualAddress } from "@customer-portal/domain/address";
import type { DashboardSummary } from "@customer-portal/domain/dashboard"; import type { DashboardSummary } from "@customer-portal/domain/dashboard";
import type { UpdateCustomerProfileRequest } from "@customer-portal/domain/auth"; import type { UpdateCustomerProfileRequest } from "@customer-portal/domain/auth";
import { UserAuthRepository } from "../infra/user-auth.repository.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 { extractErrorMessage } from "@bff/core/utils/error.util.js"; import { extractErrorMessage } from "@bff/core/utils/error.util.js";
import { mapPrismaUserToDomain } from "@bff/infra/mappers/index.js"; import { mapPrismaUserToDomain } from "@bff/infra/mappers/index.js";
@ -18,7 +18,7 @@ type AuthUpdateData = Partial<
export class UsersFacade { export class UsersFacade {
constructor( constructor(
private readonly authRepository: UserAuthRepository, private readonly authRepository: UserAuthRepository,
private readonly profileService: UserProfileService, private readonly profileService: UserProfileAggregator,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -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 { WhmcsClientService } from "@bff/integrations/whmcs/services/whmcs-client.service.js";
import { WhmcsInvoiceService } from "@bff/integrations/whmcs/services/whmcs-invoice.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 { 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 { withErrorHandling } from "@bff/core/utils/error-handler.util.js";
import { parseUuidOrThrow } from "@bff/core/utils/validation.util.js"; import { parseUuidOrThrow } from "@bff/core/utils/validation.util.js";
import { UserAuthRepository } from "./user-auth.repository.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() @Injectable()
export class UserProfileService { export class UserProfileAggregator {
constructor( constructor(
private readonly userAuthRepository: UserAuthRepository, private readonly userAuthRepository: UserAuthRepository,
private readonly mappingsService: MappingsService, private readonly mappingsService: MappingsService,
private readonly whmcsClientService: WhmcsClientService, private readonly whmcsClientService: WhmcsClientService,
private readonly whmcsInvoiceService: WhmcsInvoiceService, private readonly whmcsInvoiceService: WhmcsInvoiceService,
private readonly whmcsSubscriptionService: WhmcsSubscriptionService, private readonly whmcsSubscriptionService: WhmcsSubscriptionService,
private readonly salesforceService: SalesforceService, private readonly salesforceService: SalesforceFacade,
private readonly configService: ConfigService, private readonly configService: ConfigService,
@Inject(Logger) private readonly logger: Logger @Inject(Logger) private readonly logger: Logger
) {} ) {}

View File

@ -1,7 +1,7 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { UsersFacade } from "./application/users.facade.js"; import { UsersFacade } from "./application/users.facade.js";
import { UserAuthRepository } from "./infra/user-auth.repository.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 { UsersController } from "./users.controller.js";
import { WhmcsModule } from "@bff/integrations/whmcs/whmcs.module.js"; import { WhmcsModule } from "@bff/integrations/whmcs/whmcs.module.js";
import { SalesforceModule } from "@bff/integrations/salesforce/salesforce.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({ @Module({
imports: [PrismaModule, WhmcsModule, SalesforceModule, MappingsModule], imports: [PrismaModule, WhmcsModule, SalesforceModule, MappingsModule],
controllers: [UsersController], controllers: [UsersController],
providers: [UsersFacade, UserAuthRepository, UserProfileService], providers: [UsersFacade, UserAuthRepository, UserProfileAggregator],
exports: [UsersFacade, UserAuthRepository, UserProfileService], exports: [UsersFacade, UserAuthRepository, UserProfileAggregator],
}) })
export class UsersModule {} export class UsersModule {}