From 7ad7375dd2b860fc22105b35cbb93459bbb07d80 Mon Sep 17 00:00:00 2001 From: SJCoetz Date: Fri, 7 Aug 2026 02:46:18 +0200 Subject: [PATCH] feat(context): GET /api/v1/order-items/[id]/context route Co-authored-by: Orca --- .../api/v1/order-items/[id]/context/route.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/app/api/v1/order-items/[id]/context/route.ts diff --git a/src/app/api/v1/order-items/[id]/context/route.ts b/src/app/api/v1/order-items/[id]/context/route.ts new file mode 100644 index 0000000..a8780bc --- /dev/null +++ b/src/app/api/v1/order-items/[id]/context/route.ts @@ -0,0 +1,35 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getOrderItemContext } from "@/lib/server/order-item-context-service"; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +/** + * GET /api/v1/order-items/[id]/context + * + * Deterministic SKU-based context for an order_item: last quote, + * last order, last invoice checked in, stock state, supplier + * history, cheapest. Used by the sprint process modal (L1 inline) + * and the orders detail page (L2 popover). + * + * No Bearer required — matches the existing item-history route's + * read-only SKU aggregates pattern. Auth happens upstream at the + * page level. + */ +export async function GET( + _req: NextRequest, + { params }: { params: Promise<{ id: string }> }, +) { + const { id } = await params; + if (!id || typeof id !== "string") { + return NextResponse.json({ error: "Missing id" }, { status: 400 }); + } + try { + return NextResponse.json(await getOrderItemContext(id)); + } catch (err) { + return NextResponse.json( + { error: err instanceof Error ? err.message : "Lookup failed" }, + { status: 500 }, + ); + } +}