all repos — caroster @ b596a3ef1fd2408b7576af9f2db2b9abb7aeb041

[Octree] Group carpool to your event https://caroster.io

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 response = await fetch(url);
22    if (response.status === 429) throw new Error('MAPBOX_RATE_LIMIT_EXCEEDED');
23    else if (response.status === 401) throw new Error('MAPBOX_UNAUTHORIZED');
24    const mapBoxResult = await response.json();
25    if (mapBoxResult?.features)
26      return res.status(200).send(mapBoxResult.features);
27    else {
28      console.warn('MALFORMED RESPONSE FROM MAPBOX', mapBoxResult);
29      throw new Error('MAPBOX_MALFORMED_RESPONSE');
30    }
31  } catch (error) {
32    console.error('ERROR WITH MAPBOX: ', error.message);
33    res.status(500);
34  }
35}