import { createUserAnalysesApi } from '@/packages/features/user-analyses/src/server/api'; import { getSupabaseServerAdminClient } from '@/packages/supabase/src/clients/server-admin-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[]; waitingForResults: Pick[]; }; export default async function syncAnalysisResults() { console.info('Syncing analysis results'); const supabase = getSupabaseServerAdminClient(); 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)}`, ); }