From 018bd12a1dadf1cc03ef06fbc2dd2dc9d1c24947 Mon Sep 17 00:00:00 2001 From: Yeganathan S <63534555+skwowet@users.noreply.github.com> Date: Thu, 30 Apr 2026 22:53:50 +0530 Subject: [PATCH] fix: handle member identity unique constraint conflicts Signed-off-by: Yeganathan S <63534555+skwowet@users.noreply.github.com> --- .../identities/createMemberIdentity.ts | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/backend/src/api/public/v1/members/identities/createMemberIdentity.ts b/backend/src/api/public/v1/members/identities/createMemberIdentity.ts index 407d1df4fe..8b20b33762 100644 --- a/backend/src/api/public/v1/members/identities/createMemberIdentity.ts +++ b/backend/src/api/public/v1/members/identities/createMemberIdentity.ts @@ -5,7 +5,6 @@ import { captureApiChange, memberEditIdentitiesAction } from '@crowd/audit-logs' import { ConflictError, NotFoundError } from '@crowd/common' import { MemberField, - checkMemberIdentityExistence, findMemberById, createMemberIdentity as insertMemberIdentity, optionsQx, @@ -53,37 +52,35 @@ export async function createMemberIdentity(req: Request, res: Response): Promise captureOldState({}) await qx.tx(async (tx) => { - const existing = await checkMemberIdentityExistence( - tx, - data.value, - data.platform, - data.type, - ) - - for (const identity of existing) { - if (identity.memberId === memberId) { + try { + result = await insertMemberIdentity( + tx, + { + memberId, + platform: data.platform, + value: data.value, + type: data.type, + source: data.source, + verified: data.verified, + verifiedBy: data.verifiedBy, + }, + true, + true, + ) + } catch (error) { + const constraint = + error.constraint ?? error.original?.constraint ?? error.parent?.constraint + + if (constraint === 'uix_memberIdentities_memberId_platform_value_type') { throw new ConflictError('Identity already exists on this member') } - if (identity.verified) { + if (constraint === 'uix_memberIdentities_platform_value_type_verified') { throw new ConflictError('Identity already verified on another member') } - } - result = await insertMemberIdentity( - tx, - { - memberId, - platform: data.platform, - value: data.value, - type: data.type, - source: data.source, - verified: data.verified, - verifiedBy: data.verifiedBy, - }, - true, - true, - ) + throw error + } // touch member updated at to trigger merge suggestion await touchMemberUpdatedAt(tx, memberId)