Add route-explorer.com integration: connection finder + departures board
- RouteExplorerClient: anonymous HMAC token (route-explorer.com/api/token,
IP rate-limited 10/min), POST /api/flight-search with X-API-Token; auto
retry on 401/403 token rotation. Wraps the SuperJSON {json:{...}} envelope
for the upstream tRPC endpoints.
- RouteExplorerModels: Codable types for /route, /departures responses
(RouteConnection, RouteFlight, cabins, appendix). Custom ISO-8601
decoder for the dateTime-with-offset timestamps. Bridge helper
RouteFlight.toFlightSchedule(...) so route-explorer legs reuse the
existing FlightLoadDetailView and AirlineLoadService flow for
supported carriers (UA/AA/NK/KE/B6/AS/EK/XE).
- RoutePlannerView: feature (a) — direct + multi-stop A→B routing via
/route with maxStops 0/1/2, sortBy departure_time/duration, optional
interline-only filter. Renders one ConnectionRow per itinerary with
chained legs and layover indicators.
- WhereToGoView: feature (b) — "where can I go" departures board for an
airport over a 2/4/6/12/24h window. Capacity pills (F/J/W/Y), color-
coded countdown, cross-midnight rollover. Tap any leg → load detail.
- IATAAirportPicker: lightweight local-only picker against
AirportDatabase (no flightconnections roundtrip needed since
route-explorer keys on IATA, not FC IDs).
- ContentView: two new entry-point cards (Find Connections, Where can I
go?) above the favorites list.
- api_docs/route_explorer_api.md + captures: full endpoint reference and
representative response samples (DFW→LAS direct, DFW→KOA 1-stop,
LBB→KOA 2-stop, AA2178 schedule, DFW departures).
No tests yet — project has no test target and adding TDD would require
scaffolding XCTest first. Worth backfilling tests for the date decoder,
layover math, and toFlightSchedule bridge using the saved fixtures.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"json": {
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-05-01T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-05-01T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_05_01",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user