From f79ef3e76d51e9ef2131f96445947b9095c6d241 Mon Sep 17 00:00:00 2001 From: Vula Builder Date: Wed, 29 Jul 2026 19:04:22 +0000 Subject: [PATCH] Deploy --- src/app/api/popular-products/route.ts | 36 +++++++++++++++++++++++++++ 1 file changed, 36 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..60093de --- /dev/null +++ b/src/app/api/popular-products/route.ts @@ -0,0 +1,36 @@ +import { NextRequest, NextResponse } from 'next/server' + +const VULA_URL = process.env.VULA_CMS_URL || 'https://ide.vulai.co.za' +const PROJECT_ID = process.env.VULA_CMS_PROJECT_ID || '' + +let cache: { data: unknown; ts: number } | null = null +const CACHE_TTL = 5 * 60 * 1000 + +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 r = await fetch( + `${VULA_URL}/api/store/${PROJECT_ID}/products?limit=100`, + { cache: 'no-store', signal: AbortSignal.timeout(8000) } + ) + if (!r.ok) return NextResponse.json({ products: [] }, { status: r.status }) + const data = await r.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: 502 }) + } +}