diff --git a/lib/services/medipost/medipostPrivateMessage.service.ts b/lib/services/medipost/medipostPrivateMessage.service.ts index a8852c0..775d5bc 100644 --- a/lib/services/medipost/medipostPrivateMessage.service.ts +++ b/lib/services/medipost/medipostPrivateMessage.service.ts @@ -16,6 +16,7 @@ import type { import { toArray } from '@kit/shared/utils'; import type { AnalysisOrder } from '~/lib/types/analysis-order'; import type { AnalysisResponseElement } from '~/lib/types/analysis-response-element'; +import { createUserAnalysesApi } from '@/packages/features/user-analyses/src/server/api'; import { Tables } from '@kit/supabase/database'; import { getSupabaseServerAdminClient } from '@/packages/supabase/src/clients/server-admin-client'; @@ -138,28 +139,25 @@ export async function getAnalysisResponseElementsForGroup({ continue; } - const responseValueIsNumeric = responseValue !== null; - const responseValueIsNegative = vastuseVaartus === 'Negatiivne'; - const responseValueIsWithinNorm = vastuseVaartus === 'Normi piires'; + const mappedResponse = createUserAnalysesApi(getSupabaseServerAdminClient()) + .mapUuringVastus({ uuringVastus: response }); results.push({ analysis_element_original_id: analysisElementOriginalId, - norm_lower: response.NormAlum?.['#text'] ?? null, - norm_lower_included: - response.NormAlum?.['@_kaasaarvatud'].toLowerCase() === 'jah', - norm_status: response.NormiStaatus, - norm_upper: response.NormYlem?.['#text'] ?? null, - norm_upper_included: - response.NormYlem?.['@_kaasaarvatud'].toLowerCase() === 'jah', - response_time: response.VastuseAeg ?? null, - response_value: responseValue, + norm_lower: mappedResponse.normLower, + norm_lower_included: mappedResponse.normLowerIncluded, + norm_status: mappedResponse.normStatus, + norm_upper: mappedResponse.normUpper, + norm_upper_included: mappedResponse.normUpperIncluded, + response_time: mappedResponse.responseTime, + response_value: mappedResponse.responseValue, unit: groupUuringElement.Mootyhik ?? null, original_response_element: groupUuringElement, analysis_name: groupUuringElement.UuringNimi || groupUuringElement.KNimetus, comment: groupUuringElement.UuringuKommentaar ?? null, status: status.toString(), - response_value_is_within_norm: responseValueIsNumeric ? null : responseValueIsWithinNorm, - response_value_is_negative: responseValueIsNumeric ? null : responseValueIsNegative, + response_value_is_within_norm: mappedResponse.responseValueIsWithinNorm, + response_value_is_negative: mappedResponse.responseValueIsNegative, }); } } diff --git a/packages/features/user-analyses/src/server/api.ts b/packages/features/user-analyses/src/server/api.ts index e7d9ed2..e6a7924 100644 --- a/packages/features/user-analyses/src/server/api.ts +++ b/packages/features/user-analyses/src/server/api.ts @@ -1,6 +1,7 @@ import { SupabaseClient } from '@supabase/supabase-js'; import { Database } from '@kit/supabase/database'; +import { toArray } from '@kit/shared/utils'; import type { UuringElement, UuringuVastus } from '@kit/shared/types/medipost-analysis'; import type { AnalysisResultDetails, AnalysisResultDetailsMapped, UserAnalysis } from '../types/analysis-results'; @@ -143,6 +144,7 @@ class UserAnalysesApi { analysisResponseElements, }); }).sort((a, b) => a.analysisName.localeCompare(b.analysisName)); + const nestedAnalysisElementIds = mappedOrderedAnalysisElements .map(({ results }) => results?.nestedElements.map(({ analysisElementOriginalId }) => analysisElementOriginalId)) .flat().filter(Boolean); @@ -151,7 +153,7 @@ class UserAnalysesApi { .schema('medreport') .from('analysis_elements') .select('*') - .in('id', nestedAnalysisElementIds); + .in('analysis_id_original', nestedAnalysisElementIds); if (!nestedAnalysisElementsError && nestedAnalysisElements) { for (const mappedOrderedAnalysisElement of mappedOrderedAnalysisElements) { const { results } = mappedOrderedAnalysisElement; @@ -160,7 +162,7 @@ class UserAnalysesApi { } for (const nestedElement of results.nestedElements) { const { analysisElementOriginalId } = nestedElement; - const nestedAnalysisElement = nestedAnalysisElements.find(({ id }) => id === analysisElementOriginalId); + const nestedAnalysisElement = nestedAnalysisElements.find(({ analysis_id_original }) => analysis_id_original === analysisElementOriginalId); if (!nestedAnalysisElement) { continue; } @@ -220,25 +222,24 @@ class UserAnalysesApi { if (!nestedElements) { return []; } - return nestedElements.map((element) => { - const elementVastus = element.UuringuVastus as UuringuVastus | undefined; - const responseValue = elementVastus?.VastuseVaartus; - const responseValueIsNumeric = !isNaN(Number(responseValue)); - const responseValueIsNegative = responseValue === 'Negatiivne'; - const responseValueIsWithinNorm = responseValue === 'Normi piires'; + return toArray(nestedElements).map((element) => { + const mappedResponse = this.mapUuringVastus({ + uuringVastus: element.UuringuVastus as UuringuVastus | undefined, + }); return { status: element.UuringOlek, - unit: element.Mootyhik, - normLower: elementVastus?.NormAlum?.['#text'], - normUpper: elementVastus?.NormYlem?.['#text'], - normStatus: elementVastus?.NormiStaatus, - responseTime: elementVastus?.VastuseAeg, - response_value: responseValueIsNegative || !responseValueIsNumeric ? null : (responseValue ?? null), - response_value_is_negative: responseValueIsNumeric ? null : responseValueIsNegative, - response_value_is_within_norm: responseValueIsNumeric ? null : responseValueIsWithinNorm, - normLowerIncluded: elementVastus?.NormAlum?.['@_kaasaarvatud'] === 'JAH', - normUpperIncluded: elementVastus?.NormYlem?.['@_kaasaarvatud'] === 'JAH', + unit: element.Mootyhik ?? null, + normLower: mappedResponse.normLower, + normUpper: mappedResponse.normUpper, + normStatus: mappedResponse.normStatus, + responseTime: mappedResponse.responseTime, + responseValue: mappedResponse.responseValue, + responseValueIsNegative: mappedResponse.responseValueIsNegative, + responseValueIsWithinNorm: mappedResponse.responseValueIsWithinNorm, + normLowerIncluded: mappedResponse.normLowerIncluded, + normUpperIncluded: mappedResponse.normUpperIncluded, analysisElementOriginalId: element.UuringId, + analysisName: undefined, }; }); })(), @@ -260,6 +261,34 @@ class UserAnalysesApi { }; } + mapUuringVastus({ uuringVastus }: { uuringVastus?: UuringuVastus }) { + const vastuseVaartus = uuringVastus?.VastuseVaartus; + const responseValue = (() => { + const valueAsNumber = Number(vastuseVaartus); + if (isNaN(valueAsNumber)) { + return null; + } + return valueAsNumber; + })(); + const responseValueNumber = Number(responseValue); + const responseValueIsNumeric = !isNaN(responseValueNumber); + const responseValueIsNegative = vastuseVaartus === 'Negatiivne'; + const responseValueIsWithinNorm = vastuseVaartus === 'Normi piires'; + return { + normLower: uuringVastus?.NormAlum?.['#text'] ?? null, + normUpper: uuringVastus?.NormYlem?.['#text'] ?? null, + normStatus: uuringVastus?.NormiStaatus ?? null, + responseTime: uuringVastus?.VastuseAeg ?? null, + responseValue: responseValueIsNegative || !responseValueIsNumeric ? null : (responseValueNumber ?? null), + responseValueIsNegative: responseValueIsNumeric ? null : responseValueIsNegative, + responseValueIsWithinNorm: responseValueIsNumeric ? null : responseValueIsWithinNorm, + normLowerIncluded: + uuringVastus?.NormAlum?.['@_kaasaarvatud'].toLowerCase() === 'jah', + normUpperIncluded: + uuringVastus?.NormYlem?.['@_kaasaarvatud'].toLowerCase() === 'jah', + }; + } + // @TODO unused currently async getUserAnalyses(): Promise { const authUser = await this.client.auth.getUser(); diff --git a/packages/features/user-analyses/src/types/analysis-results.ts b/packages/features/user-analyses/src/types/analysis-results.ts index 3176499..ad854bf 100644 --- a/packages/features/user-analyses/src/types/analysis-results.ts +++ b/packages/features/user-analyses/src/types/analysis-results.ts @@ -88,13 +88,14 @@ export type AnalysisResultDetailsElementResults = { analysisElementOriginalId: string; normLower?: number | null; normLowerIncluded: boolean; - normStatus: number; + normStatus: number | null; normUpper?: number | null; normUpperIncluded: boolean; - responseTime: string; - responseValue: number; + responseTime: string | null; + responseValue: number | null; status: number; - unit: string; + unit: string | null; + analysisName?: string | null; }[]; labComment?: string | null; }; @@ -103,7 +104,7 @@ export type AnalysisResultDetailsElement = { analysisIdOriginal: string; isWaitingForResults: boolean; analysisName: string; - results: AnalysisResultDetailsElementResults; + results?: AnalysisResultDetailsElementResults; }; export type AnalysisResultDetailsMapped = { diff --git a/packages/supabase/src/database.types.ts b/packages/supabase/src/database.types.ts index 6907fac..f893f49 100644 --- a/packages/supabase/src/database.types.ts +++ b/packages/supabase/src/database.types.ts @@ -685,7 +685,7 @@ export type Database = { norm_upper: number | null norm_upper_included: boolean | null original_response_element: Json - response_time: string + response_time: string | null response_value: number | null response_value_is_negative?: boolean | null response_value_is_within_norm?: boolean | null @@ -706,7 +706,7 @@ export type Database = { norm_upper?: number | null norm_upper_included?: boolean | null original_response_element: Json - response_time: string + response_time: string | null response_value: number | null response_value_is_negative?: boolean | null response_value_is_within_norm?: boolean | null @@ -727,7 +727,7 @@ export type Database = { norm_upper?: number | null norm_upper_included?: boolean | null original_response_element?: Json - response_time?: string + response_time?: string | null response_value?: number | null response_value_is_negative?: boolean | null response_value_is_within_norm?: boolean | null