api/locationInformationRequest.ts (view raw)
1import { get } from "../lib/func.ts";
2import { getLocationInformationRequest } from "./api.ts";
3
4export const findStops = async (
5 input: string | Coordinates
6): Promise<Stop[]> => {
7 const textInput = typeof input === "string" ? input : undefined;
8 const coordinates = isCoordinates(input) ? input : undefined;
9 const { result } = await getLocationInformationRequest(
10 textInput,
11 coordinates
12 );
13 const placeResult = get<object[] | { Place: object }>(
14 result,
15 "OJP.OJPResponse.siri:ServiceDelivery.OJPLocationInformationDelivery.PlaceResult"
16 );
17 if (!placeResult) return [];
18 else if (Array.isArray(placeResult))
19 return placeResult.map(formatPlace).filter(uniqStopFilter);
20 else if (placeResult.Place) return [formatPlace(placeResult)];
21 else return [];
22};
23
24const isCoordinates = (input: string | Coordinates) =>
25 typeof input === "object" && "latitude" in input && "longitude" in input;
26
27const formatPlace = (item: object): Stop => ({
28 name: get(item, "Place.StopPlace.StopPlaceName.Text.#text"),
29 stopRef: get(item, "Place.StopPlace.StopPlaceRef"),
30 geoPosition: {
31 latitude: get(item, "Place.GeoPosition.siri:Latitude"),
32 longitude: get(item, "Place.GeoPosition.siri:Longitude"),
33 },
34});
35
36const uniqStopFilter = (stop: Stop, index: number, arr: Stop[]) => {
37 const itemIndex = arr.findIndex(s => s.stopRef === stop.stopRef);
38 return itemIndex === index;
39};