38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { cacheGet, cacheSet } from "@/lib/cache";
|
|
import type { GeofabrikIndex } from "@transportationer/shared";
|
|
|
|
export const runtime = "nodejs";
|
|
|
|
const GEOFABRIK_INDEX_URL = "https://download.geofabrik.de/index-v1.json";
|
|
const CACHE_KEY = "geofabrik:index";
|
|
|
|
export async function GET() {
|
|
const cached = await cacheGet<GeofabrikIndex>(CACHE_KEY);
|
|
if (cached) {
|
|
return NextResponse.json(cached, { headers: { "X-Cache": "HIT" } });
|
|
}
|
|
|
|
let data: GeofabrikIndex;
|
|
try {
|
|
const res = await fetch(GEOFABRIK_INDEX_URL, {
|
|
headers: { "User-Agent": "Transportationer/1.0 15-min-city-analyzer" },
|
|
signal: AbortSignal.timeout(30_000),
|
|
});
|
|
if (!res.ok) {
|
|
return NextResponse.json(
|
|
{ error: `Geofabrik returned ${res.status}` },
|
|
{ status: 502 },
|
|
);
|
|
}
|
|
data = await res.json();
|
|
} catch (err) {
|
|
return NextResponse.json(
|
|
{ error: "Failed to fetch Geofabrik index", detail: String(err) },
|
|
{ status: 502 },
|
|
);
|
|
}
|
|
|
|
await cacheSet(CACHE_KEY, data, "GEOFABRIK_INDEX");
|
|
return NextResponse.json(data, { headers: { "X-Cache": "MISS" } });
|
|
}
|