import type { MedipostOrderResponse, MedipostAnalysisResult } from '@/packages/shared/src/types/medipost-analysis'; interface ParsedMessageData { analysisResult: NonNullable; 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, }, }; } }