Skip to content

Commit

Permalink
refactor: approve/reject email helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
niall-shaw committed Jan 17, 2024
1 parent e47e4ec commit eb28dd0
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 33 deletions.
26 changes: 25 additions & 1 deletion packages/backend/src/email/client-stub.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { compileEmailTemplate, getSubmitUrls } from './helpers'
import { compileEmailTemplate, getEntityUrl, getSubmitUrls } from './helpers'
import { Invitation } from '@ssi-trust-registry/common'

type SentMessage = {
Expand All @@ -15,6 +15,8 @@ export interface EmailClientStub {
templateParams: Record<string, unknown>,
) => Promise<void>
sendInvitationEmail: (invitation: Invitation) => Promise<void>
sendApprovalEmail: (invitation: Invitation, entityId: string) => Promise<void>
sendRejectionEmail: (invitation: Invitation) => Promise<void>
sentMessages: SentMessage[]
}

Expand Down Expand Up @@ -42,6 +44,28 @@ export function createEmailClientStub(): EmailClientStub {
},
)
},
async sendApprovalEmail(invitation: Invitation, entityId: string) {
const entityUrl = getEntityUrl(entityId)
await this.sendMailFromTemplate(
invitation.emailAddress,
'Congratulations! Your submission has been approved!',
'./src/email/templates/approved.html',
{
entityUrl,
},
)
},
async sendRejectionEmail(invitation: Invitation) {
const { submitUiUrl } = getSubmitUrls(invitation)
await this.sendMailFromTemplate(
invitation.emailAddress,
'Sorry. Your submission has been rejected.',
'./src/email/templates/rejected.html',
{
submitUiUrl,
},
)
},
sentMessages,
}
}
43 changes: 41 additions & 2 deletions packages/backend/src/email/client.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import partial from 'lodash.partial'
import nodemailer, { SentMessageInfo, Transporter } from 'nodemailer'
import { compileEmailTemplate, getSubmitUrls } from './helpers'
import { compileEmailTemplate, getEntityUrl, getSubmitUrls } from './helpers'
import { Invitation } from '@ssi-trust-registry/common'
import { createLogger } from '../logger'

Expand All @@ -14,6 +14,8 @@ export interface EmailClient {
templateParams: Record<string, unknown>,
) => Promise<SentMessageInfo>
sendInvitationEmail: (invitation: Invitation) => Promise<void>
sendApprovalEmail: (invitation: Invitation, entityId: string) => Promise<void>
sendRejectionEmail: (invitation: Invitation) => Promise<void>
}

interface SmtpConfig {
Expand All @@ -30,6 +32,8 @@ export function createEmailClient(config: SmtpConfig): EmailClient {
return {
sendMailFromTemplate: partial(sendMailFromTemplate, transporter),
sendInvitationEmail: partial(sendInvitationEmail, transporter),
sendApprovalEmail: partial(sendApprovalEmail, transporter),
sendRejectionEmail: partial(sendRejectionEmail, transporter),
}
}

Expand All @@ -53,7 +57,7 @@ async function sendInvitationEmail(
invitation: Invitation,
) {
const { submitApiUrl, submitUiUrl } = getSubmitUrls(invitation)
logger.info(`Sending invitation via email to: `, invitation.emailAddress)
logger.info(`Sending submission approved email to: `, invitation.emailAddress)
await sendMailFromTemplate(
transporter,
invitation.emailAddress,
Expand All @@ -65,3 +69,38 @@ async function sendInvitationEmail(
},
)
}

async function sendApprovalEmail(
transporter: Transporter,
invitation: Invitation,
entityId: string,
) {
const entityUrl = getEntityUrl(entityId)
logger.info(`Sending submission approved email to: `, invitation.emailAddress)
await sendMailFromTemplate(
transporter,
invitation.emailAddress,
'Congratulations! Your submission has been approved!',
'./src/email/templates/approved.html',
{
entityUrl,
},
)
}

async function sendRejectionEmail(
transporter: Transporter,
invitation: Invitation,
) {
const { submitUiUrl } = getSubmitUrls(invitation)
logger.info(`Sending submission rejected email to: `, invitation.emailAddress)
await sendMailFromTemplate(
transporter,
invitation.emailAddress,
'Sorry. Your submission has been rejected.',
'./src/email/templates/rejected.html',
{
submitUiUrl,
},
)
}
4 changes: 4 additions & 0 deletions packages/backend/src/email/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,7 @@ export function getSubmitUrls(invitation: Invitation) {
submitUiUrl,
}
}

export function getEntityUrl(entityId: string) {
return `${config.server.frontendUrl}/entities/${entityId}`
}
36 changes: 6 additions & 30 deletions packages/backend/src/submission/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import partial from 'lodash.partial'
import { ValidationService } from '../entity/validationService'
import { SubmissionService } from './service'
import { EmailClient } from '../email/client'
import { config } from '../config'
import { getSubmitUrls } from '../email/helpers'

const logger = createLogger(__filename)
Expand Down Expand Up @@ -179,36 +178,13 @@ async function updateSubmissionState(
await validationService.validateDids(submission.dids)
await validationService.validateSchemas(submission.credentials)

let result
if (state === 'approved') {
const result = await submissionService.approveSubmission(submission)
const entityUrl = `${config.server.frontendUrl}/entities/${result.entity.id}`
logger.info(
`Sending submission approved email to: `,
invitation.emailAddress,
)
await emailClient.sendMailFromTemplate(
invitation.emailAddress,
'Congratulations! Your submission has been approved!',
'./src/email/templates/approved.html',
{
entityUrl,
},
)
res.status(200).json(result)
result = await submissionService.approveSubmission(submission)
await emailClient.sendApprovalEmail(invitation, result.entity.id)
} else {
const result = await submissionService.rejectSubmission(submission)
logger.info(
`Sending submission rejected email to: `,
invitation.emailAddress,
)
await emailClient.sendMailFromTemplate(
invitation.emailAddress,
'Sorry. Your submission has been rejected.',
'./src/email/templates/rejected.html',
{
invitationUrl: `${config.server.frontendUrl}/submit/${invitation.id}`,
},
)
res.status(200).json(result)
result = await submissionService.rejectSubmission(submission)
await emailClient.sendRejectionEmail(invitation)
}
res.status(200).json(result)
}

0 comments on commit eb28dd0

Please sign in to comment.