From 4b7eaa318f22d7cc768491c421cb7aeac477f95d Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Mon, 22 Dec 2025 18:16:57 +0100 Subject: Implement retrieving next arrivals for a stop (scheduled only) --- .../Controllers/ArrivalsController.cs | 68 ++++++++++++++++++---- 1 file changed, 56 insertions(+), 12 deletions(-) (limited to 'src/Costasdev.Busurbano.Backend/Controllers') diff --git a/src/Costasdev.Busurbano.Backend/Controllers/ArrivalsController.cs b/src/Costasdev.Busurbano.Backend/Controllers/ArrivalsController.cs index eb81784..5dee48d 100644 --- a/src/Costasdev.Busurbano.Backend/Controllers/ArrivalsController.cs +++ b/src/Costasdev.Busurbano.Backend/Controllers/ArrivalsController.cs @@ -1,13 +1,16 @@ -using Costasdev.Busurbano.Backend.GraphClient; +using System.Net; +using Costasdev.Busurbano.Backend.GraphClient; using Costasdev.Busurbano.Backend.GraphClient.App; +using Costasdev.Busurbano.Backend.Types; +using Costasdev.Busurbano.Backend.Types.Arrivals; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; namespace Costasdev.Busurbano.Backend.Controllers; [ApiController] -[Route("api")] -public class ArrivalsController : ControllerBase +[Route("api/stops")] +public partial class ArrivalsController : ControllerBase { private readonly ILogger _logger; private readonly IMemoryCache _cache; @@ -25,9 +28,16 @@ public class ArrivalsController : ControllerBase } [HttpGet("arrivals")] - public async Task GetArrivals(string id) + public async Task GetArrivals( + [FromQuery] string id, + [FromQuery] bool reduced + ) { - var requestContent = ArrivalsAtStopContent.Query(id); + var tz = TimeZoneInfo.FindSystemTimeZoneById("Europe/Madrid"); + var nowLocal = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz); + var todayLocal = nowLocal.Date; + + var requestContent = ArrivalsAtStopContent.Query(new(id, reduced ? 4 : 10)); var request = new HttpRequestMessage(HttpMethod.Post, "http://100.67.54.115:3957/otp/gtfs/v1"); request.Content = JsonContent.Create(new GraphClientRequest { @@ -37,16 +47,50 @@ public class ArrivalsController : ControllerBase var response = await _httpClient.SendAsync(request); var responseBody = await response.Content.ReadFromJsonAsync>(); - if (responseBody is not { IsSuccess: true }) + if (responseBody is not { IsSuccess: true } || responseBody.Data?.Stop == null) { - _logger.LogError( - "Error fetching stop data, received {StatusCode} {ResponseBody}", - response.StatusCode, - await response.Content.ReadAsStringAsync() - ); + LogErrorFetchingStopData(response.StatusCode, await response.Content.ReadAsStringAsync()); return StatusCode(500, "Error fetching stop data"); } - return Ok(responseBody.Data?.Stop); + var stop = responseBody.Data.Stop; + List arrivals = []; + foreach (var item in stop.Arrivals) + { + var departureTime = todayLocal.AddSeconds(item.ScheduledDepartureSeconds); + var minutesToArrive = (int)(departureTime - nowLocal).TotalMinutes; + //var isRunning = departureTime < nowLocal; + + Arrival arrival = new() + { + Route = new RouteInfo + { + ShortName = item.Trip.RouteShortName, + Colour = item.Trip.Route.Color, + TextColour = item.Trip.Route.TextColor + }, + Headsign = new HeadsignInfo + { + Destination = item.Headsign + }, + Estimate = new ArrivalDetails + { + Minutes = minutesToArrive, + Precission = departureTime < nowLocal ? ArrivalPrecission.Past : ArrivalPrecission.Scheduled + } + }; + + arrivals.Add(arrival); + } + + return Ok(new StopArrivalsResponse + { + StopCode = stop.Code, + StopName = stop.Name, + Arrivals = arrivals + }); } + + [LoggerMessage(LogLevel.Error, "Error fetching stop data, received {statusCode} {responseBody}")] + partial void LogErrorFetchingStopData(HttpStatusCode statusCode, string responseBody); } -- cgit v1.3