From 97908d274ee12eb2301fadd5fc445d0f79479a56 Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Sat, 4 Apr 2026 15:44:41 +0200 Subject: Enhance arrival and transit functionality with new vehicle operation logic and transit kind classification --- .../Controllers/ArrivalsController.cs | 28 +++++++++++++--- src/Enmarcha.Backend/Controllers/TileController.cs | 13 +------- .../Helpers/TransitKindClassifier.cs | 38 ++++++++++++++++++++++ 3 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 src/Enmarcha.Backend/Helpers/TransitKindClassifier.cs (limited to 'src/Enmarcha.Backend') diff --git a/src/Enmarcha.Backend/Controllers/ArrivalsController.cs b/src/Enmarcha.Backend/Controllers/ArrivalsController.cs index 16bc047..7feeee0 100644 --- a/src/Enmarcha.Backend/Controllers/ArrivalsController.cs +++ b/src/Enmarcha.Backend/Controllers/ArrivalsController.cs @@ -140,6 +140,15 @@ public partial class ArrivalsController : ControllerBase return Ok(new StopEstimatesResponse { Arrivals = estimates }); } + private static VehicleOperation GetVehicleOperation(ArrivalsAtStopResponse.PickupType pickup, ArrivalsAtStopResponse.PickupType dropoff) + { + if (pickup == ArrivalsAtStopResponse.PickupType.None && dropoff == ArrivalsAtStopResponse.PickupType.None) return VehicleOperation.PickupDropoff; + if (pickup != ArrivalsAtStopResponse.PickupType.None && dropoff != ArrivalsAtStopResponse.PickupType.None) return VehicleOperation.PickupDropoff; + if (pickup != ArrivalsAtStopResponse.PickupType.None) return VehicleOperation.PickupOnly; + if (dropoff != ArrivalsAtStopResponse.PickupType.None) return VehicleOperation.DropoffOnly; + return VehicleOperation.PickupDropoff; + } + private async Task<(ArrivalsAtStopResponse.StopItem Stop, ArrivalsContext Context)?> FetchAndProcessArrivalsAsync( string id, bool reduced, bool nano) { @@ -168,11 +177,21 @@ public partial class ArrivalsController : ControllerBase List arrivals = []; foreach (var item in stop.Arrivals) { - if (item.PickupTypeParsed.Equals(ArrivalsAtStopResponse.PickupType.None)) continue; + //if (item.PickupTypeParsed.Equals(ArrivalsAtStopResponse.PickupType.None)) continue; + //if ( + // item.Trip.ArrivalStoptime.Stop.GtfsId == id && + // item.Trip.DepartureStoptime.Stop.GtfsId != id + //) continue; + + // Delete loop routes that aren't starting here if ( item.Trip.ArrivalStoptime.Stop.GtfsId == id && - item.Trip.DepartureStoptime.Stop.GtfsId != id - ) continue; + item.Trip.DepartureStoptime.Stop.GtfsId == id && + item.StopPosition != 1 + ) + { + continue; + } var serviceDayLocal = TimeZoneInfo.ConvertTime(DateTimeOffset.FromUnixTimeSeconds(item.ServiceDay), tz); var departureTime = serviceDayLocal.Date.AddSeconds(item.ScheduledDepartureSeconds); @@ -195,7 +214,8 @@ public partial class ArrivalsController : ControllerBase Precision = departureTime < nowLocal.AddMinutes(-1) ? ArrivalPrecision.Past : ArrivalPrecision.Scheduled }, Operator = feedId == "xunta" ? item.Trip.Route.Agency?.Name : null, - RawOtpTrip = item + RawOtpTrip = item, + Operation = GetVehicleOperation(item.PickupTypeParsed, item.DropoffTypeParsed) }); } diff --git a/src/Enmarcha.Backend/Controllers/TileController.cs b/src/Enmarcha.Backend/Controllers/TileController.cs index 5ef8dd6..b419dee 100644 --- a/src/Enmarcha.Backend/Controllers/TileController.cs +++ b/src/Enmarcha.Backend/Controllers/TileController.cs @@ -127,7 +127,7 @@ public class TileController : ControllerBase { "code", $"{idParts[0]}:{codeWithinFeed}" }, { "name", FeedService.NormalizeStopName(feedId, stop.Name) }, { "icon", GetIconNameForFeed(feedId) }, - { "transitKind", GetTransitKind(feedId) } + { "transitKind", TransitKindClassifier.StringByFeed(feedId) } } }; @@ -172,17 +172,6 @@ public class TileController : ControllerBase }; } - private string GetTransitKind(string feedId) - { - return feedId switch - { - "vitrasa" or "tussa" or "tranvias" or "shuttle" or "ourense" => "bus", - "xunta" => "coach", - "renfe" or "feve" => "train", - _ => "unknown" - }; - } - private List GetDistinctRoutes(string feedId, List routes) { List distinctRoutes = []; diff --git a/src/Enmarcha.Backend/Helpers/TransitKindClassifier.cs b/src/Enmarcha.Backend/Helpers/TransitKindClassifier.cs new file mode 100644 index 0000000..5caf9fc --- /dev/null +++ b/src/Enmarcha.Backend/Helpers/TransitKindClassifier.cs @@ -0,0 +1,38 @@ +using System.Text.Json.Serialization; + +namespace Enmarcha.Backend.Helpers; + +public class TransitKindClassifier +{ + public static TransitKind KindByFeed(string feedId) + { + return feedId switch + { + "vitrasa" or "tussa" or "tranvias" or "shuttle" or "ourense" => TransitKind.Bus, + "xunta" => TransitKind.Coach, + "renfe" or "feve" => TransitKind.Train, + _ => TransitKind.Unknown + }; + } + + public static string StringByFeed(string feedId) + { + var kind = KindByFeed(feedId); + return kind switch + { + TransitKind.Bus => "bus", + TransitKind.Coach => "coach", + TransitKind.Train => "train", + TransitKind.Unknown => "unknown", + _ => throw new ArgumentOutOfRangeException(nameof(kind), kind, null) + }; + } +} + +public enum TransitKind +{ + [JsonStringEnumMemberName("bus")] Bus, + [JsonStringEnumMemberName("coach")] Coach, + [JsonStringEnumMemberName("train")] Train, + [JsonStringEnumMemberName("unknown")] Unknown +} -- cgit v1.3