| | | 1 | | using Microsoft.Extensions.Caching.Memory; |
| | | 2 | | using Services.ApiServices.FidApi; |
| | | 3 | | using Services.ApiServices.FidApi.Models; |
| | | 4 | | using Services.SystemMonitoringServices; |
| | | 5 | | |
| | | 6 | | namespace Services.FidSupplierLinkServices; |
| | | 7 | | |
| | | 8 | | public sealed class FidSuppliersFeedCache |
| | | 9 | | { |
| | | 10 | | private const string CacheKey = "fid_suppliers_v1"; |
| | | 11 | | private readonly IMemoryCache _cache; |
| | | 12 | | private readonly FidApiDataManager _fid; |
| | | 13 | | private readonly ISystemMonitoringSignalWriter? _signals; |
| | | 14 | | |
| | 34 | 15 | | public FidSuppliersFeedCache(IMemoryCache cache, FidApiDataManager fid, ISystemMonitoringSignalWriter? signals = nul |
| | | 16 | | { |
| | 34 | 17 | | _cache = cache; |
| | 34 | 18 | | _fid = fid; |
| | 34 | 19 | | _signals = signals; |
| | 34 | 20 | | } |
| | | 21 | | |
| | | 22 | | public async Task<(FidSuppliers? Feed, string? Error)> GetAsync(bool forceRefresh = false, CancellationToken ct = de |
| | | 23 | | { |
| | 17 | 24 | | if (!forceRefresh && _cache.TryGetValue(CacheKey, out FidSuppliers? cached) && cached is not null) |
| | 1 | 25 | | return (cached, null); |
| | | 26 | | try |
| | | 27 | | { |
| | 16 | 28 | | var feed = await _fid.GetSuppliersAsync(includeDisabled: true, ct); |
| | 14 | 29 | | if (feed is null) |
| | | 30 | | { |
| | 1 | 31 | | await (_signals?.RecordAsync("fid-suppliers-load", "failure", message: "Фид-сервис не вернул список пост |
| | 1 | 32 | | return (null, "Фид-сервис не вернул список поставщиков."); |
| | | 33 | | } |
| | 13 | 34 | | _cache.Set(CacheKey, feed, TimeSpan.FromMinutes(5)); |
| | 13 | 35 | | await (_signals?.RecordAsync("fid-suppliers-load", "success", cancellationToken: ct) ?? Task.CompletedTask); |
| | 13 | 36 | | return (feed, null); |
| | | 37 | | } |
| | | 38 | | catch (Exception ex) |
| | | 39 | | { |
| | 2 | 40 | | await (_signals?.RecordAsync("fid-suppliers-load", "failure", message: "Фид-сервис недоступен", cancellation |
| | 2 | 41 | | return (null, $"Фид-сервис недоступен: {ex.Message}"); |
| | | 42 | | } |
| | 17 | 43 | | } |
| | | 44 | | } |