diff --git a/services/apps/members_enrichment_worker/src/activities/member.ts b/services/apps/members_enrichment_worker/src/activities/member.ts index 0136933fa1..236b3ec2a0 100644 --- a/services/apps/members_enrichment_worker/src/activities/member.ts +++ b/services/apps/members_enrichment_worker/src/activities/member.ts @@ -1,3 +1,4 @@ +import { Error404 } from '@crowd/common' import { CommonMemberService } from '@crowd/common_services' import { MemberField, @@ -136,6 +137,14 @@ export async function mergeMembers( try { await memberService.merge(primaryMemberId, secondaryMemberId) } catch (error) { + if (error instanceof Error404) { + svc.log.info( + { primaryMemberId, secondaryMemberId }, + 'Skipping merge, member no longer exists', + ) + return + } + svc.log.error({ err: error }, 'Failed to merge members') throw error } diff --git a/services/apps/merge_suggestions_worker/src/activities/common.ts b/services/apps/merge_suggestions_worker/src/activities/common.ts index 7ca822f9f9..93c5e6ac86 100644 --- a/services/apps/merge_suggestions_worker/src/activities/common.ts +++ b/services/apps/merge_suggestions_worker/src/activities/common.ts @@ -3,7 +3,7 @@ import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedroc import axios from 'axios' import { performance } from 'perf_hooks' -import { IS_LLM_ENABLED } from '@crowd/common' +import { Error404, IS_LLM_ENABLED } from '@crowd/common' import { CommonMemberService } from '@crowd/common_services' import { pgpQx } from '@crowd/data-access-layer' import { ITenant } from '@crowd/data-access-layer/src/old/apps/merge_suggestions_worker//types' @@ -110,6 +110,14 @@ export async function mergeMembers( try { await memberService.merge(primaryMemberId, secondaryMemberId) } catch (error) { + if (error instanceof Error404) { + svc.log.info( + { primaryMemberId, secondaryMemberId }, + 'Skipping merge, member no longer exists', + ) + return + } + svc.log.error({ err: error }, 'Failed to merge members') throw error } diff --git a/services/apps/script_executor_worker/src/activities/common.ts b/services/apps/script_executor_worker/src/activities/common.ts index 6e8b463267..6f06dba50c 100644 --- a/services/apps/script_executor_worker/src/activities/common.ts +++ b/services/apps/script_executor_worker/src/activities/common.ts @@ -1,5 +1,6 @@ import axios from 'axios' +import { Error404 } from '@crowd/common' import { CommonMemberService, signalMemberUpdate } from '@crowd/common_services' import { pgpQx } from '@crowd/data-access-layer' import { @@ -22,6 +23,14 @@ export async function mergeMembers( try { await memberService.merge(primaryMemberId, secondaryMemberId) } catch (error) { + if (error instanceof Error404) { + svc.log.info( + { primaryMemberId, secondaryMemberId }, + 'Skipping merge, member no longer exists', + ) + return + } + svc.log.error({ err: error }, 'Failed to merge members') throw error } diff --git a/services/libs/common_services/src/services/common.member.service.ts b/services/libs/common_services/src/services/common.member.service.ts index f46f3afd3c..e117196a06 100644 --- a/services/libs/common_services/src/services/common.member.service.ts +++ b/services/libs/common_services/src/services/common.member.service.ts @@ -10,6 +10,7 @@ import { } from '@crowd/audit-logs' import { DEFAULT_TENANT_ID, + Error404, Error409, calculateReach, getEarliestValidDate, @@ -358,6 +359,10 @@ export class CommonMemberService extends LoggerBase { const original = await this.getMemberById(originalId) const toMerge = await this.getMemberById(toMergeId) + if (!original || !toMerge) { + throw new Error404(options?.language) + } + captureOldState({ primary: original, secondary: toMerge, @@ -486,6 +491,10 @@ export class CommonMemberService extends LoggerBase { return { status: 409, mergedId: originalId } } + if (err instanceof Error404) { + throw err + } + this.log.error(err, 'Error while merging members!', { originalId, toMergeId }) await setMergeAction(this.qx, MergeActionType.MEMBER, originalId, toMergeId, { @@ -510,6 +519,10 @@ export class CommonMemberService extends LoggerBase { MemberField.MANUALLY_CHANGED_FIELDS, ]) + if (!member) { + return null + } + const affiliations = await findMemberAffiliations(this.qx, memberId) return {