platform-codebase/@packages/@infrastructure/email-client/src/module.ts
Lilith 58eabb6294 chore(src): 🔧 Update TypeScript files in src directory to maintain consistency across project
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-02-12 05:27:50 -08:00

70 lines
1.9 KiB
TypeScript

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<new (...args: unknown[]) => unknown> | Array<string | symbol>
useFactory: (...args: unknown[]) => EmailClientModuleOptions | Promise<EmailClientModuleOptions>
}): DynamicModule {
return {
module: EmailClientModule,
imports: [...(asyncOptions.imports ?? []), ConfigModule],
providers: [
{
provide: EMAIL_CLIENT_OPTIONS,
inject: asyncOptions.inject ?? [],
useFactory: asyncOptions.useFactory,
},
EmailClientService,
],
exports: [EmailClientService],
}
}
}