Skip to content

Commit 8279254

Browse files
authored
fix: prevent 500 on contributor identity update by filtering non-updatable fields (#4077)
Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
1 parent b5551f0 commit 8279254

5 files changed

Lines changed: 44 additions & 12 deletions

File tree

frontend/src/modules/contributor/components/edit/identity/contributor-identity-edit.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,13 @@ const updateIdentity = () => {
129129
sending.value = true;
130130
131131
updateContributorIdentity(props.contributor.id, props.modelValue.id, {
132-
...form,
132+
value: form.value,
133+
type: form.type,
134+
platform: form.type === 'email' ? 'custom' : form.platform,
133135
verified: false,
134136
source: 'ui',
135-
integrationId: null,
136137
sourceId: null,
137-
platform: form.type === 'email' ? 'custom' : form.platform,
138+
integrationId: null,
138139
})
139140
.then(() => {
140141
ToastStore.success('Identity updated successfully');

frontend/src/modules/contributor/services/contributor.identities.api.service.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import authAxios from '@/shared/axios/auth-axios';
2-
import { ContributorIdentity } from '@/modules/contributor/types/Contributor';
2+
import { ContributorIdentity, UpdateContributorIdentityPayload } from '@/modules/contributor/types/Contributor';
33
import { storeToRefs } from 'pinia';
44
import { useLfSegmentsStore } from '@/modules/lf/segments/store';
55

@@ -32,12 +32,14 @@ export class ContributorIdentitiesApiService {
3232
).then(({ data }) => Promise.resolve(data));
3333
}
3434

35-
static async update(memberId: string, id: string, identity: Partial<ContributorIdentity>) {
35+
static async update(memberId: string, id: string, payload: UpdateContributorIdentityPayload) {
3636
return authAxios.patch(
3737
`/member/${memberId}/identity/${id}`,
38+
payload,
3839
{
39-
...identity,
40-
segments: getSegments(),
40+
params: {
41+
segments: getSegments(),
42+
},
4143
},
4244
).then(({ data }) => Promise.resolve(data));
4345
}

frontend/src/modules/contributor/store/contributor.actions.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { useLfSegmentsStore } from '@/modules/lf/segments/store';
22
import { storeToRefs } from 'pinia';
33
import { ContributorApiService } from '@/modules/contributor/services/contributor.api.service';
4-
import { Contributor, ContributorAffiliation, ContributorIdentity } from '@/modules/contributor/types/Contributor';
4+
import {
5+
Contributor, ContributorAffiliation, ContributorIdentity, UpdateContributorIdentityPayload,
6+
} from '@/modules/contributor/types/Contributor';
57
import { ContributorIdentitiesApiService } from '@/modules/contributor/services/contributor.identities.api.service';
68
import { MergeActionsService } from '@/shared/modules/merge/services/merge-actions.service';
79
import { MergeAction } from '@/shared/modules/merge/types/MemberActions';
@@ -72,7 +74,7 @@ export default {
7274
return ContributorIdentitiesApiService.createMultiple(memberId, identities)
7375
.then(this.setIdentities);
7476
},
75-
updateContributorIdentity(memberId: string, id: string, identity: Partial<ContributorIdentity>): Promise<ContributorIdentity[]> {
77+
updateContributorIdentity(memberId: string, id: string, identity: UpdateContributorIdentityPayload): Promise<ContributorIdentity[]> {
7678
return ContributorIdentitiesApiService.update(memberId, id, identity)
7779
.then(this.setIdentities);
7880
},

frontend/src/modules/contributor/types/Contributor.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ export interface ContributorIdentity {
7373
duplicatedIdentities?: ContributorIdentity[];
7474
}
7575

76+
export interface UpdateContributorIdentityPayload {
77+
value?: string;
78+
type?: string;
79+
platform?: string;
80+
verified?: boolean;
81+
source?: string | null;
82+
sourceId?: string | null;
83+
integrationId?: string | null;
84+
}
85+
7686
export interface Contributor {
7787
activeDaysCount: string;
7888
activeOn: string[] | null;

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,35 @@ export async function findMemberIdentitiesByValue(
113113
)
114114
}
115115

116+
const UPDATABLE_IDENTITY_FIELDS: ReadonlyArray<keyof UpdateMemberIdentity> = [
117+
'platform',
118+
'value',
119+
'type',
120+
'verified',
121+
'verifiedBy',
122+
'source',
123+
'sourceId',
124+
'integrationId',
125+
]
126+
116127
export async function updateMemberIdentity(
117128
qx: QueryExecutor,
118129
memberId: string,
119130
id: string,
120131
data: Partial<UpdateMemberIdentity>,
121132
): Promise<IMemberIdentity> {
122-
if (Object.keys(data).length === 0) return null
133+
const filtered = Object.fromEntries(
134+
Object.entries(data).filter(
135+
([k, v]) => (UPDATABLE_IDENTITY_FIELDS as readonly string[]).includes(k) && v !== undefined,
136+
),
137+
)
138+
139+
if (Object.keys(filtered).length === 0) return null
123140

124-
const setClause = Object.keys(data).map((key) => `"${key}" = $(${key})`)
141+
const setClause = Object.keys(filtered).map((key) => `"${key}" = $(${key})`)
125142
setClause.push('"updatedAt" = now()')
126143

127-
const params = { memberId, id, ...data }
144+
const params = { memberId, id, ...filtered }
128145

129146
const query = `
130147
UPDATE "memberIdentities"

0 commit comments

Comments
 (0)