private void FillAssetPricesUpdates(AssetPricesUpdate assetPricesUpdate, AssetPrices current, AssetPrices previous) { var assetId = current.AssetId; foreach (var exchangePrice in current.Prices) { var exchangeName = exchangePrice.Source; var price = exchangePrice.Price; var previousExchangePrice = previous.Prices.FirstOrDefault(x => x.Source == exchangeName); if (previousExchangePrice == null || previousExchangePrice.Price != price) { var assetPrices = Map(assetId, exchangeName, price); var existed = assetPricesUpdate.PriceUpdates.SingleOrDefault(x => x.AssetId == assetPrices.AssetId); if (existed != null) { existed.Prices.Add(assetPrices.Prices.Single()); } else { assetPricesUpdate.PriceUpdates.Add(assetPrices); } } } }
private void CreateAssetPricesUpdateAndPublish(string assetId, IList <AssetPrices> assetsPrices) { var result = new AssetPricesUpdate { AssetId = assetId }; var previousAssetsPrices = new List <AssetPrices>(); if (_assetIdsAssetPrices.ContainsKey(assetId)) { previousAssetsPrices = _assetIdsAssetPrices[assetId].ToList(); } foreach (var assetPrices in assetsPrices) { var previousAssetPrices = previousAssetsPrices.FirstOrDefault(x => x.AssetId == assetPrices.AssetId); if (previousAssetPrices == null) { previousAssetPrices = new AssetPrices(); } FillAssetPricesUpdates(result, assetPrices, previousAssetPrices); } // Ordering result.PriceUpdates = result.PriceUpdates.OrderBy(x => x.AssetId).ToList(); foreach (var priceUpdate in result.PriceUpdates) { priceUpdate.Prices = priceUpdate.Prices.OrderBy(x => x.Source).ToList(); } // Publish if (result.PriceUpdates.Any()) { _indicesPriceUpdatesPublisher.Publish(result, MapAssetIdToIndexName(assetId)); } _assetIdsAssetPrices[assetId] = assetsPrices; }
public void Publish(AssetPricesUpdate index, string indexName) { _publisher.ProduceAsync(index); _log.Info($"Published '{indexName}': {index.ToJson()}."); }