Skip to content

Commit e5509ee

Browse files
committed
feat: move pdf render data copy to common function
1 parent 0a9fc9b commit e5509ee

File tree

5 files changed

+62
-36
lines changed

5 files changed

+62
-36
lines changed

src/app/modules/submission/encrypt-submission/encrypt-submission.service.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import moment from 'moment'
21
import mongoose from 'mongoose'
32
import { err, ok, okAsync, Result, ResultAsync } from 'neverthrow'
43
import Mail from 'nodemailer/lib/mailer'
54

65
import {
6+
BasicField,
77
DateString,
88
FormResponseMode,
99
PaymentChannel,
@@ -25,7 +25,7 @@ import {
2525
AutoReplyMailData,
2626
AutoreplySummaryRenderData,
2727
} from '../../../services/mail/mail.types'
28-
import { generateAutoreplyPdf } from '../../../services/mail/mail.utils'
28+
import { generateAutoreplyPdf, generatePdfRenderData } from '../../../services/mail/mail.utils'
2929
import { createQueryWithDateParam } from '../../../utils/date'
3030
import { getMongoErrorMessage } from '../../../utils/handle-mongo-error'
3131
import { DatabaseError, PossibleDatabaseError } from '../../core/core.errors'
@@ -173,6 +173,15 @@ const checkIfPdfGenerationIsRequired = ({
173173
)
174174
}
175175

176+
const getPdfResponsesData = (responsesData: EmailAdminDataField[]): AutoreplySummaryRenderData['formData'] => {
177+
return responsesData.map(({ question, answerTemplate, answer, fieldType }) => ({
178+
question,
179+
// Only signature field types
180+
answer: fieldType === BasicField.Signature ? answer : undefined,
181+
answerTemplate
182+
}))
183+
}
184+
176185
const generatePdfAttachmentIfRequired = ({
177186
isPaymentEnabled,
178187
autoReplyMailDatas,
@@ -195,25 +204,17 @@ const generatePdfAttachmentIfRequired = ({
195204
return okAsync(undefined)
196205
}
197206

198-
const pdfResponsesData = responsesData.map(
199-
({ question, answerTemplate }) => ({
200-
question,
201-
answerTemplate,
202-
}),
203-
)
204-
205-
const renderData: AutoreplySummaryRenderData = {
207+
const pdfRenderData = generatePdfRenderData({
206208
refNo: submission.id,
207209
formTitle: form.title,
208-
submissionTime: moment(submission.created)
209-
.tz('Asia/Singapore')
210-
.format('ddd, DD MMM YYYY hh:mm:ss A'),
211-
formData: pdfResponsesData,
210+
submissionDateTime: submission.created ?? new Date(),
211+
responsesData,
212212
formUrl: `${config.app.appUrl}/${form._id}`,
213-
}
213+
})
214214

215-
return generateAutoreplyPdf(renderData, true).map((pdfBuffer) => ({
216-
filename: 'response.pdf',
215+
const DEFAULT_RESPONSE_PDF_FILENAME = 'response.pdf'
216+
return generateAutoreplyPdf(pdfRenderData, true).map((pdfBuffer) => ({
217+
filename: DEFAULT_RESPONSE_PDF_FILENAME,
217218
content: Buffer.copyBytesFrom(pdfBuffer),
218219
}))
219220
}

src/app/modules/submission/multirespondent-submission/multirespondent-submission.service.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import moment from 'moment'
21
import mongoose from 'mongoose'
32
import { err, errAsync, ok, okAsync, Result, ResultAsync } from 'neverthrow'
43
import Mail from 'nodemailer/lib/mailer'
@@ -38,8 +37,7 @@ import {
3837
MailSendError,
3938
} from '../../../services/mail/mail.errors'
4039
import MailService from '../../../services/mail/mail.service'
41-
import { AutoreplySummaryRenderData } from '../../../services/mail/mail.types'
42-
import { generateAutoreplyPdf } from '../../../services/mail/mail.utils'
40+
import { generateAutoreplyPdf, generatePdfRenderData } from '../../../services/mail/mail.utils'
4341
import { transformMongoError } from '../../../utils/handle-mongo-error'
4442
import { DatabaseError } from '../../core/core.errors'
4543
import { isFormMultirespondent } from '../../form/form.utils'
@@ -63,10 +61,9 @@ import { reportSubmissionResponseTime } from '../submissions.statsd-client'
6361
import { MultirespondentSubmissionContent } from './multirespondent-submission.types'
6462
import {
6563
extractRespondentCopyEmailDatas,
66-
getEmailFromResponses,
67-
getPdfResponsesData,
68-
getQuestionAnswerPairsForMultipleFields,
69-
retrieveWorkflowStepEmailAddresses,
64+
getEmailFromResponses, getQuestionAnswerPairsForMultipleFields,
65+
getResponsesDataFromMrfResponses,
66+
retrieveWorkflowStepEmailAddresses
7067
} from './multirespondent-submission.utils'
7168

7269
const logger = createLoggerWithLabel(module)
@@ -890,21 +887,16 @@ const generatePdfAttachmentIfRequired = ({
890887
return okAsync(undefined)
891888
}
892889

893-
const submissionTime = moment(submission.created)
894-
.tz('Asia/Singapore')
895-
.format('ddd, DD MMM YYYY hh:mm:ss A')
896-
const formUrl: string = `${config.app.appUrl}/${form._id}`
897-
898-
const pdfRenderData: AutoreplySummaryRenderData = {
890+
const pdfRenderData = generatePdfRenderData({
899891
refNo: submissionId,
900892
formTitle: form.title,
901-
submissionTime: submissionTime,
902-
formData: getPdfResponsesData({
893+
submissionDateTime: submission.created ?? new Date(),
894+
responsesData: getResponsesDataFromMrfResponses({
903895
formFields: form.form_fields,
904896
responses,
905897
}),
906-
formUrl: formUrl,
907-
}
898+
formUrl: `${config.app.appUrl}/${form._id}`,
899+
})
908900

909901
const DEFAULT_RESPONSE_PDF_FILENAME = 'response.pdf'
910902
const pdfResult = generateAutoreplyPdf(pdfRenderData, true).map(

src/app/modules/submission/multirespondent-submission/multirespondent-submission.utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ export const getQuestionAnswerPairsForMultipleFields = ({
479479
* @param responses - The mrf responses to the form fields
480480
* @returns list of EmailRespondentConfirmationField used for email & pdf generation
481481
*/
482-
export const getPdfResponsesData = ({
482+
export const getResponsesDataFromMrfResponses = ({
483483
formFields,
484484
responses,
485485
}: {

src/app/services/mail/mail.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,7 @@ export class MailService {
755755
const adminEmails: string[] = getAdminEmails(form)
756756

757757
return generateSubmissionToAdminHtml(htmlData).andThen((mailHtml) => {
758+
758759
const mail: MailOptions = {
759760
to: adminEmails,
760761
from: this.#senderFromString,

src/app/services/mail/mail.utils.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { flattenDeep } from 'lodash'
44
import { ResultAsync } from 'neverthrow'
55
import validator from 'validator'
66

7-
import { BounceType } from '../../../types'
7+
import { BounceType, EmailRespondentConfirmationField } from '../../../types'
88
import { paymentConfig } from '../../config/features/payment.config'
99
import { createLoggerWithLabel } from '../../config/logger'
1010
import { generatePdfFromHtml } from '../../utils/convert-html-to-pdf'
@@ -22,6 +22,8 @@ import {
2222
PaymentConfirmationData,
2323
SubmissionToAdminHtmlData,
2424
} from './mail.types'
25+
import moment from 'moment'
26+
import { BasicField } from '../../../../shared/types'
2527

2628
const logger = createLoggerWithLabel(module)
2729

@@ -111,6 +113,36 @@ export const generateBounceNotificationHtml = (
111113
return safeRenderFile(pathToTemplate, htmlData)
112114
}
113115

116+
export const generatePdfRenderData = ({
117+
refNo,
118+
formTitle,
119+
submissionDateTime,
120+
responsesData,
121+
formUrl,
122+
}: {
123+
refNo: string
124+
formTitle: string
125+
submissionDateTime: Date
126+
responsesData: EmailRespondentConfirmationField[]
127+
formUrl: string
128+
}): AutoreplySummaryRenderData => {
129+
130+
const pdfResponsesData = responsesData.map(({ question, answerTemplate, answer, fieldType }) => ({
131+
question,
132+
answerTemplate,
133+
// In the submit-form-summary-pdf.server.view.html, for signature field, it expects the answer key, while for others, it expects the answerTemplate key.
134+
answer: fieldType === BasicField.Signature ? answer : undefined,
135+
}))
136+
137+
return {
138+
refNo,
139+
formTitle,
140+
submissionTime: moment(submissionDateTime).tz('Asia/Singapore').format('ddd, DD MMM YYYY hh:mm:ss A'),
141+
formData: pdfResponsesData,
142+
formUrl
143+
}
144+
}
145+
114146
export const generateAutoreplyPdf = (
115147
renderData: AutoreplySummaryRenderData,
116148
isUseLambdaOutput: boolean,

0 commit comments

Comments
 (0)