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

MCR-4888: Add update email settings api #3104

Closed
wants to merge 32 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
7f099b9
Pull out emailer configuration into a function.
JasonLin0991 Jan 22, 2025
8ae1227
Use configureEmailer in unit tests
JasonLin0991 Jan 22, 2025
e8fcfeb
Remove cms email from defaults
JasonLin0991 Jan 23, 2025
e749e07
Add settings domain types
JasonLin0991 Jan 23, 2025
4358881
Add postgres function to find email settings
JasonLin0991 Jan 23, 2025
f12bf85
Abstract email configuration code ,add code to pull from data from DB…
JasonLin0991 Jan 23, 2025
ec60299
Update usage of ldService
JasonLin0991 Jan 23, 2025
798cc9b
Refactor constructTestEmailer
JasonLin0991 Jan 23, 2025
1db1248
Add tests
JasonLin0991 Jan 23, 2025
e85e09c
Make test emailer using DB
JasonLin0991 Jan 23, 2025
ab63bc7
Update schema
JasonLin0991 Jan 24, 2025
db872cb
Merge branch 'main' into mcr-4893-adjust-apollo-gql-hanlder-to-use-fe…
JasonLin0991 Jan 24, 2025
3fa1971
Remove stage and baseUrl from graphql email configuration
JasonLin0991 Jan 24, 2025
1e838c1
Add custom validator for email alias and unit test it.
JasonLin0991 Jan 24, 2025
b4a25c1
Fix type errors
JasonLin0991 Jan 24, 2025
4e1823d
update email settings postgres function
JasonLin0991 Jan 24, 2025
f6d6246
Add updateEmailSettings to graphql
JasonLin0991 Jan 24, 2025
2beeb69
Add updateEmailSettings resolver
JasonLin0991 Jan 24, 2025
da2de2b
Add updateEmailSettings resolver tests
JasonLin0991 Jan 24, 2025
8275b1a
trim white space in emails on validation and add test
JasonLin0991 Jan 24, 2025
91a4ab3
Add another test for empty email settings field
JasonLin0991 Jan 24, 2025
a00b963
add type name to mock
JasonLin0991 Jan 24, 2025
c6eb31c
Fix typo in EmailSettings default values.
JasonLin0991 Jan 24, 2025
65c2bcf
Merge branch 'mcr-4893-adjust-apollo-gql-hanlder-to-use-feature-flag'…
JasonLin0991 Jan 24, 2025
4c808c1
Typo in test
JasonLin0991 Jan 24, 2025
e1035e2
Get rid of email display names
JasonLin0991 Jan 24, 2025
05f891d
Add a comment about database email settings updates and the emailer d…
JasonLin0991 Jan 24, 2025
96a8c3f
Merge branch 'mcr-4893-adjust-apollo-gql-hanlder-to-use-feature-flag'…
JasonLin0991 Jan 24, 2025
e890ef3
Update unit test
JasonLin0991 Jan 24, 2025
283532e
Merge branch 'mcr-4893-adjust-apollo-gql-hanlder-to-use-feature-flag'…
JasonLin0991 Jan 24, 2025
708e7c9
Merge remote-tracking branch 'origin/main' into jl-mcr-4888-add-updat…
haworku Jan 30, 2025
2d96a12
add caching to configureEmailerFromDB. 1 min.
mojotalantikite Jan 30, 2025
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
Prev Previous commit
Next Next commit
Add custom validator for email alias and unit test it.
JasonLin0991 committed Jan 24, 2025
commit 1e838c10ab0cc2a55f6bec4567c618d8b6c355e6
21 changes: 12 additions & 9 deletions services/app-api/src/domain-models/SettingType.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import { z } from 'zod'

const emailAliasRegex = /^"?[^"]+?"?\s*<[^@\s]+@[^@\s]+\.[^@\s]+>$|^[^@\s]+@[^@\s]+\.[^@\s]+$/;
const emailWithAliasSchema = z.string().regex(emailAliasRegex);

const emailSettingsSchema = z.object({
emailSource: z.string().email(),
devReviewTeamEmails: z.array(z.string().email()),
cmsReviewHelpEmailAddress: z.array(z.string().email()),
cmsRateHelpEmailAddress: z.array(z.string().email()),
oactEmails: z.array(z.string().email()),
dmcpReviewEmails: z.array(z.string().email()),
dmcpSubmissionEmails: z.array(z.string().email()),
dmcoEmails: z.array(z.string().email()),
helpDeskEmail: z.array(z.string().email()),
emailSource: emailWithAliasSchema,
devReviewTeamEmails: z.array(emailWithAliasSchema).min(1),
cmsReviewHelpEmailAddress: z.array(emailWithAliasSchema).min(1),
cmsRateHelpEmailAddress: z.array(emailWithAliasSchema).min(1),
oactEmails: z.array(emailWithAliasSchema).min(1),
dmcpReviewEmails: z.array(emailWithAliasSchema).min(1),
dmcpSubmissionEmails: z.array(emailWithAliasSchema).min(1),
dmcoEmails: z.array(emailWithAliasSchema).min(1),
helpDeskEmail: z.array(emailWithAliasSchema).min(1),
})

const applicationSettingsSchema = z.object({
66 changes: 66 additions & 0 deletions services/app-api/src/domain-models/settings.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { emailSettingsSchema } from './SettingType'

describe('emailSettingsSchema', () => {
const validEmailsWithAlias = {
emailSource: '"MC-Review CMS HHS" <local@example.com>',
devReviewTeamEmails: [
'"Dev Reviewer 1" <Dev.reviewer.1@example.com>',
'"Dev Reviewer 2" <Dev.reviewer.2@example.com>',
],
oactEmails: ['"OACT Reviewer 1" <oact-reviewer.1@example.com>'],
dmcpReviewEmails: ['"DMCP Reviewer 1" <dmcp-reviewer.1@example.com>'],
dmcpSubmissionEmails: [
'"DMCP Submission 1" <dmcp-submission.1@example.com>',
'"DMCP Submission 2" <dmcp-submission.2@example.com>',
],
dmcoEmails: ['"DMCO Reviewer 1" <dmco-reviewer.1@example.com>'],
cmsReviewHelpEmailAddress: [
'"Contract Help" <contract.help@example.com>',
],
cmsRateHelpEmailAddress: ['"Rate Help" <rate.help@example.com>'],
helpDeskEmail: ['"Help Desk" <helpdesk@example.com>'],
}

const validEmailsWithoutAlias = {
emailSource: 'local@example.com',
devReviewTeamEmails: ['dev1@example.com'],
oactEmails: ['oact1@example.com', 'oact2@example.com'],
dmcpReviewEmails: ['dmcp1@example.com'],
dmcpSubmissionEmails: ['dmcp.sub1@example.com'],
dmcoEmails: ['dmco1@example.com'],
cmsReviewHelpEmailAddress: ['cms.review@example.com'],
cmsRateHelpEmailAddress: ['cms.rate@example.com'],
helpDeskEmail: ['help@example.com'],
}

it('should validate emails with display names', () => {
const result = emailSettingsSchema.safeParse(validEmailsWithAlias)
expect(result.success).toBe(true)
})

it('should validate plain emails', () => {
const result = emailSettingsSchema.safeParse(validEmailsWithoutAlias)
expect(result.success).toBe(true)
})

it('should reject invalid email format', () => {
const invalidData = { ...validEmailsWithAlias }
invalidData.emailSource = 'invalid-email'
const result = emailSettingsSchema.safeParse(invalidData)
expect(result.success).toBe(false)
})

it('should reject empty email arrays', () => {
const invalidData = { ...validEmailsWithAlias }
invalidData.devReviewTeamEmails = []
const result = emailSettingsSchema.safeParse(invalidData)
expect(result.success).toBe(false)
})

it('should reject malformed email aliases', () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JasonLin0991 ⭐on covering the test cases

const invalidData = { ...validEmailsWithAlias }
invalidData.emailSource = '"Bad Format" bad@example.com>'
const result = emailSettingsSchema.safeParse(invalidData)
expect(result.success).toBe(false)
})
})