From 8c8392c161daf092dc1e624b9e42e6890dca6745 Mon Sep 17 00:00:00 2001 From: Justin Gasper Date: Mon, 8 Dec 2025 11:58:55 +1100 Subject: [PATCH] Mailchimp performance update --- src/common/mailchimp.js | 29 ++++++++++++++++++----------- src/services/MemberService.js | 13 ++++++++----- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/common/mailchimp.js b/src/common/mailchimp.js index fedaebe..66451b1 100644 --- a/src/common/mailchimp.js +++ b/src/common/mailchimp.js @@ -50,18 +50,25 @@ async function deleteSubscriber (email) { throw err } - for (const list of lists) { - try { - await axios.post(`${baseUrl}/lists/${list.id}/members/${subscriberHash}/actions/delete-permanent`, null, { headers }) - } catch (err) { - // A 404 means the subscriber was not present in that list, which is fine - if (err.response && err.response.status === 404) { - logger.info(`MailChimp subscriber not found in list ${list.id}`) - } else { - logger.error(`Failed to delete MailChimp subscriber from list ${list.id}: ${err.message}`) - throw err + const deletionResults = await Promise.allSettled( + lists.map(async (list) => { + try { + await axios.post(`${baseUrl}/lists/${list.id}/members/${subscriberHash}/actions/delete-permanent`, null, { headers }) + } catch (err) { + // A 404 means the subscriber was not present in that list, which is fine + if (err.response && err.response.status === 404) { + logger.info(`MailChimp subscriber not found in list ${list.id}`) + } else { + logger.error(`Failed to delete MailChimp subscriber from list ${list.id}: ${err.message}`) + throw err + } } - } + }) + ) + + const failedDeletion = deletionResults.find((result) => result.status === 'rejected') + if (failedDeletion) { + throw failedDeletion.reason } } diff --git a/src/services/MemberService.js b/src/services/MemberService.js index 06da994..e899a1d 100644 --- a/src/services/MemberService.js +++ b/src/services/MemberService.js @@ -657,11 +657,14 @@ async function deleteMember (currentUser, handle, data) { await skillsPrisma.userSkill.deleteMany({ where: { userId: identityUserId } }) await updateIdentityRecords(identityUserId, deletedHandle, deletedEmail, now) - try { - await mailchimp.deleteSubscriber(member.email) - } catch (err) { - logger.error(`MailChimp deletion failed for ${member.email}: ${err.message}`) - } + // Kick off MailChimp deletion without blocking the API response. + ;(async () => { + try { + await mailchimp.deleteSubscriber(member.email) + } catch (err) { + logger.error(`MailChimp deletion failed for ${member.email}: ${err.message}`) + } + })() prismaHelper.convertMember(updatedMember) await helper.postBusEvent(constants.TOPICS.MemberUpdated, updatedMember)