From 0e9d9a212acd7202e7ab3535fa1e6a70584ce7dc Mon Sep 17 00:00:00 2001 From: k4rli Date: Mon, 4 Aug 2025 11:53:18 +0300 Subject: [PATCH] feat(MED-131): sync analysis results in job handler --- app/api/job/handler/sync-analysis-results.ts | 23 +++++++++++++++++ app/api/job/sync-analysis-results/route.ts | 27 ++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 app/api/job/handler/sync-analysis-results.ts create mode 100644 app/api/job/sync-analysis-results/route.ts diff --git a/app/api/job/handler/sync-analysis-results.ts b/app/api/job/handler/sync-analysis-results.ts new file mode 100644 index 0000000..4d78ade --- /dev/null +++ b/app/api/job/handler/sync-analysis-results.ts @@ -0,0 +1,23 @@ +import { readPrivateMessageResponse } from "~/lib/services/medipost.service"; + +export default async function syncAnalysisResults() { + console.info("Syncing analysis results"); + + const excludedMessageIds: string[] = []; + while (true) { + console.info("Fetching private messages"); + const { messageIdErrored } = await readPrivateMessageResponse({ excludedMessageIds }); + if (!messageIdErrored) { + console.info("No more messages to process"); + break; + } + + if (excludedMessageIds.includes(messageIdErrored)) { + console.info(`Message id=${messageIdErrored} has already been processed, stopping`); + break; + } + + console.info(`Message id=${messageIdErrored} has no response yet, skipping`); + excludedMessageIds.push(messageIdErrored); + } +} diff --git a/app/api/job/sync-analysis-results/route.ts b/app/api/job/sync-analysis-results/route.ts new file mode 100644 index 0000000..dc0b6eb --- /dev/null +++ b/app/api/job/sync-analysis-results/route.ts @@ -0,0 +1,27 @@ +import { NextRequest, NextResponse } from "next/server"; +import loadEnv from "../handler/load-env"; +import validateApiKey from "../handler/validate-api-key"; +import syncAnalysisResults from "../handler/sync-analysis-results"; + +export const POST = async (request: NextRequest) => { + loadEnv(); + + try { + validateApiKey(request); + } catch (e) { + return NextResponse.json({}, { status: 401, statusText: 'Unauthorized' }); + } + + try { + await syncAnalysisResults(); + console.info("Successfully synced analysis results"); + return NextResponse.json({ + message: 'Successfully synced analysis results', + }, { status: 200 }); + } catch (e) { + console.error("Error syncing analysis results", e); + return NextResponse.json({ + message: 'Failed to sync analysis results', + }, { status: 500 }); + } +};