Skip to content

Commit 678b3b1

Browse files
committed
fix: improve member identity resolve and create api
Signed-off-by: Yeganathan S <63534555+skwowet@users.noreply.github.com>
1 parent 4b7dcce commit 678b3b1

3 files changed

Lines changed: 74 additions & 39 deletions

File tree

backend/src/api/public/v1/members/identities/createMemberIdentity.ts

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import { ConflictError, NotFoundError } from '@crowd/common'
66
import {
77
MemberField,
88
findMemberById,
9+
findMemberIdentitiesByValue,
910
createMemberIdentity as insertMemberIdentity,
1011
optionsQx,
1112
touchMemberUpdatedAt,
13+
updateMemberIdentity,
1214
} from '@crowd/data-access-layer'
1315
import { IMemberIdentity, MemberIdentityType } from '@crowd/types'
1416

15-
import { created } from '@/utils/api'
17+
import { created, ok } from '@/utils/api'
1618
import { validateOrThrow } from '@/utils/validation'
1719

1820
const 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
}

backend/src/api/public/v1/members/resolveMember.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@ export async function resolveMemberByIdentities(req: Request, res: Response): Pr
2323
platform: PlatformType.LFID,
2424
type: MemberIdentityType.USERNAME,
2525
value: lfid,
26+
verified: true,
2627
})),
27-
...(emails?.map((email) => ({ type: MemberIdentityType.EMAIL, value: email })) ?? []),
28+
...(emails?.map((email) => ({
29+
type: MemberIdentityType.EMAIL,
30+
value: email,
31+
verified: true,
32+
})) ?? []),
2833
]
2934

3035
const memberIds = await findMemberIdsByIdentities(qx, identities)

services/libs/data-access-layer/src/members/identities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export async function findMemberIdentitiesByValue(
102102
): Promise<IMemberIdentity[]> {
103103
return qx.select(
104104
`
105-
SELECT id, platform, "sourceId", type, value, verified
105+
SELECT *
106106
FROM "memberIdentities"
107107
WHERE value = $(value)
108108
AND "memberId" = $(memberId)

0 commit comments

Comments
 (0)