@@ -6,13 +6,15 @@ import { ConflictError, NotFoundError } from '@crowd/common'
66import {
77 MemberField ,
88 findMemberById ,
9+ findMemberIdentitiesByValue ,
910 createMemberIdentity as insertMemberIdentity ,
1011 optionsQx ,
1112 touchMemberUpdatedAt ,
13+ updateMemberIdentity ,
1214} from '@crowd/data-access-layer'
1315import { IMemberIdentity , MemberIdentityType } from '@crowd/types'
1416
15- import { created } from '@/utils/api'
17+ import { created , ok } from '@/utils/api'
1618import { validateOrThrow } from '@/utils/validation'
1719
1820const paramsSchema = z . object ( {
@@ -45,60 +47,82 @@ export async function createMemberIdentity(req: Request, res: Response): Promise
4547 }
4648
4749 let result ! : IMemberIdentity
50+ let alreadyExisted = false
4851
4952 await captureApiChange (
5053 req ,
5154 memberEditIdentitiesAction ( memberId , async ( captureOldState , captureNewState ) => {
5255 captureOldState ( { } )
5356
5457 await qx . tx ( async ( tx ) => {
55- try {
56- result = await insertMemberIdentity (
57- tx ,
58- {
59- memberId,
60- platform : data . platform ,
61- value : data . value ,
62- type : data . type ,
63- source : data . source ,
64- verified : data . verified ,
65- verifiedBy : data . verifiedBy ,
66- } ,
67- true ,
68- true ,
69- )
70- } catch ( error ) {
71- const constraint =
72- error . constraint ?? error . original ?. constraint ?? error . parent ?. constraint
73-
74- if ( constraint === 'uix_memberIdentities_memberId_platform_value_type' ) {
75- throw new ConflictError ( 'Identity already exists on this member' , {
76- platform : data . platform ,
77- value : data . value ,
78- type : data . type ,
79- } )
58+ const existing = await findMemberIdentitiesByValue ( tx , memberId , data . value , {
59+ type : data . type ,
60+ } )
61+
62+ const exactMatch = existing . find ( ( i ) => i . platform === data . platform )
63+
64+ if ( exactMatch ) {
65+ alreadyExisted = true
66+ result = exactMatch
67+ } else {
68+ try {
69+ result = await insertMemberIdentity (
70+ tx ,
71+ {
72+ memberId,
73+ platform : data . platform ,
74+ value : data . value ,
75+ type : data . type ,
76+ source : data . source ,
77+ verified : data . verified ,
78+ verifiedBy : data . verifiedBy ,
79+ } ,
80+ true ,
81+ true ,
82+ )
83+ } catch ( error ) {
84+ const constraint =
85+ error . constraint ?? error . original ?. constraint ?? error . parent ?. constraint
86+
87+ if ( constraint === 'uix_memberIdentities_platform_value_type_verified' ) {
88+ throw new ConflictError ( 'Identity already verified on another member' , {
89+ platform : data . platform ,
90+ value : data . value ,
91+ type : data . type ,
92+ } )
93+ }
94+
95+ throw error
8096 }
97+ }
8198
82- if ( constraint === 'uix_memberIdentities_platform_value_type_verified' ) {
83- throw new ConflictError ( 'Identity already verified on another member' , {
84- platform : data . platform ,
85- value : data . value ,
86- type : data . type ,
87- } )
88- }
99+ if ( data . verified && existing . length > 0 ) {
100+ await Promise . all (
101+ existing . map ( ( i ) =>
102+ updateMemberIdentity ( tx , memberId , i . id , {
103+ verified : true ,
104+ verifiedBy : data . verifiedBy ,
105+ } ) ,
106+ ) ,
107+ )
89108
90- throw error
109+ if ( alreadyExisted ) {
110+ result = {
111+ ...exactMatch ,
112+ verified : true ,
113+ verifiedBy : data . verifiedBy ,
114+ }
115+ }
91116 }
92117
93- // touch member updated at to trigger merge suggestion
94118 await touchMemberUpdatedAt ( tx , memberId )
95119 } )
96120
97121 captureNewState ( result )
98122 } ) ,
99123 )
100124
101- created ( res , {
125+ const response = {
102126 id : result . id ,
103127 value : result . value ,
104128 platform : result . platform ,
@@ -108,5 +132,11 @@ export async function createMemberIdentity(req: Request, res: Response): Promise
108132 source : result . source ?? null ,
109133 createdAt : result . createdAt ,
110134 updatedAt : result . updatedAt ,
111- } )
135+ }
136+
137+ if ( alreadyExisted ) {
138+ ok ( res , response )
139+ } else {
140+ created ( res , response )
141+ }
112142}
0 commit comments