feat(MED-85): improve results sync logs
This commit is contained in:
@@ -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)}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user