From 89c17688818e24d3b3ef127a19c64e14ed5e003f Mon Sep 17 00:00:00 2001 From: Vula Builder Date: Mon, 27 Jul 2026 18:34:58 +0000 Subject: [PATCH] Deploy --- src/app/api/popular-products/route.ts | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/app/api/popular-products/route.ts diff --git a/src/app/api/popular-products/route.ts b/src/app/api/popular-products/route.ts new file mode 100644 index 0000000..b3935df --- /dev/null +++ b/src/app/api/popular-products/route.ts @@ -0,0 +1,48 @@ +import { NextRequest, NextResponse } from 'next/server' + +const BACKEND_URL = process.env.VULA_ECOMMERCE_BACKEND_URL || 'http://vula-ecommerce:9000' +const PUB_KEY = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY || '' + +let cache: { data: unknown; ts: number } | null = null +const CACHE_TTL = 5 * 60 * 1000 // 5 minutes + +export async function GET(req: NextRequest) { + const limit = Number(req.nextUrl.searchParams.get('limit') ?? '8') + if (cache && Date.now() - cache.ts < CACHE_TTL) { + return NextResponse.json(cache.data) + } + try { + const regionRes = await fetch(`${BACKEND_URL}/store/regions?limit=1`, { + headers: { 'x-publishable-api-key': PUB_KEY }, cache: 'no-store' + }) + const regionData = regionRes.ok ? await regionRes.json() as { regions?: Array<{ id: string }> } : {} + const regionId = regionData.regions?.[0]?.id ?? '' + + const url = new URL(`${BACKEND_URL}/store/products`) + url.searchParams.set('limit', '100') + url.searchParams.set('fields', 'id,title,thumbnail,variants,metadata,created_at') + if (regionId) url.searchParams.set('region_id', regionId) + + const res = await fetch(url.toString(), { + headers: { 'x-publishable-api-key': PUB_KEY }, cache: 'no-store' + }) + if (!res.ok) return NextResponse.json({ products: [] }, { status: res.status }) + + const data = await res.json() as { products?: Array<{ metadata?: { order_count?: number }; created_at?: string }> } + const sorted = (data.products ?? []) + .slice() + .sort((a, b) => { + const aScore = (a.metadata?.order_count ?? 0) + const bScore = (b.metadata?.order_count ?? 0) + if (bScore !== aScore) return bScore - aScore + return new Date(b.created_at ?? 0).getTime() - new Date(a.created_at ?? 0).getTime() + }) + .slice(0, limit) + + const result = { products: sorted } + cache = { data: result, ts: Date.now() } + return NextResponse.json(result) + } catch { + return NextResponse.json({ products: [] }, { status: 500 }) + } +}