public async Task <string> MigrateAsync(string assetPairId, IHistoryProvider historyProvider) { if (!MigrationEnabled) { return(string.Empty); } if (!_candlesHistoryRepository.CanStoreAssetPair(assetPairId)) { return($"Connection string for the asset pair '{assetPairId}' not configuer"); } var assetPair = await _assetPairsManager.TryGetAssetPairAsync(assetPairId); if (assetPair == null) { return($"Asset pair '{assetPairId}' not found"); } lock (_assetManagers) { if (_assetManagers.ContainsKey(assetPairId)) { return($"{assetPairId} already being processed"); } var telemetryService = new AssetPairMigrationTelemetryService(_logFactory, assetPairId); var assetManager = new AssetPairMigrationManager( _healthService, _candlesPersistenceQueue, _candlesGenerator, telemetryService, assetPair, _logFactory, new BidAskHCacheService(), historyProvider, _candlesHistoryMigrationService, OnMigrationStopped, _settings); assetManager.Start(); _assetHealthServices.Add(assetPairId, telemetryService); _assetManagers.Add(assetPairId, assetManager); return($"{assetPairId} processing is started"); } }
public async Task <IActionResult> GetCandlesHistoryBatch([FromBody] GetCandlesHistoryBatchRequest request, CancellationToken cancellationToken) { if (!ModelState.IsValid) { return(Ok(new Dictionary <string, CandlesHistoryResponseModel>())); } if (cancellationToken.IsCancellationRequested || request.AssetPairs == null || !request.AssetPairs.Any()) { return(Ok(new Dictionary <string, CandlesHistoryResponseModel>())); } request.FromMoment = request.FromMoment.ToUniversalTime(); request.ToMoment = request.ToMoment.ToUniversalTime(); if (request.PriceType == CandlePriceType.Unspecified) { return(BadRequest(ErrorResponse.Create(nameof(request.PriceType), $"Price type should not be {CandlePriceType.Unspecified}"))); } if (request.TimeInterval == CandleTimeInterval.Unspecified) { return(BadRequest(ErrorResponse.Create(nameof(request.TimeInterval), $"Time interval should not be {CandleTimeInterval.Unspecified}"))); } if (request.FromMoment > request.ToMoment) { return(BadRequest(ErrorResponse.Create("From date should be early or equal than To date"))); } var notConfiguerdAssetPairs = request.AssetPairs .Where(p => !_candleHistoryAssetConnections.ContainsKey(p)) .ToArray(); if (notConfiguerdAssetPairs.Any()) { return(BadRequest( ErrorResponse.Create(nameof(request.AssetPairs), $"Asset pairs [{string.Join(", ", notConfiguerdAssetPairs)}] are not configured"))); } var assetPairsTask = request.AssetPairs.Select(p => _assetPairsManager.TryGetAssetPairAsync(p)).ToArray(); await Task.WhenAll(assetPairsTask); if (assetPairsTask.Any(t => t.Result == null)) { var notFound = request.AssetPairs.Except(assetPairsTask.Select(p => p.Result?.Id).Where(p => p != null)); return(BadRequest( ErrorResponse.Create(nameof(request.AssetPairs), $"Asset pairs [{string.Join(", ", notFound)}] are not found"))); } var allHistory = new Dictionary <string, CandlesHistoryResponseModel>(); var tasks = new List <Task <IEnumerable <ICandle> > >(); var activeSlot = await _candlesManager.GetActiveSlotAsync(); foreach (var assetPair in request.AssetPairs) { allHistory[assetPair] = new CandlesHistoryResponseModel { History = Array.Empty <CandlesHistoryResponseModel.Candle>() }; tasks.Add(_candlesManager.GetCandlesAsync(assetPair, request.PriceType, request.TimeInterval, request.FromMoment, request.ToMoment, activeSlot)); } await Task.WhenAll(tasks); foreach (var task in tasks) { var candles = task.Result.Select(c => new { pair = c.AssetPairId, model = new CandlesHistoryResponseModel.Candle { DateTime = c.Timestamp, Open = c.Open, Close = c.Close, High = c.High, Low = c.Low, TradingVolume = c.TradingVolume, TradingOppositeVolume = c.TradingOppositeVolume, LastTradePrice = c.LastTradePrice } }).ToArray(); if (candles.Any()) { var p = candles[0].pair; allHistory[p] = new CandlesHistoryResponseModel { History = candles.Select(c => c.model) }; } } return(Ok(allHistory)); }