From cee521142a4e0673b155d97c3e4825b7fec1987f Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Sun, 30 Nov 2025 19:17:02 +0100 Subject: Refactor street name processing and remove unused stop downloader script - Updated `street_name.py` to simplify street name handling by removing the `re_remove_street_type` regex and exception streets list, replacing them with a dictionary for name replacements. - Deleted the `download-stops.py` script from the Santiago stop downloader, which was no longer needed. - Removed the empty `.gitkeep` file from the overrides directory. - Added a new `VigoController` class to handle stop estimates and timetables, including error handling for missing data. - Introduced `LineFormatterService` to format circulation routes based on specific line conditions. --- .../Controllers/VigoController.Legacy.cs | 78 +++++++++++++++++++++ .../Controllers/VigoController.cs | 79 +--------------------- 2 files changed, 80 insertions(+), 77 deletions(-) create mode 100644 src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs (limited to 'src/Costasdev.Busurbano.Backend/Controllers') diff --git a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs new file mode 100644 index 0000000..3bb9930 --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs @@ -0,0 +1,78 @@ +using System.Globalization; +using System.Text.Json; +using Costasdev.Busurbano.Backend.Types; +using Microsoft.AspNetCore.Mvc; +using SysFile = System.IO.File; + +namespace Costasdev.Busurbano.Backend.Controllers; + +public partial class VigoController : ControllerBase +{ + [HttpGet("GetStopEstimates")] + public async Task Run( + [FromQuery] int id + ) + { + try + { + var response = await _api.GetStopEstimates(id); + // Return only the estimates array, not the stop metadata + return new OkObjectResult(response.Estimates); + } + catch (InvalidOperationException) + { + return BadRequest("Stop not found"); + } + } + + [HttpGet("GetStopTimetable")] + public async Task GetStopTimetable( + [FromQuery] int stopId, + [FromQuery] string? date = null +) + { + // Use Europe/Madrid timezone to determine the correct date + var tz = TimeZoneInfo.FindSystemTimeZoneById("Europe/Madrid"); + var nowLocal = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz); + + // If no date provided or date is "today", use Madrid timezone's current date + string effectiveDate; + if (string.IsNullOrEmpty(date) || date == "today") + { + effectiveDate = nowLocal.Date.ToString("yyyy-MM-dd"); + } + else + { + // Validate provided date format + if (!DateTime.TryParseExact(date, "yyyy-MM-dd", null, DateTimeStyles.None, out _)) + { + return BadRequest("Invalid date format. Please use yyyy-MM-dd format."); + } + effectiveDate = date; + } + + try + { + var file = Path.Combine(_configuration.ScheduleBasePath, effectiveDate, stopId + ".json"); + if (!SysFile.Exists(file)) + { + throw new FileNotFoundException(); + } + + var contents = await SysFile.ReadAllTextAsync(file); + + return new OkObjectResult(JsonSerializer.Deserialize>(contents)!); + } + catch (FileNotFoundException ex) + { + _logger.LogError(ex, "Stop data not found for stop {StopId} on date {Date}", stopId, effectiveDate); + return StatusCode(404, $"Stop data not found for stop {stopId} on date {effectiveDate}"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error loading stop data"); + return StatusCode(500, "Error loading timetable"); + } + } + +} diff --git a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs index 1d9e519..a6aafe8 100644 --- a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs +++ b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs @@ -1,6 +1,5 @@ using System.Globalization; using System.Text; -using System.Text.Json; using Costasdev.Busurbano.Backend.Configuration; using Costasdev.Busurbano.Backend.Services; using Costasdev.Busurbano.Backend.Types; @@ -14,7 +13,7 @@ namespace Costasdev.Busurbano.Backend.Controllers; [ApiController] [Route("api/vigo")] -public class VigoController : ControllerBase +public partial class VigoController : ControllerBase { private readonly ILogger _logger; private readonly VigoTransitApiClient _api; @@ -29,23 +28,6 @@ public class VigoController : ControllerBase _shapeService = shapeService; } - [HttpGet("GetStopEstimates")] - public async Task Run( - [FromQuery] int id - ) - { - try - { - var response = await _api.GetStopEstimates(id); - // Return only the estimates array, not the stop metadata - return new OkObjectResult(response.Estimates); - } - catch (InvalidOperationException) - { - return BadRequest("Stop not found"); - } - } - [HttpGet("GetShape")] public async Task GetShape( [FromQuery] string shapeId, @@ -124,56 +106,6 @@ public class VigoController : ControllerBase return Ok(geoJson); } - [HttpGet("GetStopTimetable")] - public async Task GetStopTimetable( - [FromQuery] int stopId, - [FromQuery] string? date = null - ) - { - // Use Europe/Madrid timezone to determine the correct date - var tz = TimeZoneInfo.FindSystemTimeZoneById("Europe/Madrid"); - var nowLocal = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz); - - // If no date provided or date is "today", use Madrid timezone's current date - string effectiveDate; - if (string.IsNullOrEmpty(date) || date == "today") - { - effectiveDate = nowLocal.Date.ToString("yyyy-MM-dd"); - } - else - { - // Validate provided date format - if (!DateTime.TryParseExact(date, "yyyy-MM-dd", null, DateTimeStyles.None, out _)) - { - return BadRequest("Invalid date format. Please use yyyy-MM-dd format."); - } - effectiveDate = date; - } - - try - { - var file = Path.Combine(_configuration.ScheduleBasePath, effectiveDate, stopId + ".json"); - if (!SysFile.Exists(file)) - { - throw new FileNotFoundException(); - } - - var contents = await SysFile.ReadAllTextAsync(file); - - return new OkObjectResult(JsonSerializer.Deserialize>(contents)!); - } - catch (FileNotFoundException ex) - { - _logger.LogError(ex, "Stop data not found for stop {StopId} on date {Date}", stopId, effectiveDate); - return StatusCode(404, $"Stop data not found for stop {stopId} on date {effectiveDate}"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error loading stop data"); - return StatusCode(500, "Error loading timetable"); - } - } - [HttpGet("GetConsolidatedCirculations")] public async Task GetConsolidatedCirculations( [FromQuery] int stopId @@ -415,6 +347,7 @@ public class VigoController : ControllerBase // Sort by ETA (RealTime minutes if present; otherwise Schedule minutes) var sorted = consolidatedCirculations .OrderBy(c => c.RealTime?.Minutes ?? c.Schedule!.Minutes) + .Select(LineFormatterService.Format) .ToList(); return Ok(sorted); @@ -452,7 +385,6 @@ public class VigoController : ControllerBase var normalized = route.Trim().ToLowerInvariant(); // Remove diacritics/accents first, then filter to alphanumeric normalized = RemoveDiacritics(normalized); - normalized = RenameCustom(normalized); return new string(normalized.Where(char.IsLetterOrDigit).ToArray()); } @@ -472,13 +404,6 @@ public class VigoController : ControllerBase return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } - - private static string RenameCustom(string text) - { - // Custom replacements for known problematic route names - return text - .Replace("praza", "p"); - } } public static class StopScheduleExtensions -- cgit v1.3