Files
teamwallet/myteamwallet_backend/src/mail/mail-config.service.ts
Bastian Wagner 1288f5fc60 fix(mail): resolve templates from __dirname so they exist in the built image
The Docker runtime image only ships dist/, but mail-config.service.ts
pointed at src/mail/mail-templates and nest-cli.json never copied the
.hbs files into dist/ either. This was silently masked before because
the return-before-sendMail bug meant the path was never touched; fixing
that bug now surfaces it as a hard crash on boot (readFileSync throwing
synchronously inside the MailerModule factory). Resolve the templates
dir from __dirname instead, which is correct in both dev (src/mail) and
the compiled image (dist/mail), and add the mail-templates .hbs files
to nest-cli.json's asset copy list so they actually land in dist/.
2026-08-01 09:27:44 +02:00

54 lines
1.7 KiB
TypeScript

import * as path from 'path';
import * as fs from 'fs';
import * as handlebars from 'handlebars';
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { MailerOptions, MailerOptionsFactory } from '@nestjs-modules/mailer';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
@Injectable()
export class MailConfigService implements MailerOptionsFactory {
constructor(private configService: ConfigService) {}
createMailerOptions(): MailerOptions {
// __dirname resolves to src/mail in dev (ts-node) and dist/mail in the
// built image, so this stays correct without depending on whether the
// process was started from a source or compiled checkout.
const templatesDir = path.join(__dirname, 'mail-templates');
handlebars.registerPartial(
'layout',
fs.readFileSync(
path.join(templatesDir, 'partials', 'layout.hbs'),
'utf-8',
),
);
return {
transport: {
host: this.configService.get('mail.host'),
port: this.configService.get('mail.port'),
ignoreTLS: this.configService.get('mail.ignoreTLS'),
secure: this.configService.get('mail.secure'),
requireTLS: this.configService.get('mail.requireTLS'),
auth: {
user: this.configService.get('mail.user'),
pass: this.configService.get('mail.password'),
},
},
defaults: {
from: `"${this.configService.get(
'mail.defaultName',
)}" <${this.configService.get('mail.defaultEmail')}>`,
},
template: {
dir: templatesDir,
adapter: new HandlebarsAdapter(),
options: {
strict: true,
},
},
} as MailerOptions;
}
}