aboutsummaryrefslogtreecommitdiff
path: root/src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2026-03-15 20:10:35 +0100
committerAriel Costas Guerrero <ariel@costas.dev>2026-03-15 20:10:35 +0100
commitc0e758b1e793159fc86c85916130f8959360c64e (patch)
tree7ecece46af74e324ee9ece7e649191ab28d08d5e /src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs
parent7a52e14912b952f32e7c9d1a70d2e2ba14f9ad1a (diff)
Implement basic real time information for Renfe
Diffstat (limited to 'src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs')
-rw-r--r--src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs b/src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs
new file mode 100644
index 0000000..a2f90d3
--- /dev/null
+++ b/src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs
@@ -0,0 +1,66 @@
+using System.Text.Json;
+using Enmarcha.Backend.Types.Arrivals;
+using Microsoft.Extensions.Caching.Memory;
+
+namespace Enmarcha.Backend.Services.Processors;
+
+public class VitrasaUsageProcessor : IArrivalsProcessor
+{
+ private readonly HttpClient _httpClient;
+ private readonly IMemoryCache _cache;
+ private readonly ILogger<VitrasaUsageProcessor> _logger;
+ private readonly FeedService _feedService;
+
+ public VitrasaUsageProcessor(
+ HttpClient httpClient,
+ IMemoryCache cache,
+ ILogger<VitrasaUsageProcessor> logger,
+ FeedService feedService)
+ {
+ _httpClient = httpClient;
+ _cache = cache;
+ _logger = logger;
+ _feedService = feedService;
+ }
+
+ public async Task ProcessAsync(ArrivalsContext context)
+ {
+ if (!context.StopId.StartsWith("vitrasa:") || context.IsReduced || context.IsNano) return;
+
+ var normalizedCode = _feedService.NormalizeStopCode("vitrasa", context.StopCode);
+
+ var cacheKey = $"vigo_usage_{normalizedCode}";
+ if (_cache.TryGetValue(cacheKey, out List<BusStopUsagePoint>? cachedUsage))
+ {
+ context.Usage = cachedUsage;
+ return;
+ }
+
+ try
+ {
+ using var activity = Telemetry.Source.StartActivity("FetchVigoUsage");
+ var url = $"https://datos.vigo.org/vci_api_app/api2.jsp?tipo=TRANSPORTE_PARADA_HORAS_USO&parada={normalizedCode}";
+ var response = await _httpClient.GetAsync(url);
+
+ if (response.IsSuccessStatusCode)
+ {
+ var json = await response.Content.ReadAsStringAsync();
+ var usage = JsonSerializer.Deserialize<List<BusStopUsagePoint>>(json);
+
+ if (usage != null)
+ {
+ _cache.Set(cacheKey, usage, TimeSpan.FromDays(7));
+ context.Usage = usage;
+ }
+ }
+ else
+ {
+ _logger.LogWarning("Failed to fetch usage data for stop {StopCode}, status: {Status}", normalizedCode, response.StatusCode);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Error fetching usage data for Vigo stop {StopCode}", normalizedCode);
+ }
+ }
+}