Skip to content

Commit 7e8b1e6

Browse files
committed
feat: add gb flag
1 parent 9d429c0 commit 7e8b1e6

File tree

8 files changed

+146
-55
lines changed

8 files changed

+146
-55
lines changed

shared/constants/feature-flags.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,11 @@ export const featureFlags = {
2828
singpassMrf: 'singpass-mrf' as const,
2929
enableSaveDraftButtonFloating: 'enable-save-draft-button-floating' as const,
3030
enableSaveDraftButtonHeader: 'enable-save-draft-button-header' as const,
31+
adminEmailPdf: 'admin-email-pdf' as const,
32+
}
33+
34+
export enum AdminEmailPdfFeatureValue {
35+
OFF = 'OFF',
36+
SIGNATURES_ONLY = 'SIGNATURES_ONLY',
37+
ON = 'ON',
3138
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414

1515
import { getEncryptSubmissionModel } from 'src/app/models/submission.server.model'
1616
import * as FormService from 'src/app/modules/form/form.service'
17+
import { AutoreplyPdfGenerationError } from 'src/app/services/mail/mail.errors'
1718
import MailService from 'src/app/services/mail/mail.service'
1819
import * as MailUtils from 'src/app/services/mail/mail.utils'
1920
import {
@@ -29,7 +30,6 @@ import {
2930
createEncryptSubmissionWithoutSave,
3031
performEncryptPostSubmissionActions,
3132
} from '../encrypt-submission.service'
32-
import { AutoreplyPdfGenerationError } from 'src/app/services/mail/mail.errors'
3333

3434
const EncryptSubmission = getEncryptSubmissionModel(mongoose)
3535

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,7 @@ const _createSubmission = async ({
804804
emailFields,
805805
submissionAttachments,
806806
respondentEmails,
807+
growthbook: req.growthbook,
807808
})
808809
}
809810

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { GrowthBook } from '@growthbook/growthbook'
12
import mongoose from 'mongoose'
23
import { err, ok, okAsync, Result, ResultAsync } from 'neverthrow'
34
import Mail from 'nodemailer/lib/mailer'
@@ -11,11 +12,12 @@ import {
1112
import {
1213
EmailAdminDataField,
1314
FieldResponse,
15+
FormFieldSchema,
1416
IEncryptedSubmissionSchema,
1517
IPopulatedEncryptedForm,
1618
IPopulatedForm,
1719
} from '../../../../types'
18-
import config from '../../../config/config'
20+
import config, { isTest } from '../../../config/config'
1921
import { createLoggerWithLabel } from '../../../config/logger'
2022
import { getEncryptSubmissionModel } from '../../../models/submission.server.model'
2123
import { AutoreplyPdfGenerationError } from '../../../services/mail/mail.errors'
@@ -44,7 +46,10 @@ import {
4446
} from '../submission.errors'
4547
import { sendEmailConfirmations } from '../submission.service'
4648
import { ProcessedFieldResponse } from '../submission.types'
47-
import { extractEmailConfirmationData } from '../submission.utils'
49+
import {
50+
extractEmailConfirmationData,
51+
isAdminEmailPdfEnabled,
52+
} from '../submission.utils'
4853

4954
import { CHARTS_MAX_SUBMISSION_RESULTS } from './encrypt-submission.constants'
5055
import { SaveEncryptSubmissionParams } from './encrypt-submission.types'
@@ -136,7 +141,17 @@ export const createEncryptSubmissionWithoutSave = ({
136141
})
137142
}
138143

139-
const checkIfAdminPdfIsRequired = (isPaymentEnabled: boolean): boolean => {
144+
const checkIfAdminPdfIsRequired = (
145+
isPaymentEnabled: boolean,
146+
formFields: FormFieldSchema[],
147+
growthbook?: GrowthBook,
148+
): boolean => {
149+
const isGbFlagEnabled =
150+
isAdminEmailPdfEnabled({ growthbook, formFields }) || isTest
151+
152+
if (!isGbFlagEnabled) {
153+
return false
154+
}
140155
return !isPaymentEnabled
141156
}
142157

@@ -159,14 +174,20 @@ const generatePdfAttachmentIfRequired = ({
159174
submission,
160175
form,
161176
responsesData,
177+
growthbook,
162178
}: {
163179
isPaymentEnabled: boolean
164180
autoReplyMailDatas: AutoReplyMailData[]
165181
submission: IEncryptedSubmissionSchema
166182
form: IPopulatedEncryptedForm
167183
responsesData: EmailAdminDataField[]
184+
growthbook?: GrowthBook
168185
}): ResultAsync<Mail.Attachment | undefined, AutoreplyPdfGenerationError> => {
169-
const isAdminPdfRequired = checkIfAdminPdfIsRequired(isPaymentEnabled)
186+
const isAdminPdfRequired = checkIfAdminPdfIsRequired(
187+
isPaymentEnabled,
188+
form.form_fields,
189+
growthbook,
190+
)
170191
const isRespondentCopyPdfRequired = checkIfRespondentFormSummaryIsRequired({
171192
isPaymentEnabled,
172193
autoReplyMailDatas,
@@ -229,12 +250,14 @@ export const performEncryptPostSubmissionActions = ({
229250
emailFields,
230251
submissionAttachments,
231252
respondentEmails,
253+
growthbook,
232254
}: {
233255
submission: IEncryptedSubmissionSchema
234256
responses: FieldResponse[]
235257
emailFields: ProcessedFieldResponse[]
236258
submissionAttachments?: Mail.Attachment[]
237259
respondentEmails?: string[]
260+
growthbook?: GrowthBook
238261
}): ResultAsync<
239262
true,
240263
| FormNotFoundError
@@ -304,6 +327,7 @@ export const performEncryptPostSubmissionActions = ({
304327
submission,
305328
form,
306329
responsesData: formData,
330+
growthbook,
307331
}).orElse(() => okAsync(undefined))
308332

309333
return pdfAttachmentResult.andThen((pdfAttachment) => {
@@ -319,7 +343,11 @@ export const performEncryptPostSubmissionActions = ({
319343
submissionAttachments,
320344
formData,
321345
dataCollationData: formattedDataCollationData,
322-
pdfAttachment: checkIfAdminPdfIsRequired(isPaymentEnabled)
346+
pdfAttachment: checkIfAdminPdfIsRequired(
347+
isPaymentEnabled,
348+
form.form_fields,
349+
growthbook,
350+
)
323351
? pdfAttachment
324352
: undefined,
325353
}).mapErr((error) => {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
WorkflowType,
1111
} from 'shared/types'
1212

13+
import { AutoreplyPdfGenerationError } from 'src/app/services/mail/mail.errors'
1314
import MailService from 'src/app/services/mail/mail.service'
1415
import * as MailUtils from 'src/app/services/mail/mail.utils'
1516
import {
@@ -29,7 +30,6 @@ import {
2930
performMultiRespondentPostSubmissionUpdateActions,
3031
sendNextStepReminderEmail,
3132
} from '../multirespondent-submission.service'
32-
import { AutoreplyPdfGenerationError } from 'src/app/services/mail/mail.errors'
3333

3434
jest.mock('src/app/modules/datadog/datadog.utils')
3535
jest.mock('src/app/services/mail/mail.utils')
@@ -2240,7 +2240,7 @@ describe('multirespondent-submission.service', () => {
22402240
sendMrfWorkflowCompletionEmailSpy.mock.calls[0][0].emails.length,
22412241
).toBe(1)
22422242
})
2243-
2243+
22442244
it('sends completion email with pdf attachment when single step mrf is completed', async () => {
22452245
// Arrange
22462246
const sendMrfWorkflowCompletionEmailSpy = jest.spyOn(

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ const submitMultirespondentForm = async (
139139
encryptedPayload,
140140
logMeta,
141141
attachments: req.formsg.unencryptedAttachments,
142+
growthbook: req.growthbook,
142143
})
143144
}
144145

@@ -234,6 +235,7 @@ const updateMultirespondentSubmission = async (
234235
encryptedPayload,
235236
logMeta,
236237
attachments: req.formsg.unencryptedAttachments,
238+
growthbook: req.growthbook,
237239
})
238240
}
239241

0 commit comments

Comments
 (0)