import { NextRequest, NextResponse } from "next/server"; import { isValidTripImageName, readTripImage } from "@/lib/trip-image-storage"; export const runtime = "nodejs"; interface RouteCtx { params: Promise<{ name: string }>; } /** * Sajikan gambar trip dari disk lokal. Publik — gambar trip memang tampil ke * semua pengunjung. Di-cache `immutable` selama setahun: nama file * content-addressed (hex acak), jadi konten untuk satu nama tidak pernah * berubah. Beban render = baca file kecil dari disk, tanpa fetch eksternal. */ export async function GET(_req: NextRequest, ctx: RouteCtx) { const { name } = await ctx.params; if (!isValidTripImageName(name)) { return NextResponse.json({ error: "Tidak ditemukan" }, { status: 404 }); } let data: Buffer; try { data = await readTripImage(name); } catch { return NextResponse.json({ error: "Tidak ditemukan" }, { status: 404 }); } return new NextResponse(new Uint8Array(data), { status: 200, headers: { "Content-Type": "image/webp", "Content-Length": String(data.length), "Cache-Control": "public, max-age=31536000, immutable", "X-Content-Type-Options": "nosniff", }, }); }