70 lines
1.9 KiB
TypeScript
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],
|
|
}
|
|
}
|
|
}
|