import { Module, OnModuleInit } from '@nestjs/common'; import { CommonModule } from '../common/common.module'; import { SchedulerModule } from '../scheduler/scheduler.module'; import { SchedulerService } from '../scheduler/scheduler.service'; import { SettingsModule } from '../settings/settings.module'; import { MailRetentionService } from './mail-retention.service'; import { MAIL_TRANSPORT, MailTransport, MailWorker } from './mail-worker.service'; import { MailService } from './mail.service'; import { SmtpConfigService } from './smtp-config.service'; /** Daily, per operations.md's maintenance-jobs table (issue #234). */ const OUTBOX_RETENTION_CADENCE_SECONDS = 24 * 60 * 60; @Module({ imports: [CommonModule, SchedulerModule, SettingsModule], providers: [ MailService, MailWorker, MailRetentionService, SmtpConfigService, { // Delegates per send so the wizard's SMTP changes (SmtpConfigService. // refresh) take effect without restarting the worker. provide: MAIL_TRANSPORT, inject: [SmtpConfigService], useFactory: (smtp: SmtpConfigService): MailTransport => ({ sendMail: (mail) => smtp.transport().sendMail(mail), }), }, ], exports: [MailService, SmtpConfigService], }) export class MailModule implements OnModuleInit { constructor( private readonly scheduler: SchedulerService, private readonly retention: MailRetentionService, ) {} onModuleInit(): void { this.scheduler.register({ name: 'mail-outbox-retention', cadenceSeconds: OUTBOX_RETENTION_CADENCE_SECONDS, run: async () => { await this.retention.pruneExpired(); }, }); } }