예제 #1
0
        public async Task UpsertSnapshots(List <SnapshotEntity> entities)
        {
            await using var ctx = DatabaseContext.Create(_dbContextOptionsBuilder);
            await ctx.UpsetAsync(entities);

            await ctx.SaveChangesAsync();

            await _writer.BulkInsertOrReplaceAsync(entities.Select(SnapshotNoSqlEntity.Create));

            await _writer.CleanAndKeepMaxPartitions(Program.Settings.MaxCachedSnapshots);
        }
예제 #2
0
        private async Task ProcessMessageAsync(CandlesUpdatedEvent message)
        {
            if (message.Candles == null || !message.Candles.Any())
            {
                return;
            }

            var intervalToSkip = new List <CandleTimeInterval>
            {
                CandleTimeInterval.Unspecified,
                CandleTimeInterval.Sec,
                CandleTimeInterval.Minute
            };

            var candlesToStore = message.Candles.Where(x =>
                                                       !string.IsNullOrEmpty(x.AssetPairId) && x.IsLatestChange &&
                                                       !intervalToSkip.Contains(x.TimeInterval) && x.PriceType != CandlePriceType.Unspecified)
                                 .ToList();

            var candles = _mapper.Map <List <CandleEntity> >(candlesToStore);

            await _candlesWriter.BulkInsertOrReplaceAsync(candles);

            Task.Run(async() =>
            {
                await _candlesWriter.CleanAndKeepMaxPartitions(0);
            });
        }
        private Task ClearDataAsync(List <string> assetPairIds)
        {
            var keys = new List <string>();

            foreach (var assetPairId in assetPairIds)
            {
                keys.Add(RedisService.GetMarketDataBaseVolumeKey(assetPairId));
                keys.Add(RedisService.GetMarketDataQuoteVolumeKey(assetPairId));
                keys.Add(RedisService.GetMarketDataPriceKey(assetPairId));
            }

            return(Task.WhenAll(
                       _database.KeyDeleteAsync(keys.Select(x => (RedisKey)x).ToArray()),
                       _tickerWriter.CleanAndKeepMaxPartitions(0),
                       _priceWriter.CleanAndKeepMaxPartitions(0)
                       ));
        }
예제 #4
0
        private void DoTimer(object state)
        {
            lock (_sync)
            {
                _timer.Change(Timeout.Infinite, Timeout.Infinite);
            }

            if (!_isStarted)
            {
                return;
            }

            try
            {
                if (_readAllRecordsCallback != null)
                {
                    var data = _readAllRecordsCallback.Invoke();

                    foreach (var group in data.GroupBy(e => e.PartitionKey))
                    {
                        _writer.CleanAndBulkInsertAsync(group.Key, group).GetAwaiter().GetResult();
                    }

                    _log.Info($"Reload MyNoSql table for entity {typeof(TEntity).Name}. Count Record: {data.Count}");
                }

                if (_maxInCache.HasValue)
                {
                    _writer.CleanAndKeepMaxPartitions(_maxInCache.Value).GetAwaiter().GetResult();
                    _log.Info($"Clear MyNoSql table for entity {typeof(TEntity).Name}. Max Record: {_maxInCache}");
                }
            }
            catch (Exception ex)
            {
                _log.Error(ex, $"Cannot refresh data in MyNoSQL table. Entity: {typeof(TEntity).Name}");
            }

            lock (_sync)
            {
                if (_isStarted)
                {
                    _timer?.Change(_reloadTimerPeriod, _reloadTimerPeriod);
                }
            }
        }
        private async Task <GetDepositAddressResponse> GetBitgoDepositAddressAsync(GetDepositAddressRequest request)
        {
            try
            {
                var(bitgoCoin, bitgoWalletId) =
                    _assetMapper.AssetToBitgoCoinAndWallet(request.BrokerId, request.AssetSymbol);

                if (string.IsNullOrEmpty(bitgoWalletId) || string.IsNullOrEmpty(bitgoCoin))
                {
                    _logger.LogError(
                        "Cannot process GetDepositAddress. Asset do not mapped to bitgo. Request: {jsonText}",
                        JsonConvert.SerializeObject(request));
                    return(new GetDepositAddressResponse
                    {
                        Error = GetDepositAddressResponse.ErrorCode.AssetDoNotSupported
                    });
                }

                Error error = null;

                var label = _walletMapper.WalletToBitgoLabel(new JetWalletIdentity
                {
                    BrokerId = request.BrokerId,
                    ClientId = request.ClientId,
                    WalletId = request.WalletId
                });

                await using var ctx = DatabaseContext.Create(_dbContextOptionsBuilder);
                var addressEntity = await ctx.Addresses.Where(t =>
                                                              t.BrokerId == request.BrokerId && t.ClientId == request.ClientId &&
                                                              t.WalletId == request.WalletId && t.Blockchain == request.Blockchain &&
                                                              t.AssetSymbol == request.AssetSymbol).FirstOrDefaultAsync();

                var address = addressEntity?.Address;

                if (string.IsNullOrEmpty(address))
                {
                    (address, error) =
                        await _depositAddressGeneratorService.GetAddressAsync(bitgoCoin, bitgoWalletId, label);
                }

                if (string.IsNullOrEmpty(address))
                {
                    var preGeneratedAddresses = (await _generatedAddressDataWriter.GetAsync(
                                                     GeneratedDepositAddressEntity.GeneratePartitionKey(request.BrokerId, bitgoCoin,
                                                                                                        bitgoWalletId, request.Blockchain)))
                                                .ToList();

                    if (preGeneratedAddresses.Count > 0)
                    {
                        var preGeneratedAddress = preGeneratedAddresses.First();
                        (address, error) = await _depositAddressGeneratorService.UpdateAddressLabelAsync(bitgoCoin,
                                                                                                         bitgoWalletId,
                                                                                                         preGeneratedAddress.Address.BitGoAddressId, label);

                        if (error == null)
                        {
                            await _generatedAddressDataWriter.DeleteAsync(preGeneratedAddress.PartitionKey,
                                                                          preGeneratedAddress.RowKey);
                        }
                    }
                    else
                    {
                        (address, error) =
                            await _depositAddressGeneratorService.GenerateAddressAsync(bitgoCoin, bitgoWalletId, label);
                    }
                }

                if (string.IsNullOrEmpty(address) || error != null)
                {
                    _logger.LogError(
                        "Cannot process GetDepositAddress. Unable to generate address. Request: {jsonText}. Error: {error}",
                        JsonConvert.SerializeObject(request), error);
                    return(new GetDepositAddressResponse
                    {
                        Error = GetDepositAddressResponse.ErrorCode.AddressNotGenerated
                    });
                }

                if (addressEntity == null)
                {
                    await ctx.InsertAsync(new DepositAddressSqlEntity
                    {
                        BrokerId    = request.BrokerId,
                        ClientId    = request.ClientId,
                        WalletId    = request.WalletId,
                        Integration = "BitGo",
                        AssetSymbol = request.AssetSymbol,
                        Blockchain  = request.Blockchain,
                        Address     = address,
                        CreatedDate = DateTime.Now
                    });
                }

                await _addressDataWriter.InsertOrReplaceAsync(DepositAddressEntity.Create(request.WalletId,
                                                                                          request.AssetSymbol, request.Blockchain, address));

                await _addressDataWriter.CleanAndKeepMaxPartitions(Program.Settings.MaxClientInCache);

                _logger.LogInformation("Handle GetDepositAddress, request: {jsonText}, address: {address}",
                                       JsonConvert.SerializeObject(request), address);

                return(new GetDepositAddressResponse
                {
                    Address = address,
                    Error = GetDepositAddressResponse.ErrorCode.Ok
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Exception on GetDepositAddress with request: {jsonText}",
                                 JsonConvert.SerializeObject(request));
                throw;
            }
        }
 public async Task Clear()
 {
     await _writer.CleanAndKeepMaxPartitions(0);
 }