Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add an option to have bcc recipient for emails sent through proposal status actions #667

Merged
merged 6 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions apps/backend/db_patches/0158_BccRecipientAppSetting.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
DO
$$
BEGIN
IF register_patch('0158_BccRecipientAppSetting.sql', 'Deepak Jaison', 'BCC Recipient App Setting', '2024-07-17') THEN
BEGIN

INSERT INTO settings(settings_id, description) VALUES ('SMTP_BCC_EMAIL', 'Email address for setting bcc recipient for SMTP mails. E.g. ''bcc1@email.com; bcc2@email.com''');

END;
END IF;
END;
$$
LANGUAGE plpgsql;
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
import * as path from 'path';

import EmailTemplates from 'email-templates';
import { container } from 'tsyringe';

import { Tokens } from '../../config/Tokens';
import { AdminDataSource } from '../../datasources/AdminDataSource';
import { SettingsId } from '../../models/Settings';
import EmailSettings from './EmailSettings';
import { SMTPMailService } from './SMTPMailService';

jest.mock('email-templates');
const mockAdminDataSource = container.resolve(
Tokens.AdminDataSource
) as AdminDataSource;

const mockGetSetting = jest.spyOn(mockAdminDataSource, 'getSetting');

test('Return result should indicate all emails were successfully sent', async () => {
mockGetSetting.mockResolvedValue(null);

const options: EmailSettings = {
content: {
template_id: path.resolve('src', 'eventHandlers', 'emails', 'submit'),
Expand Down Expand Up @@ -36,3 +49,59 @@ test('Return result should indicate all emails were successfully sent', async ()
},
});
});

test('All emails with bcc were successfully sent', async () => {
mockGetSetting.mockClear();
const emailInfo = jest.spyOn(EmailTemplates.prototype, 'send');

const bccEmail = 'testmail@test.co';

const substitutionData = {
piPreferredname: 'John',
piLastname: 'Doe',
proposalNumber: '1',
proposalTitle: 'Title',
coProposers: ['Jane Doe'],
call: '',
};

mockGetSetting.mockImplementation(() =>
Promise.resolve({
settingsValue: bccEmail,
description: 'bcc mail',
id: SettingsId.SMTP_BCC_EMAIL,
})
);

const options: EmailSettings = {
content: {
template_id: path.resolve('src', 'eventHandlers', 'emails', 'submit'),
},
substitution_data: substitutionData,
recipients: [
{
address: 'john.doe@email.com',
},
],
};

const smtpMailService: SMTPMailService = new SMTPMailService();
const result = await smtpMailService.sendMail(options);

expect(emailInfo).toHaveBeenCalledWith({
template: expect.any(String),
message: {
to: process.env.SINK_EMAIL,
bcc: bccEmail,
},
locals: substitutionData,
});

return expect(result).toStrictEqual({
results: {
id: 'test',
total_accepted_recipients: 1,
total_rejected_recipients: 0,
},
});
});
14 changes: 14 additions & 0 deletions apps/backend/src/eventHandlers/MailService/SMTPMailService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ import path from 'path';
import { logger } from '@user-office-software/duo-logger';
import EmailTemplates from 'email-templates';
import * as nodemailer from 'nodemailer';
import { container } from 'tsyringe';

import { Tokens } from '../../config/Tokens';
import { AdminDataSource } from '../../datasources/AdminDataSource';
import { SettingsId } from '../../models/Settings';
import { isProduction } from '../../utils/helperFunctions';
import EmailSettings from './EmailSettings';
import { MailService, STFCEmailTemplate, SendMailResults } from './MailService';
Expand Down Expand Up @@ -72,6 +76,14 @@ export class SMTPMailService extends MailService {
}

async sendMail(options: EmailSettings): ResultsPromise<SendMailResults> {
const adminDataSource = container.resolve<AdminDataSource>(
Tokens.AdminDataSource
);

const bccAddress = (
await adminDataSource.getSetting(SettingsId.SMTP_BCC_EMAIL)
)?.settingsValue;

const emailPromises: Promise<SendMailResults>[] = [];

const sendMailResults: SendMailResults = {
Expand Down Expand Up @@ -111,11 +123,13 @@ export class SMTPMailService extends MailService {
: <string>process.env.SINK_EMAIL,
name: participant.address?.header_to,
},
bcc: bccAddress,
}
: {
to: isProduction
? participant.address
: <string>process.env.SINK_EMAIL,
bcc: bccAddress,
}),
},
locals: options.substitution_data,
Expand Down
1 change: 1 addition & 0 deletions apps/backend/src/models/Settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ export enum SettingsId {
IDLE_TIMEOUT = 'IDLE_TIMEOUT',
GRADE_PRECISION = 'GRADE_PRECISION',
USER_OFFICE_EMAIL = 'USER_OFFICE_EMAIL',
SMTP_BCC_EMAIL = 'SMTP_BCC_EMAIL',
}
Loading