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;
        }
Пример #3
0
        public void Publish(AssetPricesUpdate index, string indexName)
        {
            _publisher.ProduceAsync(index);

            _log.Info($"Published '{indexName}': {index.ToJson()}.");
        }