feat(MED-168): move analysis result element mapping to shared

This commit is contained in:
2025-09-19 12:48:57 +03:00
parent 81f7a03388
commit e7b484e1d4
4 changed files with 68 additions and 40 deletions

View File

@@ -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<UserAnalysis | null> {
const authUser = await this.client.auth.getUser();

View File

@@ -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 = {

View File

@@ -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