feat(MED-85): improve results sync logs

This commit is contained in:
2025-08-27 08:07:18 +03:00
parent 68e5101885
commit 380363922c
2 changed files with 91 additions and 24 deletions

View File

@@ -1,29 +1,62 @@
import { readPrivateMessageResponse } from "~/lib/services/medipost.service"; import { readPrivateMessageResponse } from "~/lib/services/medipost.service";
type ProcessedMessage = {
messageId: string;
hasAnalysisResponse: boolean;
hasPartialAnalysisResponse: boolean;
hasFullAnalysisResponse: boolean;
medusaOrderId: string | undefined;
};
type GroupedResults = {
processed: Pick<ProcessedMessage, 'messageId' | 'medusaOrderId'>[];
waitingForResults: Pick<ProcessedMessage, 'messageId' | 'medusaOrderId'>[];
};
export default async function syncAnalysisResults() { export default async function syncAnalysisResults() {
console.info("Syncing analysis results"); console.info("Syncing analysis results");
let processedMessageIds: string[] = []; let processedMessages: ProcessedMessage[] = [];
const excludedMessageIds: string[] = []; const excludedMessageIds: string[] = [];
while (true) { while (true) {
console.info("Fetching private messages"); const result = await readPrivateMessageResponse({ excludedMessageIds });
const { messageIdErrored, messageIdProcessed } = await readPrivateMessageResponse({ excludedMessageIds }); if (result.messageId) {
if (messageIdProcessed) { processedMessages.push(result as ProcessedMessage);
processedMessageIds.push(messageIdProcessed);
} }
if (!messageIdErrored) { if (!result.messageId) {
console.info("No more messages to process"); console.info("No more messages to process");
break; break;
} }
if (excludedMessageIds.includes(messageIdErrored)) { if (!excludedMessageIds.includes(result.messageId)) {
console.info(`Message id=${messageIdErrored} has already been processed, stopping`); excludedMessageIds.push(result.messageId);
} else {
break; break;
} }
excludedMessageIds.push(messageIdErrored);
} }
console.info(`Processed ${processedMessageIds.length} messages, ids: ${processedMessageIds.join(', ')}`); const groupedResults = processedMessages.reduce((acc, result) => {
if (result.medusaOrderId) {
if (result.hasAnalysisResponse) {
if (!acc.processed) {
acc.processed = [];
}
acc.processed.push({
messageId: result.messageId,
medusaOrderId: result.medusaOrderId,
});
} else {
if (!acc.waitingForResults) {
acc.waitingForResults = [];
}
acc.waitingForResults.push({
messageId: result.messageId,
medusaOrderId: result.medusaOrderId,
});
}
}
return acc;
}, {} as GroupedResults);
console.info(`Processed ${processedMessages.length} messages, results: ${JSON.stringify(groupedResults, undefined, 2)}`);
} }

View File

@@ -202,28 +202,60 @@ export async function readPrivateMessageResponse({
excludedMessageIds, excludedMessageIds,
}: { }: {
excludedMessageIds: string[]; excludedMessageIds: string[];
}) { }): Promise<{ messageId: string | null; hasAnalysisResponse: boolean; hasPartialAnalysisResponse: boolean; hasFullAnalysisResponse: boolean; medusaOrderId: string | undefined }> {
let messageIdErrored: string | null = null; let messageId: string | null = null;
let messageIdProcessed: string | null = null; let hasAnalysisResponse = false;
let hasPartialAnalysisResponse = false;
let hasFullAnalysisResponse = false;
let medusaOrderId: string | undefined = undefined;
try { try {
const privateMessage = await getLatestPrivateMessageListItem({ excludedMessageIds }); const privateMessage = await getLatestPrivateMessageListItem({ excludedMessageIds });
if (!privateMessage) { if (!privateMessage) {
throw new Error(`No private message found`); return {
messageId: null,
hasAnalysisResponse: false,
hasPartialAnalysisResponse: false,
hasFullAnalysisResponse: false,
medusaOrderId: undefined,
};
} }
messageIdErrored = privateMessage.messageId; messageId = privateMessage.messageId;
if (!messageIdErrored) { if (!messageId) {
throw new Error(`No message id found`); return {
messageId: null,
hasAnalysisResponse: false,
hasPartialAnalysisResponse: false,
hasFullAnalysisResponse: false,
medusaOrderId: undefined,
};
} }
const privateMessageContent = await getPrivateMessage( const privateMessageContent = await getPrivateMessage(
privateMessage.messageId, privateMessage.messageId,
); );
const messageResponse = privateMessageContent?.Saadetis?.Vastus; const messageResponse = privateMessageContent?.Saadetis?.Vastus;
const medusaOrderId = privateMessageContent?.Saadetis?.Tellimus?.ValisTellimuseId || messageResponse?.ValisTellimuseId; medusaOrderId = privateMessageContent?.Saadetis?.Tellimus?.ValisTellimuseId || messageResponse?.ValisTellimuseId;
if (!medusaOrderId || !medusaOrderId.toString().startsWith('order_')) {
return {
messageId,
hasAnalysisResponse: false,
hasPartialAnalysisResponse: false,
hasFullAnalysisResponse: false,
medusaOrderId: undefined,
};
}
if (!messageResponse) { if (!messageResponse) {
throw new Error(`Private message response has no results yet for order=${medusaOrderId}`); return {
messageId,
hasAnalysisResponse: false,
hasPartialAnalysisResponse: false,
hasFullAnalysisResponse: false,
medusaOrderId,
};
} }
let order: Tables<{ schema: 'medreport' }, 'analysis_orders'>; let order: Tables<{ schema: 'medreport' }, 'analysis_orders'>;
@@ -238,17 +270,19 @@ export async function readPrivateMessageResponse({
if (status.isPartial) { if (status.isPartial) {
await updateOrderStatus({ medusaOrderId, orderStatus: 'PARTIAL_ANALYSIS_RESPONSE' }); await updateOrderStatus({ medusaOrderId, orderStatus: 'PARTIAL_ANALYSIS_RESPONSE' });
messageIdProcessed = privateMessage.messageId; hasAnalysisResponse = true;
hasPartialAnalysisResponse = true;
} else if (status.isCompleted) { } else if (status.isCompleted) {
await updateOrderStatus({ medusaOrderId, orderStatus: 'FULL_ANALYSIS_RESPONSE' }); await updateOrderStatus({ medusaOrderId, orderStatus: 'FULL_ANALYSIS_RESPONSE' });
await deletePrivateMessage(privateMessage.messageId); await deletePrivateMessage(privateMessage.messageId);
messageIdProcessed = privateMessage.messageId; hasAnalysisResponse = true;
hasFullAnalysisResponse = true;
} }
} catch (e) { } catch (e) {
console.warn(`Failed to process private message id=${messageIdErrored}, message=${(e as Error).message}`); console.warn(`Failed to process private message id=${messageId}, message=${(e as Error).message}`);
} }
return { messageIdErrored, messageIdProcessed }; return { messageId, hasAnalysisResponse, hasPartialAnalysisResponse, hasFullAnalysisResponse, medusaOrderId };
} }
async function saveAnalysisGroup( async function saveAnalysisGroup(