From 33fd11588d4bec60804b15399f868f508a42b714 Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Mon, 3 Feb 2025 17:27:07 +0100 Subject: [PATCH 01/13] ensure files aangepast naar default register --- .../ensure-klant-for-bedrijf-identifier.ts | 17 ++++++++-- .../persoon-zoeken/ensure-klant-for-bsn.ts | 34 +++++++++++++------ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts index 7892333df..7e4d03546 100644 --- a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts +++ b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts @@ -4,7 +4,10 @@ import { type KlantBedrijfIdentifier, } from "@/services/openklant2"; import { ensureKlantForBedrijfIdentifier as ensureKlantForBedrijfIdentifierOk1 } from "@/services/openklant1/service"; -import { useOpenKlant2 } from "@/services/openklant2/service"; +import { + fetchSystemen, + klantinteractieVersions, +} from "@/services/environment/fetch-systemen"; import { mapBedrijfsIdentifier } from "@/services/openklant1/service"; import { useOrganisatieIds } from "@/stores/user"; @@ -12,9 +15,17 @@ export const ensureKlantForBedrijfIdentifier = async ( identifier: KlantBedrijfIdentifier, bedrijfsnaam: string, ) => { - const isOpenKlant2 = await useOpenKlant2(); + const systemen = await fetchSystemen(); + const defaultSysteem = systemen.find(({ isDefault }) => isDefault); + + if (!defaultSysteem) { + throw new Error("Geen default register gevonden"); + } + + const useKlantInteractiesApi = + defaultSysteem.klantinteractieVersion === klantinteractieVersions.ok2; - if (isOpenKlant2) { + if (useKlantInteractiesApi) { // Gebruik openklant2 implementatie const klant = await findKlantByIdentifier(identifier); return klant ?? (await createKlant(identifier)); diff --git a/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts b/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts index 2ea6868da..d2d833966 100644 --- a/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts +++ b/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts @@ -1,22 +1,36 @@ import { ensureKlantForBsn as ensureKlantForBsn1 } from "@/services/openklant1"; -import { findKlantByIdentifier, createKlant as createKlant2 } from "@/services/openklant2"; -import { useOpenKlant2 } from "@/services/openklant2/service"; -import { useOrganisatieIds } from "@/stores/user"; +import { + findKlantByIdentifier, + createKlant as createKlant2, +} from "@/services/openklant2"; +import { + fetchSystemen, + klantinteractieVersions, +} from "@/services/environment/fetch-systemen"; +import { useOrganisatieIds } from "@/stores/user"; -export const ensureKlantForBsn = async ( - parameters: { bsn: string } -) => { +export const ensureKlantForBsn = async (parameters: { bsn: string }) => { + const systemen = await fetchSystemen(); + const defaultSysteem = systemen.find(({ isDefault }) => isDefault); - const isOpenKlant2 = await useOpenKlant2(); + if (!defaultSysteem) { + throw new Error("Geen default register gevonden"); + } + + const useKlantInteractiesApi = + defaultSysteem.klantinteractieVersion === klantinteractieVersions.ok2; - if (isOpenKlant2) { + if (useKlantInteractiesApi) { // Gebruik openklant2 implementatie - return (await findKlantByIdentifier(parameters)) ?? (await createKlant2(parameters)); + return ( + (await findKlantByIdentifier(parameters)) ?? + (await createKlant2(parameters)) + ); } else { // Gebruik openklant1 implementatie const organisatieIds = useOrganisatieIds(); const bronorganisatie = organisatieIds.value[0] || ""; - + return await ensureKlantForBsn1(parameters, bronorganisatie); } }; From 6621fd41bc9466b91cf0942f4b8e3f3f9a387d49 Mon Sep 17 00:00:00 2001 From: Felix Cornelissen Date: Tue, 4 Feb 2025 15:27:32 +0100 Subject: [PATCH 02/13] add registry for contactmoment and klant to model --- Kiss.Bff/Extern/RegistryConfig.cs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Kiss.Bff/Extern/RegistryConfig.cs b/Kiss.Bff/Extern/RegistryConfig.cs index 63cb7951a..1ca201e16 100644 --- a/Kiss.Bff/Extern/RegistryConfig.cs +++ b/Kiss.Bff/Extern/RegistryConfig.cs @@ -16,8 +16,10 @@ public record RegistrySystem { public bool IsDefault { get; init; } public KlantinteractieVersion KlantinteractieVersion { get; init; } - public required KlantinteractieRegistry KlantinteractieRegistry { get; init; } + public KlantinteractieRegistry? KlantinteractieRegistry { get; init; } public InternetaakRegistry? InterneTaakRegistry { get; init; } + public ContactmomentRegistry? ContactmomentRegistry { get; init; } + public KlantRegistry? KlantRegistry { get; init; } public required string Identifier { get; init; } } @@ -49,6 +51,24 @@ public override void ApplyHeaders(HttpRequestHeaders headers, System.Security.Cl } } + public record KlantRegistry : RegistryBase + { + public override void ApplyHeaders(HttpRequestHeaders headers, System.Security.Claims.ClaimsPrincipal user) + { + var authHeaderProvider = new AuthenticationHeaderProvider(Token, ClientId, ClientSecret); + authHeaderProvider.ApplyAuthorizationHeader(headers, user); + } + } + + public record ContactmomentRegistry : RegistryBase + { + public override void ApplyHeaders(HttpRequestHeaders headers, System.Security.Claims.ClaimsPrincipal user) + { + var authHeaderProvider = new AuthenticationHeaderProvider(Token, ClientId, ClientSecret); + authHeaderProvider.ApplyAuthorizationHeader(headers, user); + } + } + public record InternetaakRegistry : RegistryBase { private const string ContentCrsHeaderName = "Content-Crs"; From bbb8c9db9aa265f4469730d909b33a4921c796e5 Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Tue, 4 Feb 2025 16:43:28 +0100 Subject: [PATCH 03/13] commit 1 --- .../ensure-klant-for-bedrijf-identifier.ts | 70 +++++--- .../klant/klant-details/use-klant-by-id.ts | 33 ++-- .../persoon-zoeken/ensure-klant-for-bsn.ts | 22 +-- src/features/shared/systeemdetails.ts | 19 ++ src/services/openklant2/service.ts | 170 ++++++++++-------- 5 files changed, 175 insertions(+), 139 deletions(-) create mode 100644 src/features/shared/systeemdetails.ts diff --git a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts index 7e4d03546..4cfdd2464 100644 --- a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts +++ b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts @@ -4,43 +4,67 @@ import { type KlantBedrijfIdentifier, } from "@/services/openklant2"; import { ensureKlantForBedrijfIdentifier as ensureKlantForBedrijfIdentifierOk1 } from "@/services/openklant1/service"; -import { - fetchSystemen, - klantinteractieVersions, -} from "@/services/environment/fetch-systemen"; import { mapBedrijfsIdentifier } from "@/services/openklant1/service"; import { useOrganisatieIds } from "@/stores/user"; +import { getRegisterDetails as getSysteemDetails } from "@/features/shared/systeemdetails"; +import { fetchWithSysteemId } from "@/services/fetch-with-systeem-id"; export const ensureKlantForBedrijfIdentifier = async ( - identifier: KlantBedrijfIdentifier, + klantbedrijfidentifier: KlantBedrijfIdentifier, bedrijfsnaam: string, ) => { - const systemen = await fetchSystemen(); - const defaultSysteem = systemen.find(({ isDefault }) => isDefault); - - if (!defaultSysteem) { - throw new Error("Geen default register gevonden"); - } - - const useKlantInteractiesApi = - defaultSysteem.klantinteractieVersion === klantinteractieVersions.ok2; + const { useKlantInteractiesApi, systeemId } = await getSysteemDetails(); if (useKlantInteractiesApi) { - // Gebruik openklant2 implementatie - const klant = await findKlantByIdentifier(identifier); - return klant ?? (await createKlant(identifier)); + const klant = await findKlantByIdentifier( + systeemId, + klantbedrijfidentifier, + ); + return klant ?? (await createKlant(klantbedrijfidentifier)); } else { - // Gebruik openklant1 implementatie - const mappedIdentifier = mapBedrijfsIdentifier(identifier); + const mappedIdentifier = mapBedrijfsIdentifier(klantbedrijfidentifier); const organisatieIds = useOrganisatieIds(); const organisatieId = organisatieIds.value[0] || ""; return await ensureKlantForBedrijfIdentifierOk1( - { - bedrijfsnaam, - identifier: mappedIdentifier, - }, + { bedrijfsnaam, identifier: mappedIdentifier }, organisatieId, ); } }; + +// import { +// findKlantByIdentifier, +// createKlant, +// type KlantBedrijfIdentifier, +// } from "@/services/openklant2"; +// import { ensureKlantForBedrijfIdentifier as ensureKlantForBedrijfIdentifierOk1 } from "@/services/openklant1/service"; +// import { useOpenKlant2 } from "@/services/openklant2/service"; +// import { mapBedrijfsIdentifier } from "@/services/openklant1/service"; +// import { useOrganisatieIds } from "@/stores/user"; + +// export const ensureKlantForBedrijfIdentifier = async ( +// identifier: KlantBedrijfIdentifier, +// bedrijfsnaam: string, +// ) => { +// const isOpenKlant2 = await useOpenKlant2(); + +// if (isOpenKlant2) { +// // Gebruik openklant2 implementatie +// const klant = await findKlantByIdentifier(identifier); +// return klant ?? (await createKlant(identifier)); +// } else { +// // Gebruik openklant1 implementatie +// const mappedIdentifier = mapBedrijfsIdentifier(identifier); +// const organisatieIds = useOrganisatieIds(); +// const organisatieId = organisatieIds.value[0] || ""; + +// return await ensureKlantForBedrijfIdentifierOk1( +// { +// bedrijfsnaam, +// identifier: mappedIdentifier, +// }, +// organisatieId, +// ); +// } +// }; diff --git a/src/features/klant/klant-details/use-klant-by-id.ts b/src/features/klant/klant-details/use-klant-by-id.ts index e4816f858..3ade14a19 100644 --- a/src/features/klant/klant-details/use-klant-by-id.ts +++ b/src/features/klant/klant-details/use-klant-by-id.ts @@ -2,31 +2,20 @@ import { ServiceResult } from "@/services"; import type { Ref } from "vue"; import { fetchKlantByIdOk2 } from "@/services/openklant2"; import { fetchKlantByIdOk1 } from "@/services/openklant1"; +import { getRegisterDetails } from "@/features/shared/systeemdetails"; // Nieuwe methode om interacties API te bepalen -export const useKlantById = ( - id: Ref, - gebruikKlantInteractiesApi: Ref, -) => { - const getApiSpecifickUrl = () => { - if (gebruikKlantInteractiesApi.value === null) { - return ""; - } +export const useKlantById = (id: Ref) => { + const getApiSpecifiekUrl = () => id.value || ""; - return id.value; - }; + const fetchKlant = async (url: string) => { + if (!url) return null; + + const { useKlantInteractiesApi, systeemId } = await getRegisterDetails(); - const fetchKlant = ( - url: string, - gebruikKlantinteractiesApi: Ref, - ) => { - if (gebruikKlantinteractiesApi.value) { - return fetchKlantByIdOk2(url); - } else { - return fetchKlantByIdOk1(url); - } + return useKlantInteractiesApi + ? fetchKlantByIdOk2(systeemId, url) + : fetchKlantByIdOk1(url); }; - return ServiceResult.fromFetcher(getApiSpecifickUrl, (u: string) => - fetchKlant(u, gebruikKlantInteractiesApi), - ); + return ServiceResult.fromFetcher(getApiSpecifiekUrl, fetchKlant); }; diff --git a/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts b/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts index d2d833966..84571fb1c 100644 --- a/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts +++ b/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts @@ -3,34 +3,20 @@ import { findKlantByIdentifier, createKlant as createKlant2, } from "@/services/openklant2"; -import { - fetchSystemen, - klantinteractieVersions, -} from "@/services/environment/fetch-systemen"; import { useOrganisatieIds } from "@/stores/user"; +import { getRegisterDetails } from "@/features/shared/systeemdetails"; export const ensureKlantForBsn = async (parameters: { bsn: string }) => { - const systemen = await fetchSystemen(); - const defaultSysteem = systemen.find(({ isDefault }) => isDefault); - - if (!defaultSysteem) { - throw new Error("Geen default register gevonden"); - } - - const useKlantInteractiesApi = - defaultSysteem.klantinteractieVersion === klantinteractieVersions.ok2; + const { useKlantInteractiesApi, systeemId } = await getRegisterDetails(); if (useKlantInteractiesApi) { - // Gebruik openklant2 implementatie return ( - (await findKlantByIdentifier(parameters)) ?? - (await createKlant2(parameters)) + (await findKlantByIdentifier(systeemId, parameters)) ?? + (await createKlant2(systeemId, parameters)) ); } else { - // Gebruik openklant1 implementatie const organisatieIds = useOrganisatieIds(); const bronorganisatie = organisatieIds.value[0] || ""; - return await ensureKlantForBsn1(parameters, bronorganisatie); } }; diff --git a/src/features/shared/systeemdetails.ts b/src/features/shared/systeemdetails.ts new file mode 100644 index 000000000..75f514baf --- /dev/null +++ b/src/features/shared/systeemdetails.ts @@ -0,0 +1,19 @@ +import { + fetchSystemen, + klantinteractieVersions, +} from "@/services/environment/fetch-systemen"; + +export const getRegisterDetails = async () => { + const systemen = await fetchSystemen(); + const defaultSysteem = systemen.find(({ isDefault }) => isDefault); + + if (!defaultSysteem) { + throw new Error("Geen default register gevonden"); + } + + return { + systeemId: defaultSysteem.identifier, + useKlantInteractiesApi: + defaultSysteem.klantinteractieVersion === klantinteractieVersions.ok2, + }; +}; diff --git a/src/services/openklant2/service.ts b/src/services/openklant2/service.ts index 870b45667..dd7d6a7db 100644 --- a/src/services/openklant2/service.ts +++ b/src/services/openklant2/service.ts @@ -535,16 +535,17 @@ const postDigitaalAdres = async ( //----------------------------------------------------------------------------------------------------------- -export const fetchKlantByIdOk2 = (uuid: string) => { +export const fetchKlantByIdOk2 = (systeemId: string, uuid: string) => { return fetchLoggedIn( `${klantinteractiesBaseUrl}/partijen/${uuid}?${new URLSearchParams({ expand: "digitaleAdressen" })}`, ) .then(throwIfNotOk) .then(parseJson) - .then(mapPartijToKlant); + .then((partij) => mapPartijToKlant(systeemId, partij)); }; export function findKlantByIdentifier( + systeemId: string, query: | { vestigingsnummer: string; @@ -597,14 +598,20 @@ export function findKlantByIdentifier( partijIdentificator__objectId, }); - return fetchLoggedIn(`${klantinteractiesBaseUrl}/partijen?${searchParams}`) + return fetchWithSysteemId( + systeemId, + `${klantinteractiesBaseUrl}/partijen?${searchParams}`, + ) .then(throwIfNotOk) .then(parseJson) - .then((r) => parsePagination(r, (x) => mapPartijToKlant(x as Partij))) + .then((r) => + parsePagination(r, (x) => mapPartijToKlant(systeemId, x as Partij)), + ) .then(enforceOneOrZero); } export async function createKlant( + systeemId: string, parameters: | { vestigingsnummer: string; @@ -649,7 +656,11 @@ export async function createKlant( if (!partijIdentificator) throw new Error(""); - const partij = await createPartij(partijIdentificatie, soortPartij); + const partij = await createPartij( + systeemId, + partijIdentificatie, + soortPartij, + ); const identificators = [ await createPartijIdentificator({ @@ -675,7 +686,7 @@ export async function createKlant( identificators.push(kvkIdentificator); } - return mapPartijToKlant(partij, identificators); + return mapPartijToKlant(systeemId, partij, identificators); } const createPartijIdentificator = (body: { @@ -697,16 +708,20 @@ const createPartijIdentificator = (body: { .then(throwIfNotOk) .then(parseJson); -const getPartijIdentificator = (uuid: string) => - fetchLoggedIn(klantinteractiesBaseUrl + "/partij-identificatoren/" + uuid) +const getPartijIdentificator = (systeemId: string, uuid: string) => + fetchWithSysteemId( + systeemId, + klantinteractiesBaseUrl + "/partij-identificatoren/" + uuid, + ) .then(throwIfNotOk) .then(parseJson); function createPartij( + systeemId: string, partijIdentificatie: { naam: string } | { contactnaam: Contactnaam | null }, soortPartij: PartijTypes, ) { - return fetchLoggedIn(klantinteractiesBaseUrl + "/partijen", { + return fetchWithSysteemId(systeemId, klantinteractiesBaseUrl + "/partijen", { body: JSON.stringify({ digitaleAdressen: [], betrokkenen: [], @@ -731,12 +746,13 @@ function createPartij( } async function mapPartijToKlant( + systeemId: string, partij: Partij, identificatoren?: any[], ): Promise { if (!identificatoren?.length) { const promises = partij.partijIdentificatoren.map(({ uuid }) => - getPartijIdentificator(uuid), + getPartijIdentificator(systeemId, uuid), ); identificatoren = await Promise.all(promises); } @@ -773,72 +789,72 @@ async function mapPartijToKlant( return ret; } -export function searchKlantenByDigitaalAdres( - query: - | { - telefoonnummer: string; - partijType: PartijTypes; - } - | { - email: string; - partijType: PartijTypes; - }, -) { - let key: DigitaalAdresTypes, value: string; - - if ("telefoonnummer" in query) { - key = DigitaalAdresTypes.telefoonnummer; - value = query.telefoonnummer; - } else { - key = DigitaalAdresTypes.email; - value = query.email; - } - - const searchParams = new URLSearchParams(); - searchParams.append("verstrektDoorPartij__soortPartij", query.partijType); - searchParams.append("soortDigitaalAdres", key); - searchParams.append("adres__icontains", value); - - const url = klantinteractiesBaseUrl + "/digitaleadressen?" + searchParams; - - return ( - fetchLoggedIn(url) - .then(throwIfNotOk) - .then(parseJson) - .then( - ({ - results, - }: { - results: { verstrektDoorPartij: { uuid: string } }[]; - }) => { - const partijIds = results.map((x) => x.verstrektDoorPartij.uuid); - const uniquePartijIds = [...new Set(partijIds)]; - const promises = uniquePartijIds.map(fetchKlantByIdOk2); - return Promise.all(promises); - }, - ) - // TIJDELIJK: de filters werken nog niet in OpenKlant 2.1, dat komt in een nieuwe release - // daarom filteren we hier handmatig - .then((klanten) => - klanten.filter((klant) => { - const isBedrijf = - !!klant.kvkNummer || !!klant.vestigingsnummer || !!klant.rsin; - if (!isBedrijf) return false; - const matchesEmail = - key === DigitaalAdresTypes.email && - klant.emailadressen.some((adres: string | string[]) => - adres.includes(value), - ); - const matchesTelefoon = - key === DigitaalAdresTypes.telefoonnummer && - klant.telefoonnummers.some((adres: string | string[]) => - adres.includes(value), - ); - return matchesEmail || matchesTelefoon; - }), - ) - ); -} +// export function searchKlantenByDigitaalAdres( +// query: +// | { +// telefoonnummer: string; +// partijType: PartijTypes; +// } +// | { +// email: string;~ +// partijType: PartijTypes; +// }, +// ) { +// let key: DigitaalAdresTypes, value: string; + +// if ("telefoonnummer" in query) { +// key = DigitaalAdresTypes.telefoonnummer; +// value = query.telefoonnummer; +// } else { +// key = DigitaalAdresTypes.email; +// value = query.email; +// } + +// const searchParams = new URLSearchParams(); +// searchParams.append("verstrektDoorPartij__soortPartij", query.partijType); +// searchParams.append("soortDigitaalAdres", key); +// searchParams.append("adres__icontains", value); + +// const url = klantinteractiesBaseUrl + "/digitaleadressen?" + searchParams; + +// return ( +// fetchLoggedIn(url) +// .then(throwIfNotOk) +// .then(parseJson) +// .then( +// ({ +// results, +// }: { +// results: { verstrektDoorPartij: { uuid: string } }[]; +// }) => { +// const partijIds = results.map((x) => x.verstrektDoorPartij.uuid); +// const uniquePartijIds = [...new Set(partijIds)]; +// const promises = uniquePartijIds.map(fetchKlantByIdOk2); +// return Promise.all(promises); +// }, +// ) +// // TIJDELIJK: de filters werken nog niet in OpenKlant 2.1, dat komt in een nieuwe release +// // daarom filteren we hier handmatig +// .then((klanten) => +// klanten.filter((klant) => { +// const isBedrijf = +// !!klant.kvkNummer || !!klant.vestigingsnummer || !!klant.rsin; +// if (!isBedrijf) return false; +// const matchesEmail = +// key === DigitaalAdresTypes.email && +// klant.emailadressen.some((adres: string | string[]) => +// adres.includes(value), +// ); +// const matchesTelefoon = +// key === DigitaalAdresTypes.telefoonnummer && +// klant.telefoonnummers.some((adres: string | string[]) => +// adres.includes(value), +// ); +// return matchesEmail || matchesTelefoon; +// }), +// ) +// ); +// } /** bepaal of de openklant api of de klantinteracties api gebruikt moet worden voor verwerken van contactmomenten en contactverzoeken * @deprecated use fetchSystemen in stead @@ -909,3 +925,5 @@ export function fetchKlantcontacten({ parsePagination(r, (x) => x as ExpandedKlantContactApiViewmodel), ); } + +export { fetchWithSysteemId }; From bc70c9b42f415bed41308359b93d8f542b663ef9 Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Tue, 4 Feb 2025 17:11:44 +0100 Subject: [PATCH 04/13] error fix --- .../bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts index 4cfdd2464..35e72841e 100644 --- a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts +++ b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts @@ -20,7 +20,7 @@ export const ensureKlantForBedrijfIdentifier = async ( systeemId, klantbedrijfidentifier, ); - return klant ?? (await createKlant(klantbedrijfidentifier)); + return klant ?? (await createKlant(systeemId, klantbedrijfidentifier)); } else { const mappedIdentifier = mapBedrijfsIdentifier(klantbedrijfidentifier); const organisatieIds = useOrganisatieIds(); From 956bec8998887e5cceac45953c87597c1926cdf6 Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Wed, 5 Feb 2025 13:07:36 +0100 Subject: [PATCH 05/13] commit 2 --- Kiss.Bff/Extern/RegistryConfig.cs | 6 +- Kiss.Bff/Extern/RegistryConfigExtensions.cs | 196 ++++++++++++------ .../PostContactmomentenCustomProxy.cs | 2 +- .../Klanten/KlantenProxyConfig.cs | 71 +++---- .../Environment/EnvironmentController.cs | 2 +- Kiss.Bff/Program.cs | 2 - .../ensure-klant-for-bedrijf-identifier.ts | 38 +--- .../use-klant-by-bedrijf-identifier.ts | 12 +- .../persoon-zoeken/ensure-klant-for-bsn.ts | 2 +- src/features/shared/systeemdetails.ts | 4 +- src/services/environment/fetch-systemen.ts | 4 +- src/services/openklant1/service.ts | 84 ++++---- src/services/openklant2/service.ts | 9 +- 13 files changed, 227 insertions(+), 205 deletions(-) diff --git a/Kiss.Bff/Extern/RegistryConfig.cs b/Kiss.Bff/Extern/RegistryConfig.cs index 1ca201e16..6d680dfa2 100644 --- a/Kiss.Bff/Extern/RegistryConfig.cs +++ b/Kiss.Bff/Extern/RegistryConfig.cs @@ -15,7 +15,7 @@ public record RegistryConfig public record RegistrySystem { public bool IsDefault { get; init; } - public KlantinteractieVersion KlantinteractieVersion { get; init; } + public RegistryVersion RegistryVersion { get; init; } public KlantinteractieRegistry? KlantinteractieRegistry { get; init; } public InternetaakRegistry? InterneTaakRegistry { get; init; } public ContactmomentRegistry? ContactmomentRegistry { get; init; } @@ -23,8 +23,8 @@ public record RegistrySystem public required string Identifier { get; init; } } - [JsonConverter(typeof(JsonStringEnumConverter))] - public enum KlantinteractieVersion + [JsonConverter(typeof(JsonStringEnumConverter))] + public enum RegistryVersion { OpenKlant1, OpenKlant2, diff --git a/Kiss.Bff/Extern/RegistryConfigExtensions.cs b/Kiss.Bff/Extern/RegistryConfigExtensions.cs index ea60064ef..3edd8a36b 100644 --- a/Kiss.Bff/Extern/RegistryConfigExtensions.cs +++ b/Kiss.Bff/Extern/RegistryConfigExtensions.cs @@ -22,14 +22,17 @@ public static IServiceCollection AddRegistryConfig(this IServiceCollection servi } /// - /// Get the registry config using the new convention of environment variables
- /// For example:
- /// REGISTERS__0__IS_DEFAULT
- /// REGISTERS__0__KLANTINTERACTIE_CLIENT_ID
+ /// Haalt de registry-configuratie op uit de applicatie-instellingen. + /// Verwacht een lijst onder de sectie REGISTERS met sleutels zoals: + /// - KLANTINTERACTIE_BASE_URL (verplicht) + /// - KLANTINTERACTIE_API_VERSION + /// - KLANTINTERACTIE_TOKEN + /// - CONTACTMOMENTEN_BASE_URL, CONTACTMOMENTEN_API_CLIENT_ID, CONTACTMOMENTEN_API_KEY + /// - INTERNE_TAAK_BASE_URL, INTERNE_TAAK_CLIENT_ID, INTERNE_TAAK_CLIENT_SECRET, INTERNE_TAAK_TOKEN + /// - KLANTEN_BASE_URL, KLANTEN_CLIENT_ID, KLANTEN_CLIENT_SECRET + /// + /// Gooit een fout als de verplichte KLANTINTERACTIE_BASE_URL ontbreekt. ///
- /// - /// - /// Throws when the KLANTINTERACTIE_BASE_URL is missing private static IEnumerable GetRegistryConfiguration(IConfiguration configuration) { var configs = configuration.GetSection("REGISTERS")?.Get>>() ?? []; @@ -37,39 +40,68 @@ private static IEnumerable GetRegistryConfiguration(IConfigurati foreach (var item in configs) { string? GetValue(string key) => item.TryGetValue(key, out var value) ? value : default; - var contactmomentenBaseUrl = GetValue("KLANTINTERACTIE_BASE_URL") ?? throw new Exception("Fout: base url ontbreekt voor klantinteractie"); - var interneTaakBaseUrl = GetValue("INTERNE_TAAK_BASE_URL"); - var interneTaakObjectTypeUrl = GetValue("INTERNE_TAAK_OBJECT_TYPE_URL"); + var registryVersion = Enum.TryParse(GetValue("REGISTRY_VERSION"), out var versie) + ? versie + : RegistryVersion.OpenKlant2; - yield return new RegistrySystem + var isDefault = bool.TryParse(GetValue("IS_DEFAULT"), out var defaultValue) && defaultValue; + + if (registryVersion == RegistryVersion.OpenKlant2) { - IsDefault = bool.TryParse(GetValue("IS_DEFAULT"), out var isDefault) && isDefault, - KlantinteractieVersion = Enum.TryParse(GetValue("KLANTINTERACTIE_API_VERSION"), out var versie) - ? versie - : KlantinteractieVersion.OpenKlant2, - Identifier = contactmomentenBaseUrl, - KlantinteractieRegistry = new KlantinteractieRegistry + var klantinteractieBaseUrl = GetValue("KLANTINTERACTIE_BASE_URL") ?? throw new Exception("Fout: base url ontbreekt voor klantinteractie"); + + yield return new RegistrySystem { - BaseUrl = contactmomentenBaseUrl, - ClientId = GetValue("KLANTINTERACTIE_CLIENT_ID"), - ClientSecret = GetValue("KLANTINTERACTIE_CLIENT_SECRET"), - Token = GetValue("KLANTINTERACTIE_TOKEN") - }, - InterneTaakRegistry = string.IsNullOrWhiteSpace(interneTaakBaseUrl) || string.IsNullOrWhiteSpace(interneTaakObjectTypeUrl) - ? null - : new InternetaakRegistry + IsDefault = isDefault, + RegistryVersion = registryVersion, + Identifier = klantinteractieBaseUrl, + KlantinteractieRegistry = new KlantinteractieRegistry { - BaseUrl = interneTaakBaseUrl, - ClientId = GetValue("INTERNE_TAAK_CLIENT_ID"), - ClientSecret = GetValue("INTERNE_TAAK_CLIENT_SECRET"), - Token = GetValue("INTERNE_TAAK_TOKEN"), - ObjectTypeUrl = interneTaakObjectTypeUrl, - ObjectTypeVersion = GetValue("INTERNE_TAAK_TYPE_VERSION") ?? "1" + BaseUrl = klantinteractieBaseUrl, + Token = GetValue("KLANTINTERACTIE_TOKEN") } - }; + }; + } + else if (registryVersion == RegistryVersion.OpenKlant1) + { + var contactmomentenBaseUrl = GetValue("CONTACTMOMENTEN_BASE_URL") ?? throw new Exception("Fout: base url ontbreekt voor contactmomenten"); + var interneTaakBaseUrl = GetValue("INTERNE_TAAK_BASE_URL"); + var interneTaakObjectTypeUrl = GetValue("INTERNE_TAAK_OBJECT_TYPE_URL"); + + yield return new RegistrySystem + { + IsDefault = isDefault, + RegistryVersion = registryVersion, + Identifier = contactmomentenBaseUrl, + ContactmomentRegistry = new ContactmomentRegistry + { + BaseUrl = contactmomentenBaseUrl, + ClientId = GetValue("CONTACTMOMENTEN_API_CLIENT_ID"), + ClientSecret = GetValue("CONTACTMOMENTEN_API_KEY"), + }, + InterneTaakRegistry = string.IsNullOrWhiteSpace(interneTaakBaseUrl) || string.IsNullOrWhiteSpace(interneTaakObjectTypeUrl) + ? null + : new InternetaakRegistry + { + BaseUrl = interneTaakBaseUrl, + ClientId = GetValue("INTERNE_TAAK_CLIENT_ID"), + ClientSecret = GetValue("INTERNE_TAAK_CLIENT_SECRET"), + Token = GetValue("INTERNE_TAAK_TOKEN"), + ObjectTypeUrl = interneTaakObjectTypeUrl, + ObjectTypeVersion = GetValue("INTERNE_TAAK_TYPE_VERSION") ?? "1" + }, + KlantRegistry = new KlantRegistry + { + BaseUrl = GetValue("KLANTEN_BASE_URL"), + ClientId = GetValue("KLANTEN_CLIENT_ID"), + ClientSecret = GetValue("KLANTEN_CLIENT_SECRET"), + } + }; + } } } + /// /// Checks if the configuration of the registries is sufficient /// @@ -77,51 +109,79 @@ private static IEnumerable GetRegistryConfiguration(IConfigurati /// An error message if applicable, or an empty string if all is well private static string Validate(IReadOnlyList systemen) { - // we can't throw in this case, because it causes tests to fail - if (systemen.Count == 0) return ""; + if (systemen.Count == 0) + { + return "FOUT: Er zijn geen registraties geconfigureerd."; + } foreach (var systeem in systemen) { - // OK2 - if (systeem.KlantinteractieVersion == KlantinteractieVersion.OpenKlant2) - { - if (string.IsNullOrWhiteSpace(systeem.KlantinteractieRegistry?.Token)) - { - return "FOUT: Bij OpenKlant2 moet voor het KlantinteractieRegister een Token geconfigureerd worden."; - } - } - // OK1 - else + switch (systeem.RegistryVersion) { - if (string.IsNullOrWhiteSpace(systeem.KlantinteractieRegistry?.ClientSecret) || string.IsNullOrWhiteSpace(systeem.KlantinteractieRegistry?.ClientId)) - { - return "FOUT: Bij OpenKlant1 / eSuite moet voor het KlantinteractieRegister een ClientSecret en een ClientId geconfigureerd worden."; - } - if (string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry?.Token) - && (string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry?.ClientId) || string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry?.ClientSecret))) - { - return "FOUT: Bij eSuite moet voor het InterneTaakRegister een ClientSecret en een ClientId geconfigureerd worden. Bij OpenKlant1 moet voor het InterneTaakRegister een Token geconfigureerd worden."; - } - if (string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry?.ObjectTypeUrl)) - { - return "FOUT: Bij OpenKlant1 / eSuite moet voor het InterneTaakRegister ObjectTypeUrl geconfigureerd worden."; - } - } - } + case RegistryVersion.OpenKlant2: + if (string.IsNullOrWhiteSpace(systeem.KlantinteractieRegistry?.BaseUrl)) + { + return "FOUT: Bij OpenKlant2 moet voor het KlantinteractieRegister een BaseUrl geconfigureerd worden."; + } + if (string.IsNullOrWhiteSpace(systeem.KlantinteractieRegistry?.Token)) + { + return "FOUT: Bij OpenKlant2 moet voor het KlantinteractieRegister een Token geconfigureerd worden."; + } + break; - var defaultRegistersCount = systemen.Where(r => r.IsDefault).Count(); + case RegistryVersion.OpenKlant1: + if (string.IsNullOrWhiteSpace(systeem.ContactmomentRegistry?.BaseUrl)) + { + return "FOUT: Bij OpenKlant1/eSuite moet ContactmomentRegistry een BaseUrl hebben."; + } + if (string.IsNullOrWhiteSpace(systeem.ContactmomentRegistry?.ClientId) || + string.IsNullOrWhiteSpace(systeem.ContactmomentRegistry?.ClientSecret)) + { + return "FOUT: Bij OpenKlant1/eSuite moet ContactmomentRegistry een ClientId en ClientSecret hebben."; + } - if (defaultRegistersCount > 1) - { - return "FOUT: Meerdere default registers ingesteld."; - } + if (systeem.InterneTaakRegistry != null) + { + if (string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry.BaseUrl)) + { + return "FOUT: Bij OpenKlant1/eSuite moet InterneTaakRegistry een BaseUrl hebben."; + } + if (string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry.ObjectTypeUrl)) + { + return "FOUT: Bij OpenKlant1/eSuite moet InterneTaakRegistry een ObjectTypeUrl hebben."; + } + bool heeftToken = !string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry.Token); + bool heeftClientIdEnSecret = + !string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry.ClientId) && + !string.IsNullOrWhiteSpace(systeem.InterneTaakRegistry.ClientSecret); - if (defaultRegistersCount == 0) - { - return "FOUT: Geen default register ingesteld."; + if (!heeftToken && !heeftClientIdEnSecret) + { + return "FOUT: Bij OpenKlant1/eSuite moet InterneTaakRegistry óf een Token hebben, óf een ClientId en ClientSecret (voor eSuite)."; + } + } + + if (string.IsNullOrWhiteSpace(systeem.KlantRegistry?.BaseUrl)) + { + return "FOUT: Bij OpenKlant1/eSuite moet KlantRegistry een BaseUrl hebben."; + } + if (string.IsNullOrWhiteSpace(systeem.KlantRegistry?.ClientId) || + string.IsNullOrWhiteSpace(systeem.KlantRegistry?.ClientSecret)) + { + return "FOUT: Bij OpenKlant1/eSuite moet KlantRegistry een ClientId en ClientSecret hebben."; + } + break; + } } - return ""; + var defaultRegistersCount = systemen.Count(r => r.IsDefault); + + return defaultRegistersCount switch + { + > 1 => "FOUT: Meerdere default registers ingesteld.", + 0 => "FOUT: Geen default register ingesteld.", + _ => "" + }; } } } diff --git a/Kiss.Bff/Extern/ZaakGerichtWerken/Contactmomenten/PostContactmomentenCustomProxy.cs b/Kiss.Bff/Extern/ZaakGerichtWerken/Contactmomenten/PostContactmomentenCustomProxy.cs index 70ced365d..77d98ad9c 100644 --- a/Kiss.Bff/Extern/ZaakGerichtWerken/Contactmomenten/PostContactmomentenCustomProxy.cs +++ b/Kiss.Bff/Extern/ZaakGerichtWerken/Contactmomenten/PostContactmomentenCustomProxy.cs @@ -20,7 +20,7 @@ public PostContactmomentenCustomProxy(RegistryConfig configuration, GetMedewerke [HttpPost] public IActionResult Post([FromBody] JsonObject parsedModel, [FromHeader(Name = "systemIdentifier")] string systemIdentifier) { - var config = _configuration.Systemen.FirstOrDefault(x => x.Identifier == systemIdentifier)?.KlantinteractieRegistry; + var config = _configuration.Systemen.FirstOrDefault(x => x.Identifier == systemIdentifier)?.ContactmomentRegistry; if (config == null) return BadRequest(); diff --git a/Kiss.Bff/Extern/ZaakGerichtWerken/Klanten/KlantenProxyConfig.cs b/Kiss.Bff/Extern/ZaakGerichtWerken/Klanten/KlantenProxyConfig.cs index 79fe9b803..7ac3f4942 100644 --- a/Kiss.Bff/Extern/ZaakGerichtWerken/Klanten/KlantenProxyConfig.cs +++ b/Kiss.Bff/Extern/ZaakGerichtWerken/Klanten/KlantenProxyConfig.cs @@ -1,48 +1,43 @@ -using System.Net.Http.Headers; -using System.Runtime.CompilerServices; -using System.Security.Claims; -using IdentityModel; -using Microsoft.Extensions.Primitives; -using Yarp.ReverseProxy.Transforms; +using Kiss.Bff.Extern; +using Microsoft.AspNetCore.Mvc; namespace Kiss.Bff.ZaakGerichtWerken.Klanten { - public static class KlantenProxyExtensions + [ApiController] + [Route("/api/klanten/{**path}")] + public class KlantenProxy(RegistryConfig registryConfig) : ControllerBase { - public static IServiceCollection AddKlantenProxy(this IServiceCollection services, string destination, string clientId, string apiKey) - { - var tokenProvider = new ZgwTokenProvider(apiKey, clientId); - var config = new KlantenProxyConfig(destination, tokenProvider); - - - services.AddSingleton(config); - return services; - } - } - - public class KlantenProxyConfig : IKissProxyRoute - { - private readonly ZgwTokenProvider _tokenProvider; + private readonly RegistryConfig _registryConfig = registryConfig; - public KlantenProxyConfig(string destination, ZgwTokenProvider tokenProvider) + [HttpPost] + [HttpGet] + public IActionResult Handle([FromRoute] string path, [FromHeader(Name = "systemIdentifier")] string? systemIdentifier) { - Destination = destination; - _tokenProvider = tokenProvider; + var registry = string.IsNullOrWhiteSpace(systemIdentifier) + ? _registryConfig.Systemen.FirstOrDefault(x => x.IsDefault)?.KlantRegistry + : _registryConfig.Systemen.FirstOrDefault(x => x.Identifier == systemIdentifier)?.KlantRegistry; + + if (registry == null) + { + return BadRequest(); + } + + return new ProxyResult(() => + { + var message = new HttpRequestMessage(new HttpMethod(Request.Method), GetUri(registry, path)) + { + Content = new StreamContent(Request.Body) + }; + if (!string.IsNullOrWhiteSpace(Request.ContentType)) + { + message.Content.Headers.ContentType = new(Request.ContentType); + } + message.Content.Headers.ContentLength = Request.ContentLength; + registry.ApplyHeaders(message.Headers, User); + return message; + }); } - public string Route => "klanten"; - - public string Destination { get; } - - - public ValueTask ApplyRequestTransform(RequestTransformContext context) - { - var token = _tokenProvider.GenerateToken(context.HttpContext.User); - - context.ProxyRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); - - return new(); - } + private Uri GetUri(KlantRegistry config, string path) => new Uri($"{config.BaseUrl.AsSpan().TrimEnd('/')}/{path}?{Request.QueryString}"); } } - diff --git a/Kiss.Bff/Intern/Environment/EnvironmentController.cs b/Kiss.Bff/Intern/Environment/EnvironmentController.cs index a687b6742..43ab5d5f7 100644 --- a/Kiss.Bff/Intern/Environment/EnvironmentController.cs +++ b/Kiss.Bff/Intern/Environment/EnvironmentController.cs @@ -48,7 +48,7 @@ public IActionResult GetRegistrySystems() { Systemen = _registryConfig.Systemen // don't expose secrets - .Select((x) => new { x.IsDefault, x.Identifier, x.KlantinteractieVersion }) + .Select((x) => new { x.IsDefault, x.Identifier, x.RegistryVersion }) }; return Ok(model); diff --git a/Kiss.Bff/Program.cs b/Kiss.Bff/Program.cs index 01c992422..f1a22cdc0 100644 --- a/Kiss.Bff/Program.cs +++ b/Kiss.Bff/Program.cs @@ -80,8 +80,6 @@ builder.Services.AddDbContext(o => o.UseNpgsql(connStr)); builder.Services.AddEnterpriseSearch(builder.Configuration["ENTERPRISE_SEARCH_BASE_URL"], builder.Configuration["ENTERPRISE_SEARCH_PRIVATE_API_KEY"]); - builder.Services.AddKlantenProxy(builder.Configuration["KLANTEN_BASE_URL"], builder.Configuration["KLANTEN_CLIENT_ID"], builder.Configuration["KLANTEN_CLIENT_SECRET"]); - if(int.TryParse(builder.Configuration["EMAIL_PORT"], out var emailPort)) { builder.Services.AddSmtpClient( diff --git a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts index 35e72841e..5d907110b 100644 --- a/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts +++ b/src/features/bedrijf/bedrijf-zoeken/ensure-klant-for-bedrijf-identifier.ts @@ -7,7 +7,6 @@ import { ensureKlantForBedrijfIdentifier as ensureKlantForBedrijfIdentifierOk1 } import { mapBedrijfsIdentifier } from "@/services/openklant1/service"; import { useOrganisatieIds } from "@/stores/user"; import { getRegisterDetails as getSysteemDetails } from "@/features/shared/systeemdetails"; -import { fetchWithSysteemId } from "@/services/fetch-with-systeem-id"; export const ensureKlantForBedrijfIdentifier = async ( klantbedrijfidentifier: KlantBedrijfIdentifier, @@ -27,44 +26,9 @@ export const ensureKlantForBedrijfIdentifier = async ( const organisatieId = organisatieIds.value[0] || ""; return await ensureKlantForBedrijfIdentifierOk1( + systeemId, { bedrijfsnaam, identifier: mappedIdentifier }, organisatieId, ); } }; - -// import { -// findKlantByIdentifier, -// createKlant, -// type KlantBedrijfIdentifier, -// } from "@/services/openklant2"; -// import { ensureKlantForBedrijfIdentifier as ensureKlantForBedrijfIdentifierOk1 } from "@/services/openklant1/service"; -// import { useOpenKlant2 } from "@/services/openklant2/service"; -// import { mapBedrijfsIdentifier } from "@/services/openklant1/service"; -// import { useOrganisatieIds } from "@/stores/user"; - -// export const ensureKlantForBedrijfIdentifier = async ( -// identifier: KlantBedrijfIdentifier, -// bedrijfsnaam: string, -// ) => { -// const isOpenKlant2 = await useOpenKlant2(); - -// if (isOpenKlant2) { -// // Gebruik openklant2 implementatie -// const klant = await findKlantByIdentifier(identifier); -// return klant ?? (await createKlant(identifier)); -// } else { -// // Gebruik openklant1 implementatie -// const mappedIdentifier = mapBedrijfsIdentifier(identifier); -// const organisatieIds = useOrganisatieIds(); -// const organisatieId = organisatieIds.value[0] || ""; - -// return await ensureKlantForBedrijfIdentifierOk1( -// { -// bedrijfsnaam, -// identifier: mappedIdentifier, -// }, -// organisatieId, -// ); -// } -// }; diff --git a/src/features/bedrijf/bedrijf-zoeken/use-klant-by-bedrijf-identifier.ts b/src/features/bedrijf/bedrijf-zoeken/use-klant-by-bedrijf-identifier.ts index ba2f6f13d..6abde5a95 100644 --- a/src/features/bedrijf/bedrijf-zoeken/use-klant-by-bedrijf-identifier.ts +++ b/src/features/bedrijf/bedrijf-zoeken/use-klant-by-bedrijf-identifier.ts @@ -1,13 +1,13 @@ import { ServiceResult } from "@/services"; import { mapBedrijfsIdentifier, - useKlantByIdentifier, + useKlantByIdentifier as useKlantByIdentifierOk1, } from "@/services/openklant1/service"; import { findKlantByIdentifier, type KlantBedrijfIdentifier, - useOpenKlant2, } from "@/services/openklant2"; +import { getRegisterDetails as getSysteemDetails } from "@/features/shared/systeemdetails"; export const useKlantByBedrijfIdentifier = ( getId: () => KlantBedrijfIdentifier | undefined, @@ -24,13 +24,13 @@ export const useKlantByBedrijfIdentifier = ( throw new Error("Geen valide KlantBedrijfIdentifier"); } - const isOpenKlant2 = await useOpenKlant2(); + const { useKlantInteractiesApi, systeemId } = await getSysteemDetails(); - if (isOpenKlant2) { - return findKlantByIdentifier(id); + if (useKlantInteractiesApi) { + return findKlantByIdentifier(systeemId, id); } else { const mappedId = mapBedrijfsIdentifier(id); - return useKlantByIdentifier(() => mappedId); + return useKlantByIdentifierOk1(systeemId, () => mappedId); } }; diff --git a/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts b/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts index 84571fb1c..0b0ce4b0e 100644 --- a/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts +++ b/src/features/persoon/persoon-zoeken/ensure-klant-for-bsn.ts @@ -17,6 +17,6 @@ export const ensureKlantForBsn = async (parameters: { bsn: string }) => { } else { const organisatieIds = useOrganisatieIds(); const bronorganisatie = organisatieIds.value[0] || ""; - return await ensureKlantForBsn1(parameters, bronorganisatie); + return await ensureKlantForBsn1(systeemId, parameters, bronorganisatie); } }; diff --git a/src/features/shared/systeemdetails.ts b/src/features/shared/systeemdetails.ts index 75f514baf..4a7f1445b 100644 --- a/src/features/shared/systeemdetails.ts +++ b/src/features/shared/systeemdetails.ts @@ -1,6 +1,6 @@ import { fetchSystemen, - klantinteractieVersions, + registryVersions, } from "@/services/environment/fetch-systemen"; export const getRegisterDetails = async () => { @@ -14,6 +14,6 @@ export const getRegisterDetails = async () => { return { systeemId: defaultSysteem.identifier, useKlantInteractiesApi: - defaultSysteem.klantinteractieVersion === klantinteractieVersions.ok2, + defaultSysteem.registryVersion === registryVersions.ok2, }; }; diff --git a/src/services/environment/fetch-systemen.ts b/src/services/environment/fetch-systemen.ts index b1bf8b2e7..32dc5b6ef 100644 --- a/src/services/environment/fetch-systemen.ts +++ b/src/services/environment/fetch-systemen.ts @@ -2,7 +2,7 @@ import { throwIfNotOk, parseJson, fetchLoggedIn } from ".."; type ValueOf = T[keyof T]; -export const klantinteractieVersions = { +export const registryVersions = { ok1: "OpenKlant1", ok2: "OpenKlant2", } as const; @@ -16,6 +16,6 @@ export const fetchSystemen = () => systemen as { isDefault: boolean; identifier: string; - klantinteractieVersion: ValueOf; + registryVersion: ValueOf; }[], ); diff --git a/src/services/openklant1/service.ts b/src/services/openklant1/service.ts index 3e6d32dbd..d56fdd8a5 100644 --- a/src/services/openklant1/service.ts +++ b/src/services/openklant1/service.ts @@ -9,7 +9,11 @@ import { type ServiceData, } from "@/services"; import { mutate } from "swrv"; -import type { ContactmomentObject, SaveContactmomentResponseModel, UpdateContactgegevensParams } from "./types"; +import type { + ContactmomentObject, + SaveContactmomentResponseModel, + UpdateContactgegevensParams, +} from "./types"; import { KlantType } from "./types"; import type { Ref } from "vue"; import { nanoid } from "nanoid"; @@ -63,22 +67,25 @@ function getKlantSearchUrl( return url.toString(); } -export function useSearchKlanten({ - query, - page, - subjectType, -}: KlantSearchParameters) { - const getUrl = () => - getKlantSearchUrl( - query.value, - subjectType ?? KlantType.Persoon, - page.value, - ); - return ServiceResult.fromFetcher(getUrl, searchKlanten); -} - -function searchKlanten(url: string): Promise> { - return fetchLoggedIn(url) +// export function useSearchKlanten({ +// query, +// page, +// subjectType, +// }: KlantSearchParameters) { +// const getUrl = () => +// getKlantSearchUrl( +// query.value, +// subjectType ?? KlantType.Persoon, +// page.value, +// ); +// return ServiceResult.fromFetcher(getUrl, searchKlanten); +// } + +function searchKlanten( + systeemId: string, + url: string, +): Promise> { + return fetchWithSysteemId(systeemId, url) .then(throwIfNotOk) .then(parseJson) .then((j) => parsePagination(j, mapKlant)) @@ -129,8 +136,8 @@ function getKlantBsnUrl(bsn?: string) { return url.toString(); } -const searchSingleKlant = (url: string) => - searchKlanten(url).then(enforceOneOrZero); +const searchSingleKlant = (systeemId: string, url: string) => + searchKlanten(systeemId, url).then(enforceOneOrZero); const getSingleBsnSearchId = (bsn: string | undefined) => { const url = getKlantBsnUrl(bsn); @@ -197,17 +204,18 @@ export function useUpdateContactGegevens() { return ServiceResult.fromSubmitter(updateContactgegevens); } -export function useKlantByBsn( - getBsn: () => string | undefined, -): ServiceData { - const getUrl = () => getKlantBsnUrl(getBsn()); +// export function useKlantByBsn( +// getBsn: () => string | undefined, +// ): ServiceData { +// const getUrl = () => getKlantBsnUrl(getBsn()); - return ServiceResult.fromFetcher(getUrl, searchSingleKlant, { - getUniqueId: () => getSingleBsnSearchId(getBsn()), - }); -} +// return ServiceResult.fromFetcher(getUrl, searchSingleKlant, { +// getUniqueId: () => getSingleBsnSearchId(getBsn()), +// }); +// } export async function ensureKlantForBsn( + systeemId: string, { bsn, }: { @@ -220,7 +228,7 @@ export async function ensureKlantForBsn( if (!bsnUrl || !singleBsnId) throw new Error(); - const first = await searchSingleKlant(bsnUrl); + const first = await searchSingleKlant(systeemId, bsnUrl); if (first) { mutate(singleBsnId, first); @@ -288,11 +296,12 @@ const getUrlVoorGetKlantById = ( }; export const useKlantByIdentifier = async ( + systeemId: string, getId: () => BedrijfIdentifierOpenKlant1 | undefined, ) => { const getUrl = () => getUrlVoorGetKlantById(getId()); - return await searchSingleKlant(getUrl()); + return await searchSingleKlant(systeemId, getUrl()); }; export function mapBedrijfsIdentifier( @@ -320,6 +329,7 @@ export function mapBedrijfsIdentifier( //maak een klant aan in het klanten register als die nog niet bestaat //bijvoorbeeld om een contactmoment voor een in de kvk opgezocht bedrijf op te kunnen slaan export async function ensureKlantForBedrijfIdentifier( + systeemId: string, { bedrijfsnaam, identifier, @@ -334,7 +344,7 @@ export async function ensureKlantForBedrijfIdentifier( if (!url || !uniqueId) throw new Error(); - const first = await searchSingleKlant(url); + const first = await searchSingleKlant(systeemId, url); if (first) { mutate(uniqueId, first); @@ -437,11 +447,11 @@ export const koppelObject = (data: ContactmomentObject) => const nullForStatusCodes = (...statusCodes: number[]) => - (r: Response) => { - if (statusCodes.includes(r.status)) return null; - throwIfNotOk(r); - return r; - }; + (r: Response) => { + if (statusCodes.includes(r.status)) return null; + throwIfNotOk(r); + return r; + }; export async function enrichContactverzoekObjectWithContactmoment( contactverzoekObject: any, @@ -499,8 +509,6 @@ function fetchObjectsByContactmomentUrl(url: string) { .then((x) => parsePagination(x, (o) => o as unknown)); } - - export const saveContactmoment = async ( systemIdentifier: string, data: Contactmoment, @@ -524,4 +532,4 @@ const postContactmoment = ( }, body: JSON.stringify(data), }); -}; \ No newline at end of file +}; diff --git a/src/services/openklant2/service.ts b/src/services/openklant2/service.ts index dd7d6a7db..fd38924f2 100644 --- a/src/services/openklant2/service.ts +++ b/src/services/openklant2/service.ts @@ -30,10 +30,7 @@ import { import type { ContactverzoekData } from "../../features/contact/components/types"; import type { Klant } from "../openklant/types"; import type { Vraag } from "@/stores/contactmoment"; -import { - fetchSystemen, - klantinteractieVersions, -} from "../environment/fetch-systemen"; +import { fetchSystemen, registryVersions } from "../environment/fetch-systemen"; import { fetchWithSysteemId } from "../fetch-with-systeem-id"; const klantinteractiesProxyRoot = "/api/klantinteracties"; @@ -862,8 +859,8 @@ async function mapPartijToKlant( export const useOpenKlant2 = () => fetchSystemen().then( (systemen) => - systemen.find((x) => x.isDefault)?.klantinteractieVersion === - klantinteractieVersions.ok2, + systemen.find((x) => x.isDefault)?.registryVersion === + registryVersions.ok2, ); export const postOnderwerpobject = async (data: OnderwerpObjectPostModel) => { From 0f3bf728b2fcb33d2fdea15c32726ab050ad238b Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Wed, 5 Feb 2025 13:19:26 +0100 Subject: [PATCH 06/13] aanpassen comments --- Kiss.Bff/Extern/RegistryConfigExtensions.cs | 11 ++--------- src/features/klant/klant-details/use-klant-by-id.ts | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Kiss.Bff/Extern/RegistryConfigExtensions.cs b/Kiss.Bff/Extern/RegistryConfigExtensions.cs index 3edd8a36b..e9816cf2b 100644 --- a/Kiss.Bff/Extern/RegistryConfigExtensions.cs +++ b/Kiss.Bff/Extern/RegistryConfigExtensions.cs @@ -23,15 +23,8 @@ public static IServiceCollection AddRegistryConfig(this IServiceCollection servi /// /// Haalt de registry-configuratie op uit de applicatie-instellingen. - /// Verwacht een lijst onder de sectie REGISTERS met sleutels zoals: - /// - KLANTINTERACTIE_BASE_URL (verplicht) - /// - KLANTINTERACTIE_API_VERSION - /// - KLANTINTERACTIE_TOKEN - /// - CONTACTMOMENTEN_BASE_URL, CONTACTMOMENTEN_API_CLIENT_ID, CONTACTMOMENTEN_API_KEY - /// - INTERNE_TAAK_BASE_URL, INTERNE_TAAK_CLIENT_ID, INTERNE_TAAK_CLIENT_SECRET, INTERNE_TAAK_TOKEN - /// - KLANTEN_BASE_URL, KLANTEN_CLIENT_ID, KLANTEN_CLIENT_SECRET - /// - /// Gooit een fout als de verplichte KLANTINTERACTIE_BASE_URL ontbreekt. + /// Verwacht een lijst onder REGISTERS met relevante API-sleutels en base URL's. + /// Gooit een fout als verplichte velden ontbreken. /// private static IEnumerable GetRegistryConfiguration(IConfiguration configuration) { diff --git a/src/features/klant/klant-details/use-klant-by-id.ts b/src/features/klant/klant-details/use-klant-by-id.ts index 3ade14a19..9d86c3a91 100644 --- a/src/features/klant/klant-details/use-klant-by-id.ts +++ b/src/features/klant/klant-details/use-klant-by-id.ts @@ -2,7 +2,7 @@ import { ServiceResult } from "@/services"; import type { Ref } from "vue"; import { fetchKlantByIdOk2 } from "@/services/openklant2"; import { fetchKlantByIdOk1 } from "@/services/openklant1"; -import { getRegisterDetails } from "@/features/shared/systeemdetails"; // Nieuwe methode om interacties API te bepalen +import { getRegisterDetails } from "@/features/shared/systeemdetails"; export const useKlantById = (id: Ref) => { const getApiSpecifiekUrl = () => id.value || ""; From 16703f7b05ee62359ede8c5b2aaa4e597fd42133 Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Wed, 5 Feb 2025 13:45:46 +0100 Subject: [PATCH 07/13] errors fix --- .../klant/klant-details/use-klant-by-id.ts | 2 +- src/services/openklant1/service.ts | 19 +++++++++++-------- src/views/BedrijfDetailView.vue | 8 +++++--- src/views/PersoonDetailView.vue | 15 +++++++++------ 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/features/klant/klant-details/use-klant-by-id.ts b/src/features/klant/klant-details/use-klant-by-id.ts index 9d86c3a91..11e4fa826 100644 --- a/src/features/klant/klant-details/use-klant-by-id.ts +++ b/src/features/klant/klant-details/use-klant-by-id.ts @@ -14,7 +14,7 @@ export const useKlantById = (id: Ref) => { return useKlantInteractiesApi ? fetchKlantByIdOk2(systeemId, url) - : fetchKlantByIdOk1(url); + : fetchKlantByIdOk1(systeemId, url); }; return ServiceResult.fromFetcher(getApiSpecifiekUrl, fetchKlant); diff --git a/src/services/openklant1/service.ts b/src/services/openklant1/service.ts index d56fdd8a5..8f6373fa1 100644 --- a/src/services/openklant1/service.ts +++ b/src/services/openklant1/service.ts @@ -145,16 +145,19 @@ const getSingleBsnSearchId = (bsn: string | undefined) => { return url + "_single"; }; -export function useKlantById(id: Ref) { - return ServiceResult.fromFetcher( - () => getKlantIdUrl(id.value), - fetchKlantByIdOk1, - ); -} +// export function useKlantById(id: Ref) { +// return ServiceResult.fromFetcher( +// () => getKlantIdUrl(id.value), +// fetchKlantByIdOk1, +// ); +// } -export function fetchKlantByIdOk1(id: string) { +export function fetchKlantByIdOk1(systeemId: string, id: string) { const url = getKlantIdUrl(id); - return fetchLoggedIn(url).then(throwIfNotOk).then(parseJson).then(mapKlant); + return fetchWithSysteemId(systeemId, url) + .then(throwIfNotOk) + .then(parseJson) + .then(mapKlant); } const getValidIdentificatie = ({ subjectType, subjectIdentificatie }: any) => { diff --git a/src/views/BedrijfDetailView.vue b/src/views/BedrijfDetailView.vue index 6ec441548..8bdcb7e70 100644 --- a/src/views/BedrijfDetailView.vue +++ b/src/views/BedrijfDetailView.vue @@ -9,7 +9,7 @@ :disabled="(k) => !k" > (null); const klantId = computed(() => props.bedrijfId); const contactmomentStore = useContactmomentStore(); -const klant = useKlantById(klantId, gebruikKlantInteracatiesApi); +const klant = useKlantById(klantId); -const klantUrl = computed(() => (klant.success ? klant.data.url ?? "" : "")); +const klantUrl = computed(() => + klant.success && klant.data ? klant.data.url ?? "" : "", +); const currentTab = ref(""); //const contactverzoekenPage = ref(1); diff --git a/src/views/PersoonDetailView.vue b/src/views/PersoonDetailView.vue index 29bdb1dfa..7104e5be4 100644 --- a/src/views/PersoonDetailView.vue +++ b/src/views/PersoonDetailView.vue @@ -6,7 +6,7 @@ @@ -81,9 +81,9 @@ import { usePersoonByBsn, BrpGegevens, } from "@/features/persoon/persoon-details"; -import { useOpenKlant2 } from "@/services/openklant2"; import ContactverzoekenForKlantUrl from "@/features/contact/contactverzoek/overzicht/ContactverzoekenForKlantUrl.vue"; import ContactmomentenForKlantUrl from "@/features/contact/contactmoment/ContactmomentenForKlantUrl.vue"; +import { getRegisterDetails } from "@/features/shared/systeemdetails"; const props = defineProps<{ persoonId: string }>(); @@ -91,16 +91,19 @@ const gebruikKlantInteracatiesApi = ref(null); const activeTab = ref(""); const klantId = computed(() => props.persoonId); const contactmomentStore = useContactmomentStore(); -const klant = useKlantById(klantId, gebruikKlantInteracatiesApi); -const klantUrl = computed(() => (klant.success ? klant.data.url ?? "" : "")); +const klant = useKlantById(klantId); +const klantUrl = computed(() => + klant?.success && klant.data ? klant.data.url ?? "" : "", +); onMounted(async () => { - gebruikKlantInteracatiesApi.value = await useOpenKlant2(); + const { useKlantInteractiesApi } = await getRegisterDetails(); + gebruikKlantInteracatiesApi.value = useKlantInteractiesApi; }); const getBsn = () => !klant.success || - !klant.data.bsn || + !klant?.data?.bsn || gebruikKlantInteracatiesApi.value === null ? "" : klant.data.bsn; From c2457b4e8d6a31a5e09e72868a50b811346feb18 Mon Sep 17 00:00:00 2001 From: githubjimmeicatt Date: Wed, 5 Feb 2025 13:55:24 +0100 Subject: [PATCH 08/13] no message --- .../ContactmomentAfhandeling.vue | 382 ++++++++++++------ 1 file changed, 259 insertions(+), 123 deletions(-) diff --git a/src/features/contact/contactmoment/ContactmomentAfhandeling.vue b/src/features/contact/contactmoment/ContactmomentAfhandeling.vue index e156b8b9b..b8b5a65c9 100644 --- a/src/features/contact/contactmoment/ContactmomentAfhandeling.vue +++ b/src/features/contact/contactmoment/ContactmomentAfhandeling.vue @@ -1,61 +1,91 @@