Move medipostPrivateMessage.service to separate classes, improve logging
This commit is contained in:
106
lib/services/medipost/medipostMessageParser.service.ts
Normal file
106
lib/services/medipost/medipostMessageParser.service.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
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,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user