prettier fix
This commit is contained in:
@@ -1,11 +1,19 @@
|
||||
import { SupabaseClient } from '@supabase/supabase-js';
|
||||
|
||||
import { Database } from '@kit/supabase/database';
|
||||
import { toArray } from '@kit/shared/utils';
|
||||
import type { UuringuVastus } from '@kit/shared/types/medipost-analysis';
|
||||
import { toArray } from '@kit/shared/utils';
|
||||
import { Database } from '@kit/supabase/database';
|
||||
|
||||
import type { AnalysisResultsQuery, AnalysisResultDetailsElement, AnalysisResultDetailsMapped, AnalysisResultLevel, AnalysisResultsDetailsElementNested, AnalysisStatus, UserAnalysis } from '../types/analysis-results';
|
||||
import type { AnalysisOrder } from '../types/analysis-orders';
|
||||
import type {
|
||||
AnalysisResultDetailsElement,
|
||||
AnalysisResultDetailsMapped,
|
||||
AnalysisResultLevel,
|
||||
AnalysisResultsDetailsElementNested,
|
||||
AnalysisResultsQuery,
|
||||
AnalysisStatus,
|
||||
UserAnalysis,
|
||||
} from '../types/analysis-results';
|
||||
|
||||
/**
|
||||
* Class representing an API for interacting with user accounts.
|
||||
@@ -13,7 +21,7 @@ import type { AnalysisOrder } from '../types/analysis-orders';
|
||||
* @param {SupabaseClient<Database>} client - The Supabase client instance.
|
||||
*/
|
||||
class UserAnalysesApi {
|
||||
constructor(private readonly client: SupabaseClient<Database>) { }
|
||||
constructor(private readonly client: SupabaseClient<Database>) {}
|
||||
|
||||
async getAnalysisOrder({
|
||||
medusaOrderId,
|
||||
@@ -25,7 +33,7 @@ class UserAnalysesApi {
|
||||
const query = this.client
|
||||
.schema('medreport')
|
||||
.from('analysis_orders')
|
||||
.select('*')
|
||||
.select('*');
|
||||
if (medusaOrderId) {
|
||||
query.eq('medusa_order_id', medusaOrderId);
|
||||
} else if (analysisOrderId) {
|
||||
@@ -36,7 +44,9 @@ class UserAnalysesApi {
|
||||
|
||||
const { data: order, error } = await query.single();
|
||||
if (error) {
|
||||
throw new Error(`Failed to get order by medusaOrderId=${medusaOrderId} or analysisOrderId=${analysisOrderId}, message=${error.message}, data=${JSON.stringify(order)}`);
|
||||
throw new Error(
|
||||
`Failed to get order by medusaOrderId=${medusaOrderId} or analysisOrderId=${analysisOrderId}, message=${error.message}, data=${JSON.stringify(order)}`,
|
||||
);
|
||||
}
|
||||
return order as AnalysisOrder;
|
||||
}
|
||||
@@ -47,28 +57,43 @@ class UserAnalysesApi {
|
||||
const analysisOrder = await this.getAnalysisOrder({ analysisOrderId });
|
||||
const orderedAnalysisElementIds = analysisOrder.analysis_element_ids ?? [];
|
||||
if (orderedAnalysisElementIds.length === 0) {
|
||||
console.error('No ordered analysis element ids found for analysis order id=', analysisOrderId);
|
||||
console.error(
|
||||
'No ordered analysis element ids found for analysis order id=',
|
||||
analysisOrderId,
|
||||
);
|
||||
return null;
|
||||
}
|
||||
const orderedAnalysisElements = await this.getOrderedAnalysisElements({ analysisOrderId, orderedAnalysisElementIds });
|
||||
const orderedAnalysisElements = await this.getOrderedAnalysisElements({
|
||||
analysisOrderId,
|
||||
orderedAnalysisElementIds,
|
||||
});
|
||||
|
||||
const orderedAnalysisElementOriginalIds = orderedAnalysisElements.map(({ analysis_id_original }) => analysis_id_original);
|
||||
const orderedAnalysisElementOriginalIds = orderedAnalysisElements.map(
|
||||
({ analysis_id_original }) => analysis_id_original,
|
||||
);
|
||||
if (orderedAnalysisElementOriginalIds.length === 0) {
|
||||
console.error('No ordered analysis element original ids found for analysis order id=', analysisOrderId);
|
||||
console.error(
|
||||
'No ordered analysis element original ids found for analysis order id=',
|
||||
analysisOrderId,
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
const responseWithElements = await this.getAnalysisResponseWithElements({ analysisOrderId });
|
||||
const responseWithElements = await this.getAnalysisResponseWithElements({
|
||||
analysisOrderId,
|
||||
});
|
||||
if (!responseWithElements) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const mappedOrderedAnalysisElements = await this.getMappedOrderedAnalysisElements({
|
||||
analysisResponseElements: responseWithElements.elements,
|
||||
orderedAnalysisElements,
|
||||
});
|
||||
const mappedOrderedAnalysisElements =
|
||||
await this.getMappedOrderedAnalysisElements({
|
||||
analysisResponseElements: responseWithElements.elements,
|
||||
orderedAnalysisElements,
|
||||
});
|
||||
|
||||
const feedback = responseWithElements.summary?.doctor_analysis_feedback?.[0];
|
||||
const feedback =
|
||||
responseWithElements.summary?.doctor_analysis_feedback?.[0];
|
||||
return {
|
||||
id: analysisOrderId,
|
||||
order: {
|
||||
@@ -79,7 +104,8 @@ class UserAnalysesApi {
|
||||
orderedAnalysisElements: mappedOrderedAnalysisElements,
|
||||
summary:
|
||||
feedback?.status === 'COMPLETED'
|
||||
? (responseWithElements.summary?.doctor_analysis_feedback?.[0] ?? null)
|
||||
? (responseWithElements.summary?.doctor_analysis_feedback?.[0] ??
|
||||
null)
|
||||
: null,
|
||||
};
|
||||
}
|
||||
@@ -117,13 +143,19 @@ class UserAnalysesApi {
|
||||
analysisOrderId: number;
|
||||
orderedAnalysisElementIds: number[];
|
||||
}) {
|
||||
const { data: orderedAnalysisElements, error: orderedAnalysisElementsError } = await this.client
|
||||
const {
|
||||
data: orderedAnalysisElements,
|
||||
error: orderedAnalysisElementsError,
|
||||
} = await this.client
|
||||
.schema('medreport')
|
||||
.from('analysis_elements')
|
||||
.select('analysis_id_original,analysis_name_lab')
|
||||
.in('id', orderedAnalysisElementIds);
|
||||
if (orderedAnalysisElementsError) {
|
||||
console.error(`Failed to get ordered analysis elements for analysis order id=${analysisOrderId}`, orderedAnalysisElementsError);
|
||||
console.error(
|
||||
`Failed to get ordered analysis elements for analysis order id=${analysisOrderId}`,
|
||||
orderedAnalysisElementsError,
|
||||
);
|
||||
throw orderedAnalysisElementsError;
|
||||
}
|
||||
return orderedAnalysisElements;
|
||||
@@ -134,21 +166,34 @@ class UserAnalysesApi {
|
||||
orderedAnalysisElements,
|
||||
}: {
|
||||
analysisResponseElements: AnalysisResultsQuery['elements'];
|
||||
orderedAnalysisElements: { analysis_id_original: string; analysis_name_lab: string }[];
|
||||
orderedAnalysisElements: {
|
||||
analysis_id_original: string;
|
||||
analysis_name_lab: string;
|
||||
}[];
|
||||
}): Promise<AnalysisResultDetailsElement[]> {
|
||||
const mappedOrderedAnalysisElements = orderedAnalysisElements.map(({ analysis_id_original, analysis_name_lab }) => {
|
||||
return this.getOrderedAnalysisElement({
|
||||
analysisIdOriginal: analysis_id_original,
|
||||
analysisNameLab: analysis_name_lab,
|
||||
analysisResponseElements,
|
||||
});
|
||||
}).sort((a, b) => a.analysisName.localeCompare(b.analysisName));
|
||||
|
||||
const mappedOrderedAnalysisElements = orderedAnalysisElements
|
||||
.map(({ analysis_id_original, analysis_name_lab }) => {
|
||||
return this.getOrderedAnalysisElement({
|
||||
analysisIdOriginal: analysis_id_original,
|
||||
analysisNameLab: analysis_name_lab,
|
||||
analysisResponseElements,
|
||||
});
|
||||
})
|
||||
.sort((a, b) => a.analysisName.localeCompare(b.analysisName));
|
||||
|
||||
const nestedAnalysisElementIds = mappedOrderedAnalysisElements
|
||||
.map(({ results }) => results?.nestedElements.map(({ analysisElementOriginalId }) => analysisElementOriginalId))
|
||||
.flat().filter(Boolean);
|
||||
.map(({ results }) =>
|
||||
results?.nestedElements.map(
|
||||
({ analysisElementOriginalId }) => analysisElementOriginalId,
|
||||
),
|
||||
)
|
||||
.flat()
|
||||
.filter(Boolean);
|
||||
if (nestedAnalysisElementIds.length > 0) {
|
||||
const { data: nestedAnalysisElements, error: nestedAnalysisElementsError } = await this.client
|
||||
const {
|
||||
data: nestedAnalysisElements,
|
||||
error: nestedAnalysisElementsError,
|
||||
} = await this.client
|
||||
.schema('medreport')
|
||||
.from('analysis_elements')
|
||||
.select('*')
|
||||
@@ -161,18 +206,28 @@ class UserAnalysesApi {
|
||||
}
|
||||
for (const nestedElement of results.nestedElements) {
|
||||
const { analysisElementOriginalId } = nestedElement;
|
||||
const nestedAnalysisElement = nestedAnalysisElements.find(({ analysis_id_original }) => analysis_id_original === analysisElementOriginalId);
|
||||
const nestedAnalysisElement = nestedAnalysisElements.find(
|
||||
({ analysis_id_original }) =>
|
||||
analysis_id_original === analysisElementOriginalId,
|
||||
);
|
||||
if (!nestedAnalysisElement) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nestedElement.analysisElementOriginalId = analysisElementOriginalId;
|
||||
nestedElement.analysisName = nestedAnalysisElement.analysis_name_lab as string | undefined;
|
||||
nestedElement.analysisName =
|
||||
nestedAnalysisElement.analysis_name_lab as string | undefined;
|
||||
}
|
||||
results.nestedElements = results.nestedElements.sort((a, b) => a.analysisName?.localeCompare(b.analysisName ?? '') ?? 0);
|
||||
results.nestedElements = results.nestedElements.sort(
|
||||
(a, b) => a.analysisName?.localeCompare(b.analysisName ?? '') ?? 0,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
console.error('Failed to get nested analysis elements by ids=', nestedAnalysisElementIds, nestedAnalysisElementsError);
|
||||
console.error(
|
||||
'Failed to get nested analysis elements by ids=',
|
||||
nestedAnalysisElementIds,
|
||||
nestedAnalysisElementsError,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,7 +243,9 @@ class UserAnalysesApi {
|
||||
analysisNameLab: string;
|
||||
analysisResponseElements: AnalysisResultsQuery['elements'];
|
||||
}): AnalysisResultDetailsElement {
|
||||
const elementResponse = analysisResponseElements.find((element) => element.analysis_element_original_id === analysisIdOriginal);
|
||||
const elementResponse = analysisResponseElements.find(
|
||||
(element) => element.analysis_element_original_id === analysisIdOriginal,
|
||||
);
|
||||
if (!elementResponse) {
|
||||
return {
|
||||
analysisIdOriginal,
|
||||
@@ -196,34 +253,42 @@ class UserAnalysesApi {
|
||||
analysisName: analysisNameLab,
|
||||
};
|
||||
}
|
||||
const labComment = elementResponse.original_response_element?.UuringuKommentaar;
|
||||
const labComment =
|
||||
elementResponse.original_response_element?.UuringuKommentaar;
|
||||
return {
|
||||
analysisIdOriginal,
|
||||
isWaitingForResults: false,
|
||||
analysisName: analysisNameLab,
|
||||
results: {
|
||||
nestedElements: ((): AnalysisResultsDetailsElementNested[] => {
|
||||
const nestedElements = toArray(elementResponse.original_response_element?.UuringuElement)
|
||||
return nestedElements.map<AnalysisResultsDetailsElementNested>((element) => {
|
||||
const mappedResponse = this.mapUuringVastus({
|
||||
uuringVastus: element.UuringuVastus as UuringuVastus | undefined,
|
||||
});
|
||||
return {
|
||||
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,
|
||||
status: Number(elementResponse.status) as AnalysisStatus,
|
||||
analysisName: undefined,
|
||||
};
|
||||
});
|
||||
const nestedElements = toArray(
|
||||
elementResponse.original_response_element?.UuringuElement,
|
||||
);
|
||||
return nestedElements.map<AnalysisResultsDetailsElementNested>(
|
||||
(element) => {
|
||||
const mappedResponse = this.mapUuringVastus({
|
||||
uuringVastus: element.UuringuVastus as
|
||||
| UuringuVastus
|
||||
| undefined,
|
||||
});
|
||||
return {
|
||||
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,
|
||||
status: Number(elementResponse.status) as AnalysisStatus,
|
||||
analysisName: undefined,
|
||||
};
|
||||
},
|
||||
);
|
||||
})(),
|
||||
labComment,
|
||||
unit: elementResponse.unit,
|
||||
@@ -232,13 +297,19 @@ class UserAnalysesApi {
|
||||
normStatus: elementResponse.norm_status,
|
||||
responseTime: elementResponse.response_time,
|
||||
responseValue: elementResponse.response_value,
|
||||
responseValueIsNegative: elementResponse.response_value_is_negative === null ? null : elementResponse.response_value_is_negative === true,
|
||||
responseValueIsWithinNorm: elementResponse.response_value_is_within_norm === null ? null : elementResponse.response_value_is_within_norm === true,
|
||||
responseValueIsNegative:
|
||||
elementResponse.response_value_is_negative === null
|
||||
? null
|
||||
: elementResponse.response_value_is_negative === true,
|
||||
responseValueIsWithinNorm:
|
||||
elementResponse.response_value_is_within_norm === null
|
||||
? null
|
||||
: elementResponse.response_value_is_within_norm === true,
|
||||
normLowerIncluded: elementResponse.norm_lower_included,
|
||||
normUpperIncluded: elementResponse.norm_upper_included,
|
||||
status: Number(elementResponse.status) as AnalysisStatus,
|
||||
analysisElementOriginalId: elementResponse.analysis_element_original_id,
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -258,11 +329,19 @@ class UserAnalysesApi {
|
||||
return {
|
||||
normLower: uuringVastus?.NormAlum?.['#text'] ?? null,
|
||||
normUpper: uuringVastus?.NormYlem?.['#text'] ?? null,
|
||||
normStatus: (uuringVastus?.NormiStaatus ?? null) as AnalysisResultLevel | null,
|
||||
normStatus: (uuringVastus?.NormiStaatus ??
|
||||
null) as AnalysisResultLevel | null,
|
||||
responseTime: uuringVastus?.VastuseAeg ?? null,
|
||||
responseValue: responseValueIsNegative || !responseValueIsNumeric ? null : (responseValueNumber ?? null),
|
||||
responseValueIsNegative: responseValueIsNumeric ? null : responseValueIsNegative,
|
||||
responseValueIsWithinNorm: responseValueIsNumeric ? null : responseValueIsWithinNorm,
|
||||
responseValue:
|
||||
responseValueIsNegative || !responseValueIsNumeric
|
||||
? null
|
||||
: (responseValueNumber ?? null),
|
||||
responseValueIsNegative: responseValueIsNumeric
|
||||
? null
|
||||
: responseValueIsNegative,
|
||||
responseValueIsWithinNorm: responseValueIsNumeric
|
||||
? null
|
||||
: responseValueIsWithinNorm,
|
||||
normLowerIncluded:
|
||||
uuringVastus?.NormAlum?.['@_kaasaarvatud'].toLowerCase() === 'jah',
|
||||
normUpperIncluded:
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import type {
|
||||
AnalysisOrderStatus,
|
||||
NormStatus,
|
||||
} from '@kit/shared/types/medipost-analysis';
|
||||
import type { Database } from '@kit/supabase/database';
|
||||
import type { AnalysisOrderStatus, NormStatus } from '@kit/shared/types/medipost-analysis';
|
||||
|
||||
import type { AnalysisOrder } from './analysis-orders';
|
||||
|
||||
@@ -12,80 +15,80 @@ export type UserAnalysisResponse =
|
||||
export type UserAnalysis = UserAnalysisResponse[];
|
||||
|
||||
export type AnalysisResultsQuery = {
|
||||
id: number,
|
||||
analysis_order_id: number,
|
||||
order_number: string,
|
||||
order_status: string,
|
||||
user_id: string,
|
||||
created_at: string,
|
||||
updated_at: string | null,
|
||||
id: number;
|
||||
analysis_order_id: number;
|
||||
order_number: string;
|
||||
order_status: string;
|
||||
user_id: string;
|
||||
created_at: string;
|
||||
updated_at: string | null;
|
||||
elements: {
|
||||
unit: string,
|
||||
norm_lower: number,
|
||||
norm_upper: number,
|
||||
norm_status: number,
|
||||
analysis_name: string,
|
||||
response_time: string,
|
||||
response_value: number,
|
||||
response_value_is_negative: boolean,
|
||||
response_value_is_within_norm: boolean,
|
||||
norm_lower_included: boolean,
|
||||
norm_upper_included: boolean,
|
||||
status: string,
|
||||
analysis_element_original_id: string,
|
||||
unit: string;
|
||||
norm_lower: number;
|
||||
norm_upper: number;
|
||||
norm_status: number;
|
||||
analysis_name: string;
|
||||
response_time: string;
|
||||
response_value: number;
|
||||
response_value_is_negative: boolean;
|
||||
response_value_is_within_norm: boolean;
|
||||
norm_lower_included: boolean;
|
||||
norm_upper_included: boolean;
|
||||
status: string;
|
||||
analysis_element_original_id: string;
|
||||
original_response_element: {
|
||||
UuringuElement: {
|
||||
UuringIdOID: string,
|
||||
UuringId: string,
|
||||
TLyhend: string,
|
||||
KNimetus: string,
|
||||
UuringNimi: string,
|
||||
UuringuKommentaar: string | null,
|
||||
TellijaUuringId: number,
|
||||
TeostajaUuringId: string,
|
||||
UuringOlek: keyof typeof AnalysisOrderStatus,
|
||||
Mootyhik: string | null,
|
||||
UuringIdOID: string;
|
||||
UuringId: string;
|
||||
TLyhend: string;
|
||||
KNimetus: string;
|
||||
UuringNimi: string;
|
||||
UuringuKommentaar: string | null;
|
||||
TellijaUuringId: number;
|
||||
TeostajaUuringId: string;
|
||||
UuringOlek: keyof typeof AnalysisOrderStatus;
|
||||
Mootyhik: string | null;
|
||||
Kood: {
|
||||
HkKood: number,
|
||||
HkKoodiKordaja: number,
|
||||
Koefitsient: number,
|
||||
Hind: number,
|
||||
},
|
||||
HkKood: number;
|
||||
HkKoodiKordaja: number;
|
||||
Koefitsient: number;
|
||||
Hind: number;
|
||||
};
|
||||
UuringuVastus: {
|
||||
VastuseVaartus: string,
|
||||
VastuseAeg: string,
|
||||
NormiStaatus: keyof typeof NormStatus,
|
||||
ProoviJarjenumber: number,
|
||||
},
|
||||
UuringuTaitjaAsutuseJnr: number,
|
||||
},
|
||||
UuringuKommentaar: string | null,
|
||||
},
|
||||
}[],
|
||||
VastuseVaartus: string;
|
||||
VastuseAeg: string;
|
||||
NormiStaatus: keyof typeof NormStatus;
|
||||
ProoviJarjenumber: number;
|
||||
};
|
||||
UuringuTaitjaAsutuseJnr: number;
|
||||
};
|
||||
UuringuKommentaar: string | null;
|
||||
};
|
||||
}[];
|
||||
order: {
|
||||
status: string,
|
||||
medusa_order_id: string,
|
||||
created_at: string,
|
||||
},
|
||||
status: string;
|
||||
medusa_order_id: string;
|
||||
created_at: string;
|
||||
};
|
||||
summary: {
|
||||
id: number,
|
||||
value: string,
|
||||
status: string,
|
||||
user_id: string,
|
||||
created_at: string,
|
||||
created_by: string,
|
||||
updated_at: string | null,
|
||||
updated_by: string,
|
||||
doctor_user_id: string | null,
|
||||
analysis_order_id: number,
|
||||
id: number;
|
||||
value: string;
|
||||
status: string;
|
||||
user_id: string;
|
||||
created_at: string;
|
||||
created_by: string;
|
||||
updated_at: string | null;
|
||||
updated_by: string;
|
||||
doctor_user_id: string | null;
|
||||
analysis_order_id: number;
|
||||
doctor_analysis_feedback: {
|
||||
id: number,
|
||||
status: string,
|
||||
user_id: string,
|
||||
created_at: string,
|
||||
created_by: string,
|
||||
}[],
|
||||
} | null,
|
||||
id: number;
|
||||
status: string;
|
||||
user_id: string;
|
||||
created_at: string;
|
||||
created_by: string;
|
||||
}[];
|
||||
} | null;
|
||||
};
|
||||
|
||||
export type AnalysisResultsDetailsElementNested = {
|
||||
@@ -93,18 +96,18 @@ export type AnalysisResultsDetailsElementNested = {
|
||||
analysisName?: string;
|
||||
} & Pick<
|
||||
AnalysisResultDetailsElementResults,
|
||||
'unit' |
|
||||
'normLower' |
|
||||
'normUpper' |
|
||||
'normStatus' |
|
||||
'responseTime' |
|
||||
'responseValue' |
|
||||
'responseValueIsNegative' |
|
||||
'responseValueIsWithinNorm' |
|
||||
'normLowerIncluded' |
|
||||
'normUpperIncluded' |
|
||||
'status' |
|
||||
'analysisElementOriginalId'
|
||||
| 'unit'
|
||||
| 'normLower'
|
||||
| 'normUpper'
|
||||
| 'normStatus'
|
||||
| 'responseTime'
|
||||
| 'responseValue'
|
||||
| 'responseValueIsNegative'
|
||||
| 'responseValueIsWithinNorm'
|
||||
| 'normLowerIncluded'
|
||||
| 'normUpperIncluded'
|
||||
| 'status'
|
||||
| 'analysisElementOriginalId'
|
||||
>;
|
||||
|
||||
export enum AnalysisResultLevel {
|
||||
|
||||
Reference in New Issue
Block a user