| | | 1 | | using Services.ApiServices.FidApi; |
| | | 2 | | |
| | | 3 | | namespace Services.FeedPriceServices; |
| | | 4 | | |
| | | 5 | | /// <summary>Читает цену и остатки через публичный API фид-сервиса, не обращаясь к его PostgreSQL.</summary> |
| | | 6 | | public sealed class FidApiFeedPriceReader : IFeedPriceReader |
| | | 7 | | { |
| | | 8 | | private readonly FidApiDataManager _fidApi; |
| | | 9 | | |
| | 2 | 10 | | public FidApiFeedPriceReader(FidApiDataManager fidApi) => _fidApi = fidApi; |
| | | 11 | | |
| | | 12 | | public async Task<FeedPriceSnapshot> GetAsync( |
| | | 13 | | IReadOnlyCollection<string> articleKeys, |
| | | 14 | | int runsPerCabinet, |
| | | 15 | | CancellationToken ct = default) |
| | | 16 | | { |
| | 1 | 17 | | var response = await _fidApi.GetPriceStockAsync(articleKeys, runsPerCabinet, ct) |
| | 1 | 18 | | ?? throw new InvalidOperationException("Фид-сервис не вернул снимок цены и остатков."); |
| | | 19 | | |
| | 1 | 20 | | return new FeedPriceSnapshot( |
| | 1 | 21 | | response.Current.Select(row => new FeedCurrentRow |
| | 1 | 22 | | { |
| | 1 | 23 | | Cabinet = row.CabinetKey, |
| | 1 | 24 | | Article = row.Article, |
| | 1 | 25 | | Warehouse = row.WarehouseName, |
| | 1 | 26 | | Stock = row.Stock, |
| | 1 | 27 | | StockSupplier = row.StockSupplier, |
| | 1 | 28 | | Price = row.Price, |
| | 1 | 29 | | OldPrice = row.OldPrice, |
| | 1 | 30 | | MinPrice = row.MinPrice, |
| | 1 | 31 | | PurchasePrice = row.PurchasePrice, |
| | 1 | 32 | | PriceWarehouse = row.PriceWarehouse, |
| | 1 | 33 | | PriceSupplier = row.PriceSupplier, |
| | 1 | 34 | | RunId = row.RunId, |
| | 1 | 35 | | UpdatedAt = AsUtc(row.UpdatedAt) |
| | 1 | 36 | | }).ToArray(), |
| | 2 | 37 | | response.History.Select(row => new FeedHistoryRow |
| | 2 | 38 | | { |
| | 2 | 39 | | RunId = row.RunId, |
| | 2 | 40 | | AssembledAt = AsUtc(row.AssembledAt), |
| | 2 | 41 | | AssembledBy = row.AssembledBy ?? string.Empty, |
| | 2 | 42 | | Cabinet = row.CabinetKey, |
| | 2 | 43 | | Article = row.Article, |
| | 2 | 44 | | Price = row.Price, |
| | 2 | 45 | | OldPrice = row.OldPrice, |
| | 2 | 46 | | TotalStock = row.TotalStock |
| | 2 | 47 | | }).ToArray()); |
| | 1 | 48 | | } |
| | | 49 | | |
| | | 50 | | private static DateTimeOffset AsUtc(DateTime value) => |
| | 2 | 51 | | new(value.Kind == DateTimeKind.Unspecified ? DateTime.SpecifyKind(value, DateTimeKind.Utc) : value.ToUniversalTi |
| | | 52 | | } |