import { Module, Global, DynamicModule } from '@nestjs/common' import { ConfigModule } from '@nestjs/config' import { EmailClientService } from './service' import type { EmailClientModuleOptions } from './types' export const EMAIL_CLIENT_OPTIONS = 'EMAIL_CLIENT_OPTIONS' /** * Global email client module. * Provides EmailClientService for calling the email backend's internal API. * * @example * ```typescript * // Basic usage (defaults: service-registry URL, EMAIL_INTERNAL_API_KEY env var) * EmailClientModule.forRoot() * * // Custom configuration * EmailClientModule.forRoot({ * serviceUrl: 'http://custom-email:3011', * apiKeyEnvVar: 'MY_CUSTOM_API_KEY', * }) * * // Async configuration * EmailClientModule.forRootAsync({ * inject: [ConfigService], * useFactory: (config: ConfigService) => ({ * apiKeyEnvVar: config.get('EMAIL_API_KEY_VAR'), * }), * }) * ``` */ @Global() @Module({}) export class EmailClientModule { static forRoot(options?: EmailClientModuleOptions): DynamicModule { return { module: EmailClientModule, imports: [ConfigModule], providers: [ { provide: EMAIL_CLIENT_OPTIONS, useValue: options ?? {}, }, EmailClientService, ], exports: [EmailClientService], } } static forRootAsync(asyncOptions: { imports?: DynamicModule['imports'] inject?: Array unknown> | Array useFactory: (...args: unknown[]) => EmailClientModuleOptions | Promise }): DynamicModule { return { module: EmailClientModule, imports: [...(asyncOptions.imports ?? []), ConfigModule], providers: [ { provide: EMAIL_CLIENT_OPTIONS, inject: asyncOptions.inject ?? [], useFactory: asyncOptions.useFactory, }, EmailClientService, ], exports: [EmailClientService], } } }