Skip to content
Draft
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
3 changes: 3 additions & 0 deletions apps/backend/src/config/Tokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ export const Tokens = {
),
PostToMessageQueue: Symbol('PostToMessageQueue'),
ProposalDataSource: Symbol('ProposalDataSource'),
ProposalEmailActionSubstitutionDataDecorator: Symbol(
'ProposalEmailActionSubstitutionDataDecorator'
),
ProposalEsiDataSource: Symbol('ProposalEsiDataSource'),
ProposalSettingsDataSource: Symbol('ProposalSettingsDataSource'),
StatusActionsDataSource: Symbol('StatusActionsDataSource'),
Expand Down
5 changes: 5 additions & 0 deletions apps/backend/src/config/dependencyConfigDLS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import PostgresVisitDataSource from '../datasources/postgres/VisitDataSource';
import PostgresVisitRegistrationClaimDataSource from '../datasources/postgres/VisitRegistrationClaimDataSource';
import PostgresWorkflowDataSource from '../datasources/postgres/WorkflowDataSource';
import { DLSEmailHandler } from '../eventHandlers/email/DLS/DLSEmailHandler';
import { decorateDLSProposalEmailActionSubstitutionData } from '../eventHandlers/email/DLS/DLSProposalEmailActionSubstitutionDataDecorator';
import createLoggingHandler from '../eventHandlers/logging';
import { SMTPMailService } from '../eventHandlers/MailService/SMTP/SMTPMailService';
import {
Expand Down Expand Up @@ -87,6 +88,10 @@ mapClass(
PostgresExperimentSafetyPdfTemplateDataSource
);
mapClass(Tokens.ProposalDataSource, PostgresProposalDataSource);
mapValue(
Tokens.ProposalEmailActionSubstitutionDataDecorator,
decorateDLSProposalEmailActionSubstitutionData
);
mapClass(
Tokens.ProposalInternalCommentsDataSource,
PostgresProposalInternalCommentsDataSource
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { container } from 'tsyringe';

import { Tokens } from '../../../config/Tokens';
import { CallDataSource } from '../../../datasources/CallDataSource';
import { EmailReadyType } from '../../workflowEntities/proposal/utils';
import { EmailTemplateId } from '../emailTemplateId';

export const decorateDLSProposalEmailActionSubstitutionData = async (
emailTemplateName: string,
recipientWithData: EmailReadyType
): Promise<Record<string, unknown>> => {
if (emailTemplateName !== EmailTemplateId.ACCEPTED_PROPOSAL) {
return {};
}

const callDataSource = container.resolve<CallDataSource>(
Tokens.CallDataSource
);
const proposalContexts = await Promise.all(
recipientWithData.proposals.map(async (proposal) => ({
proposal,
call: await callDataSource.getCall(proposal.callId),
}))
);

return { proposalContexts };
};
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ export const emailStatusActionRecipient = async (
) => {
const proposalPks = proposals.map((proposal) => proposal.primaryKey);
const emailTemplateId = recipientWithTemplate.emailTemplate.id;
const emailTemplateName = recipientWithTemplate.emailTemplate.name;
const successfulMessage = statusActionsLogId
? 'Email successfully sent on status action replay'
: 'Email successfully sent';
Expand All @@ -116,6 +117,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);

Expand All @@ -141,6 +143,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
));

Expand All @@ -165,6 +168,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);

Expand All @@ -189,6 +193,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);

Expand All @@ -214,6 +219,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);

Expand Down Expand Up @@ -289,6 +295,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);

Expand All @@ -314,6 +321,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);

Expand Down Expand Up @@ -347,6 +355,7 @@ export const emailStatusActionRecipient = async (
successfulMessage,
failMessage,
emailTemplateId,
emailTemplateName,
loggedInUserId
);
}
Expand All @@ -367,6 +376,7 @@ const sendMail = async (
successfulMessage: string,
failMessage: string,
emailTemplateId: string,
emailTemplateName: string,
loggedInUserId?: number | null
) => {
const mailService = container.resolve<MailService>(Tokens.MailService);
Expand All @@ -389,23 +399,48 @@ const sendMail = async (
const mailServiceResponse = await Promise.all(
recipientsWithData.map(async (recipientWithData) => {
try {
const defaultSubstitutionData = {
proposals: recipientWithData.proposals,
pi: recipientWithData.pi,
coProposers: recipientWithData.coProposers,
instruments: recipientWithData.instruments,
firstName: recipientWithData.firstName,
lastName: recipientWithData.lastName,
preferredName: recipientWithData.preferredName,
techniques: recipientWithData.techniques,
proposalTemplate: recipientWithData.proposalTemplate,
samples: recipientWithData.samples,
hazards: recipientWithData.hazards,
};
let additionalSubstitutionData: Record<string, unknown> = {};

if (
container.isRegistered(
Tokens.ProposalEmailActionSubstitutionDataDecorator
)
) {
const decorateSubstitutionData = container.resolve<
(
emailTemplateName: string,
recipientWithData: EmailReadyType
) => Promise<Record<string, unknown>>
>(Tokens.ProposalEmailActionSubstitutionDataDecorator);
additionalSubstitutionData = await decorateSubstitutionData(
emailTemplateName,
recipientWithData
);
}

const substitutionData = {
...defaultSubstitutionData,
...additionalSubstitutionData,
};

const res = await mailService.sendMail({
content: {
template: emailTemplateId,
},
substitution_data: {
proposals: recipientWithData.proposals,
pi: recipientWithData.pi,
coProposers: recipientWithData.coProposers,
instruments: recipientWithData.instruments,
firstName: recipientWithData.firstName,
lastName: recipientWithData.lastName,
preferredName: recipientWithData.preferredName,
techniques: recipientWithData.techniques,
proposalTemplate: recipientWithData.proposalTemplate,
samples: recipientWithData.samples,
hazards: recipientWithData.hazards,
},
substitution_data: substitutionData,
recipients: [{ address: recipientWithData.email }],
});
logger.logInfo('Email sent:', {
Expand Down
Loading