aboutsummaryrefslogtreecommitdiff
path: root/src/Costasdev.Busurbano.Backend/Controllers
diff options
context:
space:
mode:
Diffstat (limited to 'src/Costasdev.Busurbano.Backend/Controllers')
-rw-r--r--src/Costasdev.Busurbano.Backend/Controllers/ArrivalsController.cs68
1 files changed, 56 insertions, 12 deletions
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<ArrivalsController> _logger;
private readonly IMemoryCache _cache;
@@ -25,9 +28,16 @@ public class ArrivalsController : ControllerBase
}
[HttpGet("arrivals")]
- public async Task<IActionResult> GetArrivals(string id)
+ public async Task<IActionResult> 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<GraphClientResponse<ArrivalsAtStopResponse>>();
- 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<Arrival> 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);
}