feat(MED-168): separate user analysis results building
This commit is contained in:
@@ -43,31 +43,13 @@ class UserAnalysesApi {
|
|||||||
async getUserAnalysis(
|
async getUserAnalysis(
|
||||||
analysisOrderId: number,
|
analysisOrderId: number,
|
||||||
): Promise<AnalysisResultDetailsMapped | null> {
|
): Promise<AnalysisResultDetailsMapped | null> {
|
||||||
const authUser = await this.client.auth.getUser();
|
|
||||||
const { data, error: userError } = authUser;
|
|
||||||
|
|
||||||
if (userError) {
|
|
||||||
console.error('Failed to get user', userError);
|
|
||||||
throw userError;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { user } = data;
|
|
||||||
|
|
||||||
const analysisOrder = await this.getAnalysisOrder({ analysisOrderId });
|
const analysisOrder = await this.getAnalysisOrder({ analysisOrderId });
|
||||||
const orderedAnalysisElementIds = analysisOrder.analysis_element_ids ?? [];
|
const orderedAnalysisElementIds = analysisOrder.analysis_element_ids ?? [];
|
||||||
if (orderedAnalysisElementIds.length === 0) {
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
const { data: orderedAnalysisElements, error: orderedAnalysisElementsError } = await this.client
|
const orderedAnalysisElements = await this.getOrderedAnalysisElements({ analysisOrderId, orderedAnalysisElementIds });
|
||||||
.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);
|
|
||||||
throw orderedAnalysisElementsError;
|
|
||||||
}
|
|
||||||
|
|
||||||
const orderedAnalysisElementOriginalIds = orderedAnalysisElements.map(({ analysis_id_original }) => analysis_id_original);
|
const orderedAnalysisElementOriginalIds = orderedAnalysisElements.map(({ analysis_id_original }) => analysis_id_original);
|
||||||
if (orderedAnalysisElementOriginalIds.length === 0) {
|
if (orderedAnalysisElementOriginalIds.length === 0) {
|
||||||
@@ -75,6 +57,44 @@ class UserAnalysesApi {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const responseWithElements = await this.getAnalysisResponseWithElements({ analysisOrderId });
|
||||||
|
if (!responseWithElements) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mappedOrderedAnalysisElements = await this.getMappedOrderedAnalysisElements({
|
||||||
|
analysisResponseElements: responseWithElements.elements,
|
||||||
|
orderedAnalysisElements,
|
||||||
|
});
|
||||||
|
|
||||||
|
const feedback = responseWithElements.summary?.doctor_analysis_feedback?.[0];
|
||||||
|
return {
|
||||||
|
id: analysisOrderId,
|
||||||
|
order: {
|
||||||
|
status: analysisOrder.status,
|
||||||
|
medusaOrderId: analysisOrder.medusa_order_id,
|
||||||
|
createdAt: new Date(analysisOrder.created_at),
|
||||||
|
},
|
||||||
|
orderedAnalysisElementIds,
|
||||||
|
orderedAnalysisElements: mappedOrderedAnalysisElements,
|
||||||
|
summary:
|
||||||
|
feedback?.status === 'COMPLETED'
|
||||||
|
? (responseWithElements.summary?.doctor_analysis_feedback?.[0] ?? null)
|
||||||
|
: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAnalysisResponseWithElements({
|
||||||
|
analysisOrderId,
|
||||||
|
}: {
|
||||||
|
analysisOrderId: number;
|
||||||
|
}) {
|
||||||
|
const { data, error: userError } = await this.client.auth.getUser();
|
||||||
|
if (userError) {
|
||||||
|
throw userError;
|
||||||
|
}
|
||||||
|
const { user } = data;
|
||||||
|
|
||||||
const { data: analysisResponse } = await this.client
|
const { data: analysisResponse } = await this.client
|
||||||
.schema('medreport')
|
.schema('medreport')
|
||||||
.from('analysis_responses')
|
.from('analysis_responses')
|
||||||
@@ -87,23 +107,45 @@ class UserAnalysesApi {
|
|||||||
.eq('analysis_order_id', analysisOrderId)
|
.eq('analysis_order_id', analysisOrderId)
|
||||||
.throwOnError();
|
.throwOnError();
|
||||||
|
|
||||||
const responseWithElements = analysisResponse?.[0] as AnalysisResultDetails | null;
|
return analysisResponse?.[0] as AnalysisResultDetails | null;
|
||||||
if (!responseWithElements) {
|
}
|
||||||
return null;
|
|
||||||
|
async getOrderedAnalysisElements({
|
||||||
|
analysisOrderId,
|
||||||
|
orderedAnalysisElementIds,
|
||||||
|
}: {
|
||||||
|
analysisOrderId: number;
|
||||||
|
orderedAnalysisElementIds: number[];
|
||||||
|
}) {
|
||||||
|
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);
|
||||||
|
throw orderedAnalysisElementsError;
|
||||||
}
|
}
|
||||||
|
return orderedAnalysisElements;
|
||||||
|
}
|
||||||
|
|
||||||
const analysisResponseElements = responseWithElements.elements;
|
async getMappedOrderedAnalysisElements({
|
||||||
|
analysisResponseElements,
|
||||||
const feedback = responseWithElements.summary?.doctor_analysis_feedback?.[0];
|
orderedAnalysisElements,
|
||||||
|
}: {
|
||||||
|
analysisResponseElements: AnalysisResultDetails['elements'];
|
||||||
|
orderedAnalysisElements: { analysis_id_original: string; analysis_name_lab: string }[];
|
||||||
|
}) {
|
||||||
const mappedOrderedAnalysisElements = orderedAnalysisElements.map(({ analysis_id_original, analysis_name_lab }) => {
|
const mappedOrderedAnalysisElements = orderedAnalysisElements.map(({ analysis_id_original, analysis_name_lab }) => {
|
||||||
return this.getOrderedAnalysisElements({
|
return this.getOrderedAnalysisElement({
|
||||||
analysisIdOriginal: analysis_id_original,
|
analysisIdOriginal: analysis_id_original,
|
||||||
analysisNameLab: analysis_name_lab,
|
analysisNameLab: analysis_name_lab,
|
||||||
analysisResponseElements,
|
analysisResponseElements,
|
||||||
});
|
});
|
||||||
}).sort((a, b) => a.analysisName.localeCompare(b.analysisName));
|
}).sort((a, b) => a.analysisName.localeCompare(b.analysisName));
|
||||||
const nestedAnalysisElementIds = mappedOrderedAnalysisElements.map(({ results }) => results?.nestedElements.map(({ analysisElementOriginalId }) => analysisElementOriginalId)).flat().filter(Boolean);
|
const nestedAnalysisElementIds = mappedOrderedAnalysisElements
|
||||||
|
.map(({ results }) => results?.nestedElements.map(({ analysisElementOriginalId }) => analysisElementOriginalId))
|
||||||
|
.flat().filter(Boolean);
|
||||||
if (nestedAnalysisElementIds.length > 0) {
|
if (nestedAnalysisElementIds.length > 0) {
|
||||||
const { data: nestedAnalysisElements, error: nestedAnalysisElementsError } = await this.client
|
const { data: nestedAnalysisElements, error: nestedAnalysisElementsError } = await this.client
|
||||||
.schema('medreport')
|
.schema('medreport')
|
||||||
@@ -139,29 +181,18 @@ class UserAnalysesApi {
|
|||||||
analysisElementOriginalId,
|
analysisElementOriginalId,
|
||||||
analysisName: nestedAnalysisElement.analysis_name_lab,
|
analysisName: nestedAnalysisElement.analysis_name_lab,
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
console.error('Nested analysis element not found for analysis element original id=', analysisElementOriginalId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return mappedOrderedAnalysisElements;
|
||||||
id: analysisOrderId,
|
|
||||||
order: {
|
|
||||||
status: analysisOrder.status,
|
|
||||||
medusaOrderId: analysisOrder.medusa_order_id,
|
|
||||||
createdAt: new Date(analysisOrder.created_at),
|
|
||||||
},
|
|
||||||
orderedAnalysisElementIds,
|
|
||||||
orderedAnalysisElements: mappedOrderedAnalysisElements,
|
|
||||||
summary:
|
|
||||||
feedback?.status === 'COMPLETED'
|
|
||||||
? (responseWithElements.summary?.doctor_analysis_feedback?.[0] ?? null)
|
|
||||||
: null,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getOrderedAnalysisElements({
|
getOrderedAnalysisElement({
|
||||||
analysisIdOriginal,
|
analysisIdOriginal,
|
||||||
analysisNameLab,
|
analysisNameLab,
|
||||||
analysisResponseElements,
|
analysisResponseElements,
|
||||||
|
|||||||
Reference in New Issue
Block a user