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);
                    }
                }
            }
        }
        /// <summary>
        /// Returns AssetPrice's from <see cref="Prices"/> or <see cref="AssetPrices"/>
        /// </summary>
        public IReadOnlyCollection <AssetPriceEntity> GetAssetPrices()
        {
            if (AssetPrices.Any())
            {
                return(AssetPrices);
            }

            var result = new List <AssetPriceEntity>();

            foreach (var assetSourcePrice in Prices)
            {
                foreach (var sourcePrice in assetSourcePrice.Value)
                {
                    var newAssetPrice = new AssetPriceEntity
                    {
                        Asset      = assetSourcePrice.Key,
                        CrossAsset = "USD", // old format contains USD prices only
                        Source     = sourcePrice.Key,
                        Price      = sourcePrice.Value
                    };

                    result.Add(newAssetPrice);
                }
            }

            return(result);
        }
Exemplo n.º 3
0
        public async Task <AssetPrices> GetAllAssetPrices(int userId)
        {
            var portfolios = GetPortfoliosData(userId);

            var assetPrices = new AssetPrices();

            foreach (var portfolio in portfolios)
            {
                foreach (var asset in portfolio.Assets)
                {
                    var type = asset.GetType();

                    switch (type.Name)
                    {
                    case "StockInfo":
                        assetPrices.StockPrice += await asset.GetAllPrice();

                        break;

                    case "FondInfo":
                        assetPrices.FondPrice += await asset.GetAllPrice();

                        break;

                    case "BondInfo":
                        assetPrices.BondPrice += await asset.GetAllPrice();

                        break;
                    }
                }
            }

            return(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;
        }