From a30349b9a6b2fdc65de62ed5a97e25a80d61e3c6 Mon Sep 17 00:00:00 2001 From: Maithili Kalkar Date: Fri, 5 Jun 2026 11:31:47 -0400 Subject: [PATCH 1/2] fix: unreachable code --- .../announcements/emails/emailBatchService.js | 7 ++-- src/utilities/emailValidators.js | 38 +++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/services/announcements/emails/emailBatchService.js b/src/services/announcements/emails/emailBatchService.js index 451fe65cf1..b099d78cef 100644 --- a/src/services/announcements/emails/emailBatchService.js +++ b/src/services/announcements/emails/emailBatchService.js @@ -48,10 +48,9 @@ class EmailBatchService { (recipient) => !isValidEmailAddress(recipient.email), ); if (invalidRecipients.length > 0) { - const error = new Error('One or more recipient emails are invalid'); - error.statusCode = 400; - error.invalidRecipients = invalidRecipients.map((r) => r.email); - throw error; + throw new Error( + `Invalid email addresses: ${invalidRecipients.map((r) => r.email).join(', ')}`, + ); // Include invalid emails in error message } // Filter to only valid recipients diff --git a/src/utilities/emailValidators.js b/src/utilities/emailValidators.js index 2193221bff..29934007c2 100644 --- a/src/utilities/emailValidators.js +++ b/src/utilities/emailValidators.js @@ -19,12 +19,19 @@ function isValidEmailAddress(email) { */ function normalizeRecipientsToArray(input) { const arr = Array.isArray(input) ? input : [input]; - const trimmed = arr - .map((e) => (typeof e === 'string' ? e.trim() : '')) - .filter((e) => e.length > 0); - // Dedupe case-insensitively + + const splitEmails = arr.flatMap((e) => { + if (typeof e !== 'string') return []; + + return e + .split(',') // 🔥 KEY FIX + .map((email) => email.trim()) + .filter(Boolean); + }); + + // dedupe case-insensitively const seen = new Set(); - return trimmed.filter((e) => { + return splitEmails.filter((e) => { const key = e.toLowerCase(); if (seen.has(key)) return false; seen.add(key); @@ -40,18 +47,17 @@ function normalizeRecipientsToArray(input) { */ function normalizeRecipientsToObjects(input) { if (!Array.isArray(input)) return []; - const emails = input - .filter((item) => { - if (typeof item === 'string') { - return item.trim().length > 0; - } - return item && typeof item.email === 'string' && item.email.trim().length > 0; - }) - .map((item) => ({ - email: typeof item === 'string' ? item.trim() : item.email.trim(), - })); - // Dedupe case-insensitively + const emails = input.flatMap((item) => { + const value = typeof item === 'string' ? item : item?.email || ''; + + return value + .split(',') + .map((email) => email.trim()) + .filter(Boolean) + .map((email) => ({ email })); + }); + const seen = new Set(); return emails.filter((obj) => { const key = obj.email.toLowerCase(); From 5eb6822f48880e3e3a4f0aae8116b83d418fae6c Mon Sep 17 00:00:00 2001 From: Maithili Kalkar Date: Fri, 5 Jun 2026 15:30:21 -0400 Subject: [PATCH 2/2] fix: test --- .../announcements/emails/emailBatchService.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/services/announcements/emails/emailBatchService.js b/src/services/announcements/emails/emailBatchService.js index b099d78cef..969793b43d 100644 --- a/src/services/announcements/emails/emailBatchService.js +++ b/src/services/announcements/emails/emailBatchService.js @@ -37,6 +37,7 @@ class EmailBatchService { // Normalize recipients to { email } const normalizedRecipients = normalizeRecipientsToObjects(recipients); + if (normalizedRecipients.length === 0) { const error = new Error('At least one recipient is required'); error.statusCode = 400; @@ -47,16 +48,15 @@ class EmailBatchService { const invalidRecipients = normalizedRecipients.filter( (recipient) => !isValidEmailAddress(recipient.email), ); + if (invalidRecipients.length > 0) { - throw new Error( - `Invalid email addresses: ${invalidRecipients.map((r) => r.email).join(', ')}`, - ); // Include invalid emails in error message + const error = new Error('One or more recipient emails are invalid'); + error.statusCode = 400; + error.invalidRecipients = invalidRecipients.map((r) => r.email); + throw error; } - // Filter to only valid recipients - const validRecipients = normalizedRecipients.filter((recipient) => - isValidEmailAddress(recipient.email), - ); + const validRecipients = normalizedRecipients; // Check if we have any valid recipients AFTER filtering if (validRecipients.length === 0) {