Files
medreport_mrb2b/app/api/job/handler/sync-analysis-results.ts
2025-10-10 14:19:27 +03:00

77 lines
2.3 KiB
TypeScript

import { createUserAnalysesApi } from '@/packages/features/user-analyses/src/server/api';
import { getSupabaseServerClient } from '@/packages/supabase/src/clients/server-client';
import { readPrivateMessageResponse } from '~/lib/services/medipost/medipostPrivateMessage.service';
type ProcessedMessage = {
messageId: string;
hasAnalysisResponse: boolean;
hasPartialAnalysisResponse: boolean;
hasFullAnalysisResponse: boolean;
medusaOrderId: string | undefined;
analysisOrderId: number | undefined;
};
type GroupedResults = {
processed: Pick<ProcessedMessage, 'messageId' | 'analysisOrderId'>[];
waitingForResults: Pick<ProcessedMessage, 'messageId' | 'analysisOrderId'>[];
};
export default async function syncAnalysisResults() {
console.info('Syncing analysis results');
const supabase = getSupabaseServerClient();
const api = createUserAnalysesApi(supabase);
const processedMessages: ProcessedMessage[] = [];
const excludedMessageIds: string[] = [];
while (true) {
const result = await readPrivateMessageResponse({ excludedMessageIds });
if (result.messageId) {
processedMessages.push(result as ProcessedMessage);
}
await api.sendAnalysisResultsNotification({
hasFullAnalysisResponse: result.hasFullAnalysisResponse,
hasPartialAnalysisResponse: result.hasAnalysisResponse,
analysisOrderId: result.analysisOrderId,
});
if (!result.messageId) {
console.info('No more messages to process');
break;
}
if (!excludedMessageIds.includes(result.messageId)) {
excludedMessageIds.push(result.messageId);
} else {
break;
}
}
const groupedResults = processedMessages.reduce((acc, result) => {
if (result.analysisOrderId) {
if (result.hasAnalysisResponse) {
if (!acc.processed) {
acc.processed = [];
}
acc.processed.push({
messageId: result.messageId,
analysisOrderId: result.analysisOrderId,
});
} else {
if (!acc.waitingForResults) {
acc.waitingForResults = [];
}
acc.waitingForResults.push({
messageId: result.messageId,
analysisOrderId: result.analysisOrderId,
});
}
}
return acc;
}, {} as GroupedResults);
console.info(
`Processed ${processedMessages.length} messages, results: ${JSON.stringify(groupedResults)}`,
);
}