107 lines
2.8 KiB
TypeScript
107 lines
2.8 KiB
TypeScript
import type { MedipostOrderResponse, MedipostAnalysisResult } from '@/packages/shared/src/types/medipost-analysis';
|
|
|
|
interface ParsedMessageData {
|
|
analysisResult: NonNullable<MedipostAnalysisResult>;
|
|
orderNumber: string;
|
|
medipostExternalOrderId: number;
|
|
medipostExternalOrderIdRaw: string | number;
|
|
patientPersonalCode: string;
|
|
}
|
|
|
|
type ParseMessageResult =
|
|
| {
|
|
success: true;
|
|
data: ParsedMessageData;
|
|
}
|
|
| {
|
|
success: false;
|
|
reason: 'no_analysis_result' | 'invalid_order_id' | 'invalid_patient_code';
|
|
medipostExternalOrderIdRaw?: string | number;
|
|
medipostExternalOrderId?: number;
|
|
};
|
|
|
|
export default class MedipostMessageParser {
|
|
public extractAnalysisResult(
|
|
message: MedipostOrderResponse,
|
|
): ParsedMessageData['analysisResult'] | null {
|
|
return message?.Saadetis?.Vastus ?? null;
|
|
}
|
|
|
|
public extractOrderId(
|
|
message: MedipostOrderResponse,
|
|
analysisResult: ParsedMessageData['analysisResult'],
|
|
): { orderId: number; rawOrderId: string | number } | null {
|
|
const rawOrderId =
|
|
message.Saadetis?.Tellimus?.ValisTellimuseId ||
|
|
analysisResult.ValisTellimuseId;
|
|
|
|
if (!rawOrderId) {
|
|
return null;
|
|
}
|
|
|
|
const orderId = Number(rawOrderId);
|
|
if (isNaN(orderId)) {
|
|
return null;
|
|
}
|
|
|
|
return { orderId, rawOrderId };
|
|
}
|
|
|
|
public extractOrderNumber(
|
|
analysisResult: ParsedMessageData['analysisResult'],
|
|
): string {
|
|
return analysisResult.TellimuseNumber;
|
|
}
|
|
|
|
public extractPatientPersonalCode(
|
|
analysisResult: ParsedMessageData['analysisResult'],
|
|
): string | null {
|
|
return analysisResult.Patsient.Isikukood?.toString() ?? null;
|
|
}
|
|
|
|
public parseMessage(message: MedipostOrderResponse): ParseMessageResult {
|
|
const analysisResult = this.extractAnalysisResult(message);
|
|
|
|
if (!analysisResult) {
|
|
return {
|
|
success: false,
|
|
reason: 'no_analysis_result',
|
|
};
|
|
}
|
|
|
|
const orderIdResult = this.extractOrderId(message, analysisResult);
|
|
if (!orderIdResult) {
|
|
return {
|
|
success: false,
|
|
reason: 'invalid_order_id',
|
|
medipostExternalOrderIdRaw:
|
|
message.Saadetis?.Tellimus?.ValisTellimuseId ||
|
|
analysisResult.ValisTellimuseId,
|
|
};
|
|
}
|
|
|
|
const patientPersonalCode = this.extractPatientPersonalCode(analysisResult);
|
|
if (!patientPersonalCode) {
|
|
return {
|
|
success: false,
|
|
reason: 'invalid_patient_code',
|
|
medipostExternalOrderIdRaw: orderIdResult.rawOrderId,
|
|
medipostExternalOrderId: orderIdResult.orderId,
|
|
};
|
|
}
|
|
|
|
const orderNumber = this.extractOrderNumber(analysisResult);
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
analysisResult,
|
|
orderNumber,
|
|
medipostExternalOrderId: orderIdResult.orderId,
|
|
medipostExternalOrderIdRaw: orderIdResult.rawOrderId,
|
|
patientPersonalCode,
|
|
},
|
|
};
|
|
}
|
|
}
|