29 lines
990 B
TypeScript
29 lines
990 B
TypeScript
|
|
import { NextResponse, type NextRequest } from "next/server";
|
||
|
|
import { reversePlace, searchPlaces } from "@/lib/weather/geocode";
|
||
|
|
import { badRequest, errorResponse, forbidCrossSite, parseCoords } from "@/lib/weather/respond";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* GET /api/geocode?q=Burnsville → Place[] (search by name)
|
||
|
|
* GET /api/geocode?lat=44.7&lon=-93.2 → Place (name for coordinates)
|
||
|
|
*/
|
||
|
|
export async function GET(request: NextRequest) {
|
||
|
|
const blocked = forbidCrossSite(request);
|
||
|
|
if (blocked) return blocked;
|
||
|
|
|
||
|
|
const params = request.nextUrl.searchParams;
|
||
|
|
const query = params.get("q")?.trim();
|
||
|
|
|
||
|
|
try {
|
||
|
|
if (query) {
|
||
|
|
if (query.length < 2) return NextResponse.json([]);
|
||
|
|
return NextResponse.json(await searchPlaces(query));
|
||
|
|
}
|
||
|
|
|
||
|
|
const coords = parseCoords(params);
|
||
|
|
if (!coords) return badRequest("Pass either q, or lat and lon");
|
||
|
|
return NextResponse.json(await reversePlace(coords.lat, coords.lon));
|
||
|
|
} catch (error) {
|
||
|
|
return errorResponse(error);
|
||
|
|
}
|
||
|
|
}
|