From 2c9a13a316f497d76098449ee8036328bdf68941 Mon Sep 17 00:00:00 2001 From: Joana Maia Date: Wed, 6 May 2026 12:31:13 +0100 Subject: [PATCH 1/2] fix: UI identities update Signed-off-by: Joana Maia --- .../identity/contributor-identity-edit.vue | 7 +++--- .../contributor.identities.api.service.ts | 9 +++----- .../contributor/store/contributor.actions.ts | 4 ++-- .../modules/contributor/types/Contributor.ts | 10 ++++++++ .../src/members/identities.ts | 23 ++++++++++++++++--- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/frontend/src/modules/contributor/components/edit/identity/contributor-identity-edit.vue b/frontend/src/modules/contributor/components/edit/identity/contributor-identity-edit.vue index 352ac75ebe..8c88c1b600 100644 --- a/frontend/src/modules/contributor/components/edit/identity/contributor-identity-edit.vue +++ b/frontend/src/modules/contributor/components/edit/identity/contributor-identity-edit.vue @@ -129,12 +129,13 @@ const updateIdentity = () => { sending.value = true; updateContributorIdentity(props.contributor.id, props.modelValue.id, { - ...form, + value: form.value, + type: form.type, + platform: form.type === 'email' ? 'custom' : form.platform, verified: false, source: 'ui', - integrationId: null, sourceId: null, - platform: form.type === 'email' ? 'custom' : form.platform, + integrationId: null, }) .then(() => { ToastStore.success('Identity updated successfully'); diff --git a/frontend/src/modules/contributor/services/contributor.identities.api.service.ts b/frontend/src/modules/contributor/services/contributor.identities.api.service.ts index 073beb04cc..a032c9935e 100644 --- a/frontend/src/modules/contributor/services/contributor.identities.api.service.ts +++ b/frontend/src/modules/contributor/services/contributor.identities.api.service.ts @@ -1,5 +1,5 @@ import authAxios from '@/shared/axios/auth-axios'; -import { ContributorIdentity } from '@/modules/contributor/types/Contributor'; +import { ContributorIdentity, UpdateContributorIdentityPayload } from '@/modules/contributor/types/Contributor'; import { storeToRefs } from 'pinia'; import { useLfSegmentsStore } from '@/modules/lf/segments/store'; @@ -32,13 +32,10 @@ export class ContributorIdentitiesApiService { ).then(({ data }) => Promise.resolve(data)); } - static async update(memberId: string, id: string, identity: Partial) { + static async update(memberId: string, id: string, payload: UpdateContributorIdentityPayload) { return authAxios.patch( `/member/${memberId}/identity/${id}`, - { - ...identity, - segments: getSegments(), - }, + payload, ).then(({ data }) => Promise.resolve(data)); } diff --git a/frontend/src/modules/contributor/store/contributor.actions.ts b/frontend/src/modules/contributor/store/contributor.actions.ts index 281dd15ea6..4be608f130 100644 --- a/frontend/src/modules/contributor/store/contributor.actions.ts +++ b/frontend/src/modules/contributor/store/contributor.actions.ts @@ -1,7 +1,7 @@ import { useLfSegmentsStore } from '@/modules/lf/segments/store'; import { storeToRefs } from 'pinia'; import { ContributorApiService } from '@/modules/contributor/services/contributor.api.service'; -import { Contributor, ContributorAffiliation, ContributorIdentity } from '@/modules/contributor/types/Contributor'; +import { Contributor, ContributorAffiliation, ContributorIdentity, UpdateContributorIdentityPayload } from '@/modules/contributor/types/Contributor'; import { ContributorIdentitiesApiService } from '@/modules/contributor/services/contributor.identities.api.service'; import { MergeActionsService } from '@/shared/modules/merge/services/merge-actions.service'; import { MergeAction } from '@/shared/modules/merge/types/MemberActions'; @@ -72,7 +72,7 @@ export default { return ContributorIdentitiesApiService.createMultiple(memberId, identities) .then(this.setIdentities); }, - updateContributorIdentity(memberId: string, id: string, identity: Partial): Promise { + updateContributorIdentity(memberId: string, id: string, identity: UpdateContributorIdentityPayload): Promise { return ContributorIdentitiesApiService.update(memberId, id, identity) .then(this.setIdentities); }, diff --git a/frontend/src/modules/contributor/types/Contributor.ts b/frontend/src/modules/contributor/types/Contributor.ts index f01e1e2520..9f4b2050dc 100644 --- a/frontend/src/modules/contributor/types/Contributor.ts +++ b/frontend/src/modules/contributor/types/Contributor.ts @@ -73,6 +73,16 @@ export interface ContributorIdentity { duplicatedIdentities?: ContributorIdentity[]; } +export interface UpdateContributorIdentityPayload { + value?: string; + type?: string; + platform?: string; + verified?: boolean; + source?: string | null; + sourceId?: string | null; + integrationId?: string | null; +} + export interface Contributor { activeDaysCount: string; activeOn: string[] | null; diff --git a/services/libs/data-access-layer/src/members/identities.ts b/services/libs/data-access-layer/src/members/identities.ts index 69a7359130..65fe2ca14b 100644 --- a/services/libs/data-access-layer/src/members/identities.ts +++ b/services/libs/data-access-layer/src/members/identities.ts @@ -113,18 +113,35 @@ export async function findMemberIdentitiesByValue( ) } +const UPDATABLE_IDENTITY_FIELDS: ReadonlyArray = [ + 'platform', + 'value', + 'type', + 'verified', + 'verifiedBy', + 'source', + 'sourceId', + 'integrationId', +] + export async function updateMemberIdentity( qx: QueryExecutor, memberId: string, id: string, data: Partial, ): Promise { - if (Object.keys(data).length === 0) return null + const filtered = Object.fromEntries( + Object.entries(data).filter( + ([k, v]) => (UPDATABLE_IDENTITY_FIELDS as readonly string[]).includes(k) && v !== undefined, + ), + ) + + if (Object.keys(filtered).length === 0) return null - const setClause = Object.keys(data).map((key) => `"${key}" = $(${key})`) + const setClause = Object.keys(filtered).map((key) => `"${key}" = $(${key})`) setClause.push('"updatedAt" = now()') - const params = { memberId, id, ...data } + const params = { memberId, id, ...filtered } const query = ` UPDATE "memberIdentities" From f8890c8dcbedbdf524c39cad8fcd744fe64006b4 Mon Sep 17 00:00:00 2001 From: Joana Maia Date: Wed, 6 May 2026 12:52:48 +0100 Subject: [PATCH 2/2] fix: pass segments as query params on identity update and fix lint Signed-off-by: Joana Maia --- .../services/contributor.identities.api.service.ts | 5 +++++ .../src/modules/contributor/store/contributor.actions.ts | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/modules/contributor/services/contributor.identities.api.service.ts b/frontend/src/modules/contributor/services/contributor.identities.api.service.ts index a032c9935e..969d00bb51 100644 --- a/frontend/src/modules/contributor/services/contributor.identities.api.service.ts +++ b/frontend/src/modules/contributor/services/contributor.identities.api.service.ts @@ -36,6 +36,11 @@ export class ContributorIdentitiesApiService { return authAxios.patch( `/member/${memberId}/identity/${id}`, payload, + { + params: { + segments: getSegments(), + }, + }, ).then(({ data }) => Promise.resolve(data)); } diff --git a/frontend/src/modules/contributor/store/contributor.actions.ts b/frontend/src/modules/contributor/store/contributor.actions.ts index 4be608f130..6a8f304bc5 100644 --- a/frontend/src/modules/contributor/store/contributor.actions.ts +++ b/frontend/src/modules/contributor/store/contributor.actions.ts @@ -1,7 +1,9 @@ import { useLfSegmentsStore } from '@/modules/lf/segments/store'; import { storeToRefs } from 'pinia'; import { ContributorApiService } from '@/modules/contributor/services/contributor.api.service'; -import { Contributor, ContributorAffiliation, ContributorIdentity, UpdateContributorIdentityPayload } from '@/modules/contributor/types/Contributor'; +import { + Contributor, ContributorAffiliation, ContributorIdentity, UpdateContributorIdentityPayload, +} from '@/modules/contributor/types/Contributor'; import { ContributorIdentitiesApiService } from '@/modules/contributor/services/contributor.identities.api.service'; import { MergeActionsService } from '@/shared/modules/merge/services/merge-actions.service'; import { MergeAction } from '@/shared/modules/merge/types/MemberActions';