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); }
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; }