From c0e758b1e793159fc86c85916130f8959360c64e Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Sun, 15 Mar 2026 20:10:35 +0100 Subject: Implement basic real time information for Renfe --- .../Services/Processors/VitrasaUsageProcessor.cs | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs (limited to 'src/Enmarcha.Backend/Services/Processors/VitrasaUsageProcessor.cs') 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 _logger; + private readonly FeedService _feedService; + + public VitrasaUsageProcessor( + HttpClient httpClient, + IMemoryCache cache, + ILogger 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? 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¶da={normalizedCode}"; + var response = await _httpClient.GetAsync(url); + + if (response.IsSuccessStatusCode) + { + var json = await response.Content.ReadAsStringAsync(); + var usage = JsonSerializer.Deserialize>(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); + } + } +} -- cgit v1.3