From 385600dd060b9b72f0e452d2e19aabe20f9bf577 Mon Sep 17 00:00:00 2001 From: fbachus Date: Mon, 18 May 2026 23:49:02 +0200 Subject: [PATCH] feat(api_requests): add basic api requests that hand back useless ids --- lib/api_handler.dart | 150 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 5 deletions(-) diff --git a/lib/api_handler.dart b/lib/api_handler.dart index fe24bdf..1a3fec9 100644 --- a/lib/api_handler.dart +++ b/lib/api_handler.dart @@ -11,14 +11,21 @@ class ApiHandler { static final String baseUrl = dotenv.get("VBB_API_URL"); static final String accessID = dotenv.get("VBB_API_KEY"); + // TODO: function calls for the following API calls + // - [x] location.name: findStations + // - [ ] location.nearbystops + // - [ ] location.details + // - [ ] departureBoard + // - [ ] multiDepartureBoard + // - [ ] journeyDetails + //static Future> findStations(String locationName) async { - static Future findStations(String locationName) async { + static Future> findStations(String locationName, {int? maxStations=5}) async { String urlPath = '/api/fahrinfo/latest/location.name'; - String urlParams = '?input=$locationName'; Uri url = Uri.https(baseUrl, urlPath, { 'accessId': accessID, 'input': locationName, - 'maxNo': '2', + 'maxNo': maxStations.toString(), 'type': 'S' // Station/Stops only }); //print(url); @@ -28,9 +35,142 @@ class ApiHandler { }); final httpPackageJson = json.decode(jsonResponse.body) as Map; //print(httpPackageJson["stopLocationOrCoordLocation"]); - final id = httpPackageJson["stopLocationOrCoordLocation"][0]["StopLocation"]["id"]; + final idList = httpPackageJson["stopLocationOrCoordLocation"].map( (x) => x["StopLocation"]["id"]); //print("and now just ids: "); //print(id); - return id; + return idList; + } + + static Future> nearbyStations(String latitude, String longitude, + {int? maxStations=5}) async { + String urlPath = '/api/fahrinfo/latest/location.nearbystops'; + Uri url = Uri.https(baseUrl, urlPath, { + 'accessId': accessID, + 'originCoordLat': latitude, + 'originCoordLong': longitude, + 'maxNo': maxStations.toString(), + 'type': 'S' // Station/Stops only + }); + var jsonResponse = await http.get(url, + headers: { + 'Accept': 'application/json' + }); + final httpPackageJson = json.decode(jsonResponse.body) as Map; + final idList = httpPackageJson["stopLocationOrCoordLocation"].map( (x) => x["StopLocation"]["id"]); + return idList; + } + + static Future> departures(String station, + {int? maxDepartures=-1, int? duration=-1}) async { + String urlPath = '/api/fahrinfo/latest/departureBoard'; + String stationString = station.replaceAll(' ', '%20'); // reform for URL + + Uri url = Uri.https(baseUrl, urlPath, { + 'accessId': accessID, + 'id': stationString, + ////'time': /current time //time from which departures will be shown + 'duration': duration.toString(), //interval time in minutes + 'maxJourneys': maxDepartures.toString(), + 'type': 'S' // Station/Stops only + }); + var jsonResponse = await http.get(url, + headers: { + 'Accept': 'application/json' + }); + final httpPackageJson = json.decode(jsonResponse.body) as Map; + final idList = httpPackageJson["Departure"].map( (x) => x["ProductAtStop"]["num"]); + return idList; + } + + static Future> departuresAggregate(List stationList, + {int? maxDepartures=-1, int? duration=-1}) async { + String urlPath = '/api/fahrinfo/latest/multiDepartureBoard'; + String stationListString = stationList + .reduce((value, element) => value + '|' + element) + .replaceAll(' ', '%20'); // reform for URL + + Uri url = Uri.https(baseUrl, urlPath, { + 'accessId': accessID, + 'id': stationListString, + ////'time': /current time //time from which departures will be shown + 'duration': duration.toString(), //interval time in minutes + 'maxJourneys': maxDepartures.toString(), + 'type': 'S' // Station/Stops only + }); + var jsonResponse = await http.get(url, + headers: { + 'Accept': 'application/json' + }); + final httpPackageJson = json.decode(jsonResponse.body) as Map; + final idList = httpPackageJson["Departure"].map( (x) => x["ProductAtStop"]["num"]); + return idList; + } + + static Future> trip( + String originId, + String destinationId, + { + String? via, + String? viaID, + String? date, + String? time, + int? maxChange, + int? minChangeTime, + int? maxChangeTime, + bool? arrivalTime, + // int? products, // which transport modi to use - ignore for now + // String rtMode, // wherether to use real time data + // String trainFilter, + }) async { + String urlPath = '/api/fahrinfo/latest/trip'; + String startId = originId.replaceAll(' ', '%20'); // reform for URL + String endId = destinationId.replaceAll(' ', '%20'); // reform for URL + + Uri url = Uri.https(baseUrl, urlPath, { + 'accessId': accessID, + 'originId': startId, + 'destId': endId, + ////'time': /current time //time from which departures will be shown + 'time': time.toString(), //interval time in minutes + 'maxChange': maxChange.toString(), + 'type': 'S' // Station/Stops only + }); + var jsonResponse = await http.get(url, + headers: { + 'Accept': 'application/json' + }); + final httpPackageJson = json.decode(jsonResponse.body) as Map; + final idList = httpPackageJson["Trip"].map( + (x) => x["LegList"]["Leg"].map( + (y) => y["JourneyDetail"]["ref"]) + ); + return idList; + + } + + static Future> tripDetail( + String id, + { + String? date, + String? fromId, + int? fromIdx, + String? toId, + int? toIdx + }) async { + + String urlPath = '/api/fahrinfo/latest/journeyDetail'; + Uri url = Uri.https(baseUrl, urlPath, { + 'accessId': accessID, + 'id': id, + 'fromId': fromId, + 'toId': toId, + }); + var jsonResponse = await http.get(url, + headers: { + 'Accept': 'application/json' + }); + final httpPackageJson = json.decode(jsonResponse.body) as Map; + final idList = httpPackageJson["Stops"]["Stop"].map( (x) => x["id"]); + return idList; } }