From 3850cea0e8f8337d823003af3dce430c96c52842 Mon Sep 17 00:00:00 2001 From: fbachus Date: Tue, 21 Jul 2026 03:11:56 +0200 Subject: [PATCH] feat(api_handler): return proper objects using transport_helper many "changes" due to formatter :/ --- lib/api_handler.dart | 198 +++++++++++++++++++++++++------------------ 1 file changed, 117 insertions(+), 81 deletions(-) diff --git a/lib/api_handler.dart b/lib/api_handler.dart index 1a3fec9..2851627 100644 --- a/lib/api_handler.dart +++ b/lib/api_handler.dart @@ -20,50 +20,66 @@ class ApiHandler { // - [ ] journeyDetails //static Future> findStations(String locationName) async { - static Future> findStations(String locationName, {int? maxStations=5}) async { + static Future> findStations( + String locationName, { + int? maxStations = 5, + }) async { String urlPath = '/api/fahrinfo/latest/location.name'; Uri url = Uri.https(baseUrl, urlPath, { 'accessId': accessID, 'input': locationName, 'maxNo': maxStations.toString(), - 'type': 'S' // Station/Stops only + 'type': 'S', // Station/Stops only }); //print(url); - var jsonResponse = await http.get(url, - headers: { - 'Accept': 'application/json' - }); - final httpPackageJson = json.decode(jsonResponse.body) as Map; + var jsonResponse = await http.get( + url, + headers: {'Accept': 'application/json'}, + ); + final httpPackageJson = + json.decode(jsonResponse.body) as Map; //print(httpPackageJson["stopLocationOrCoordLocation"]); - final idList = httpPackageJson["stopLocationOrCoordLocation"].map( (x) => x["StopLocation"]["id"]); - //print("and now just ids: "); - //print(id); - return idList; + List stationList = httpPackageJson["stopLocationOrCoordLocation"] + .map( + (x) => Station.fromJson(x["StopLocation"]), + ) + .toList() + .cast(); + return stationList; } - static Future> nearbyStations(String latitude, String longitude, - {int? maxStations=5}) async { + 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 + '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; + var jsonResponse = await http.get( + url, + headers: {'Accept': 'application/json'}, + ); + final httpPackageJson = + json.decode(jsonResponse.body) as Map; + final stationList = httpPackageJson["stopLocationOrCoordLocation"].map( + (x) => Station.fromJson(x["StopLocation"]), + ); + return stationList; } - static Future> departures(String station, - {int? maxDepartures=-1, int? duration=-1}) async { + static Future> departures( + String stationId, { + int? maxDepartures = -1, + int? duration = 0, + }) async { String urlPath = '/api/fahrinfo/latest/departureBoard'; - String stationString = station.replaceAll(' ', '%20'); // reform for URL + String stationString = stationId.replaceAll(' ', '%20'); // reform for URL Uri url = Uri.https(baseUrl, urlPath, { 'accessId': accessID, @@ -71,19 +87,39 @@ class ApiHandler { ////'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 + //'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; + var jsonResponse = await http.get( + url, + headers: {'Accept': 'application/json'}, + ); + final httpPackageJson = + json.decode(jsonResponse.body) as Map; + + // try { + List departureList = httpPackageJson["Departure"] + .map( + (x) => Departure.fromJson(x), + ) + .toList() + .cast(); + return departureList; + // } catch (e) { + // // TODO: logging + // // empty response + // print('Error: $e'); + // // print( + // // 'Response for Station-id "$stationString" contains no field "Departure": $httpPackageJson', + // // ); + // return []; + // } } - static Future> departuresAggregate(List stationList, - {int? maxDepartures=-1, int? duration=-1}) async { + 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) @@ -95,33 +131,35 @@ class ApiHandler { ////'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 + '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; + var jsonResponse = await http.get( + url, + headers: {'Accept': 'application/json'}, + ); + final httpPackageJson = + json.decode(jsonResponse.body) as Map; + List departureList = httpPackageJson["Departure"].map( + (x) => Departure.fromJson(x), + ); + return departureList; } 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 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 @@ -133,31 +171,28 @@ class ApiHandler { ////'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 + 'type': 'S', // Station/Stops only }); - var jsonResponse = await http.get(url, - headers: { - 'Accept': 'application/json' - }); - final httpPackageJson = json.decode(jsonResponse.body) as Map; + 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"]) + (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 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, @@ -165,12 +200,13 @@ class ApiHandler { '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"]); + 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; } }