// This file defines the MambuModule, which is a NestJS module that provides integration with the Mambu API. // It includes the MambuService, which is a wrapper around the Mambu SDK, and the MambuController, which defines REST endpoints for accessing Mambu data. // The module supports both a default instance (forRoot) and multiple named instances (forFeature) for multi-tenant applications. // The module also supports asynchronous configuration for dynamic environments. import { Module, DynamicModule, Global } from '@nestjs/common'; import { MambuService } from './mambu.service'; import { MambuController } from './mambu.controller'; import { MAMBU_CONFIG, MambuConfig, getMambuConfigToken, getMambuServiceToken, } from './mambu.config'; @Global() @Module({}) export class MambuModule { /** * Register the default Mambu instance */ static forRoot(config: MambuConfig): DynamicModule { return { module: MambuModule, controllers: [MambuController], providers: [ { provide: MAMBU_CONFIG, useValue: config, }, MambuService, ], exports: [MambuService], }; } /** * Register a named Mambu instance for multi-tenant support * @param name - Unique name for this instance (e.g., 'tenantA', 'tenantB') * @param config - Configuration for this instance */ static forFeature(name: string, config: MambuConfig): DynamicModule { const configToken = getMambuConfigToken(name); const serviceToken = getMambuServiceToken(name); return { module: MambuModule, providers: [ { provide: configToken, useValue: config, }, { provide: serviceToken, useFactory: (cfg: MambuConfig) => new MambuService(cfg), inject: [configToken], }, ], exports: [serviceToken], }; } /** * Register a named Mambu instance with async configuration */ static forFeatureAsync( name: string, options: { useFactory: (...args: any[]) => Promise | MambuConfig; inject?: any[]; }, ): DynamicModule { const configToken = getMambuConfigToken(name); const serviceToken = getMambuServiceToken(name); return { module: MambuModule, providers: [ { provide: configToken, useFactory: options.useFactory, inject: options.inject || [], }, { provide: serviceToken, useFactory: (cfg: MambuConfig) => new MambuService(cfg), inject: [configToken], }, ], exports: [serviceToken], }; } static forRootAsync(options: { useFactory: (...args: any[]) => Promise | MambuConfig; inject?: any[]; }): DynamicModule { return { module: MambuModule, controllers: [MambuController], providers: [ { provide: MAMBU_CONFIG, useFactory: options.useFactory, inject: options.inject || [], }, MambuService, ], exports: [MambuService], }; } }