From 47ab39172e080a559c74f5e2798e584950f98849 Mon Sep 17 00:00:00 2001 From: Karli Date: Thu, 28 Aug 2025 10:24:13 +0300 Subject: [PATCH] feat(MED-85): run sending fake medipost results in dev from Medusa BO --- .../route.ts | 57 +++++++++++++++++++ app/api/job/test-medipost-responses/route.ts | 2 - lib/services/order.service.ts | 5 ++ packages/supabase/src/database.types.ts | 5 ++ ...20250825120858_medipost_retry_dispatch.sql | 0 .../20250827090151_bo_run_results_sync.sql | 2 + ...827090152_bo_run_dev_fake_results_sync.sql | 20 +++++++ 7 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 app/api/job/send-medipost-test-response-for-order/route.ts rename supabase/{migrations => migrations-env-specific}/20250825120858_medipost_retry_dispatch.sql (100%) rename supabase/{migrations => migrations-env-specific}/20250827090151_bo_run_results_sync.sql (82%) create mode 100644 supabase/migrations-env-specific/20250827090152_bo_run_dev_fake_results_sync.sql diff --git a/app/api/job/send-medipost-test-response-for-order/route.ts b/app/api/job/send-medipost-test-response-for-order/route.ts new file mode 100644 index 0000000..a4ad457 --- /dev/null +++ b/app/api/job/send-medipost-test-response-for-order/route.ts @@ -0,0 +1,57 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getAnalysisOrdersAdmin } from "~/lib/services/order.service"; +import { composeOrderTestResponseXML, sendPrivateMessageTestResponse } from "~/lib/services/medipostTest.service"; +import { retrieveOrder } from "@lib/data"; +import { getAccountAdmin } from "~/lib/services/account.service"; +import { getOrderedAnalysisElementsIds } from "~/lib/services/medipost.service"; +import loadEnv from "../handler/load-env"; +import validateApiKey from "../handler/validate-api-key"; + +export async function POST(request: NextRequest) { + loadEnv(); + + try { + validateApiKey(request); + } catch (e) { + return NextResponse.json({}, { status: 401, statusText: 'Unauthorized' }); + } + + const { order_id: medusaOrderId } = await request.json(); + if (!medusaOrderId) { + return NextResponse.json({ error: 'order_id is required' }, { status: 400 }); + } + + const analysisOrders = await getAnalysisOrdersAdmin({ medusaOrderId }); + + console.error(`Sending test responses for ${analysisOrders.length} analysis orders`); + for (const medreportOrder of analysisOrders) { + const medusaOrderId = medreportOrder.medusa_order_id; + const medusaOrder = await retrieveOrder(medusaOrderId) + + const account = await getAccountAdmin({ primaryOwnerUserId: medreportOrder.user_id }); + const orderedAnalysisElementsIds = await getOrderedAnalysisElementsIds({ medusaOrder }); + + console.info(`Sending test response for order=${medusaOrderId} with ${orderedAnalysisElementsIds.length} ordered analysis elements`); + const idsToSend = orderedAnalysisElementsIds; + const messageXml = await composeOrderTestResponseXML({ + person: { + idCode: account.personal_code!, + firstName: account.name ?? '', + lastName: account.last_name ?? '', + phone: account.phone ?? '', + }, + orderedAnalysisElementsIds: idsToSend.map(({ analysisElementId }) => analysisElementId), + orderedAnalysesIds: [], + orderId: medusaOrderId, + orderCreatedAt: new Date(medreportOrder.created_at), + }); + + try { + await sendPrivateMessageTestResponse({ messageXml }); + } catch (error) { + console.error("Error sending private message test response: ", error); + } + } + + return NextResponse.json({ success: true }); +} diff --git a/app/api/job/test-medipost-responses/route.ts b/app/api/job/test-medipost-responses/route.ts index 2cf8fa7..51566fa 100644 --- a/app/api/job/test-medipost-responses/route.ts +++ b/app/api/job/test-medipost-responses/route.ts @@ -41,8 +41,6 @@ export async function POST(request: NextRequest) { orderCreatedAt: new Date(medreportOrder.created_at), }); - console.info("SEND XML", messageXml); - try { await sendPrivateMessageTestResponse({ messageXml }); } catch (error) { diff --git a/lib/services/order.service.ts b/lib/services/order.service.ts index 8afb4c4..e7ca441 100644 --- a/lib/services/order.service.ts +++ b/lib/services/order.service.ts @@ -134,8 +134,10 @@ export async function getAnalysisOrders({ export async function getAnalysisOrdersAdmin({ orderStatus, + medusaOrderId, }: { orderStatus?: Tables<{ schema: 'medreport' }, 'analysis_orders'>['status']; + medusaOrderId?: string | null; } = {}) { const query = getSupabaseServerAdminClient() .schema('medreport') @@ -144,6 +146,9 @@ export async function getAnalysisOrdersAdmin({ if (orderStatus) { query.eq('status', orderStatus); } + if (medusaOrderId) { + query.eq('medusa_order_id', medusaOrderId); + } const orders = await query.order('created_at', { ascending: false }).throwOnError(); return orders.data; } diff --git a/packages/supabase/src/database.types.ts b/packages/supabase/src/database.types.ts index 629bc38..9e80564 100644 --- a/packages/supabase/src/database.types.ts +++ b/packages/supabase/src/database.types.ts @@ -2074,6 +2074,11 @@ export type Database = { } sync_analysis_results: { } + send_medipost_test_response_for_order: { + Args: { + order_id: string + } + } } Enums: { analysis_feedback_status: "STARTED" | "DRAFT" | "COMPLETED" diff --git a/supabase/migrations/20250825120858_medipost_retry_dispatch.sql b/supabase/migrations-env-specific/20250825120858_medipost_retry_dispatch.sql similarity index 100% rename from supabase/migrations/20250825120858_medipost_retry_dispatch.sql rename to supabase/migrations-env-specific/20250825120858_medipost_retry_dispatch.sql diff --git a/supabase/migrations/20250827090151_bo_run_results_sync.sql b/supabase/migrations-env-specific/20250827090151_bo_run_results_sync.sql similarity index 82% rename from supabase/migrations/20250827090151_bo_run_results_sync.sql rename to supabase/migrations-env-specific/20250827090151_bo_run_results_sync.sql index 5aae2bd..3bddde6 100644 --- a/supabase/migrations/20250827090151_bo_run_results_sync.sql +++ b/supabase/migrations-env-specific/20250827090151_bo_run_results_sync.sql @@ -12,3 +12,5 @@ BEGIN ) as request_id; END; $$; + +grant execute on function medreport.sync_analysis_results() to service_role; diff --git a/supabase/migrations-env-specific/20250827090152_bo_run_dev_fake_results_sync.sql b/supabase/migrations-env-specific/20250827090152_bo_run_dev_fake_results_sync.sql new file mode 100644 index 0000000..bf04187 --- /dev/null +++ b/supabase/migrations-env-specific/20250827090152_bo_run_dev_fake_results_sync.sql @@ -0,0 +1,20 @@ +-- Parameters order_id +CREATE OR REPLACE FUNCTION medreport.send_medipost_test_response_for_order(order_id text) +RETURNS void +LANGUAGE plpgsql +AS $$ +BEGIN + select net.http_post( + url := 'https://test.medreport.ee/api/job/send-medipost-test-response-for-order', + headers := jsonb_build_object( + 'Content-Type', 'application/json', + 'x-jobs-api-key', 'fd26ec26-70ed-11f0-9e95-431ac3b15a84' + ), + body := jsonb_build_object( + 'order_id', order_id + ) + ) as request_id; +END; +$$; + +grant execute on function medreport.send_medipost_test_response_for_order(text) to service_role;