aboutsummaryrefslogtreecommitdiff
path: root/src/Costasdev.Busurbano.Backend/Controllers
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-11-30 19:17:02 +0100
committerAriel Costas Guerrero <ariel@costas.dev>2025-11-30 19:17:02 +0100
commitcee521142a4e0673b155d97c3e4825b7fec1987f (patch)
treee8030687f62a63c34ad69cb81eefe8470c55cfee /src/Costasdev.Busurbano.Backend/Controllers
parente7283ba10d45b42e1274cd13c3d6aabec57c85b4 (diff)
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.
Diffstat (limited to 'src/Costasdev.Busurbano.Backend/Controllers')
-rw-r--r--src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs78
-rw-r--r--src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs79
2 files changed, 80 insertions, 77 deletions
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<IActionResult> 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<IActionResult> 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<List<ScheduledStop>>(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<VigoController> _logger;
private readonly VigoTransitApiClient _api;
@@ -29,23 +28,6 @@ public class VigoController : ControllerBase
_shapeService = shapeService;
}
- [HttpGet("GetStopEstimates")]
- public async Task<IActionResult> 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<IActionResult> GetShape(
[FromQuery] string shapeId,
@@ -124,56 +106,6 @@ public class VigoController : ControllerBase
return Ok(geoJson);
}
- [HttpGet("GetStopTimetable")]
- public async Task<IActionResult> 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<List<ScheduledStop>>(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<IActionResult> 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