Files
docmost/apps/server/src/integrations/mail/mail.service.ts
2024-09-02 12:43:33 +01:00

42 lines
1.7 KiB
TypeScript

import { Inject, Injectable } from '@nestjs/common';
import { MAIL_DRIVER_TOKEN } from './mail.constants';
import { MailDriver } from './drivers/interfaces/mail-driver.interface';
import { MailMessage } from './interfaces/mail.message';
import { EnvironmentService } from '../environment/environment.service';
import { InjectQueue } from '@nestjs/bullmq';
import { QueueName, QueueJob } from '../queue/constants';
import { Queue } from 'bullmq';
import { render } from '@react-email/render';
@Injectable()
export class MailService {
constructor(
@Inject(MAIL_DRIVER_TOKEN) private mailDriver: MailDriver,
private readonly environmentService: EnvironmentService,
@InjectQueue(QueueName.EMAIL_QUEUE) private emailQueue: Queue,
) {}
async sendEmail(message: MailMessage): Promise<void> {
if (message.template) {
// in case this method is used directly. we do not send the tsx template from queue
message.html = await render(message.template, { pretty: true });
message.text = await render(message.template, { plainText: true });
}
const sender = `${this.environmentService.getMailFromName()} <${this.environmentService.getMailFromAddress()}> `;
await this.mailDriver.sendMail({ from: sender, ...message });
}
async sendToQueue(message: MailMessage): Promise<void> {
if (message.template) {
// transform the React object because it gets lost when sent via the queue
message.html = await render(message.template, { pretty: true });
message.text = await render(message.template, {
plainText: true,
});
delete message.template;
}
await this.emailQueue.add(QueueJob.SEND_EMAIL, message);
}
}