fifteen/apps/web/app/api/admin/geofabrik/route.ts
2026-03-01 21:58:53 +01:00

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" } });
}