frontend/pages/api/mapbox/places.ts (view raw)
1import type {NextApiRequest, NextApiResponse} from 'next';
2
3type ResponseData = Array<{place_name: string; center: [number, number]}>;
4
5const {MAPBOX_TOKEN, MAPBOX_URL} = process.env;
6
7export default async function handler(
8 req: NextApiRequest,
9 res: NextApiResponse<ResponseData>
10) {
11 const {search, proximity = 'ip', locale} = req.query;
12 if (!search) return res.status(400);
13 else if (!MAPBOX_TOKEN) {
14 console.warn('No MAPBOX_TOKEN provided');
15 return res.status(500);
16 }
17
18 const url = `${MAPBOX_URL}geocoding/v5/mapbox.places/${search}.json?proximity=${proximity}&access_token=${MAPBOX_TOKEN}&language=${locale}`;
19
20 try {
21 const mapBoxResult = await fetch(url).then(response => {
22 if (response.status === 429)
23 throw new Error('MAPBOX_RATE_LIMIT_EXCEEDED');
24 else if (response.status === 401) throw new Error('MAPBOX_UNAUTHORIZED');
25 return response.json();
26 });
27
28 if (mapBoxResult?.features) {
29 res.status(200).send(mapBoxResult.features);
30 return;
31 } else throw new Error('MAPBOX_MALFORMED_RESPONSE');
32 } catch (error) {
33 console.error(error);
34 res.status(500);
35 }
36}