public async Task <IViewComponentResult> InvokeAsync(StoreNumbersViewModel vm) { if (vm.Store == null) { throw new ArgumentNullException(nameof(vm.Store)); } if (vm.CryptoCode == null) { throw new ArgumentNullException(nameof(vm.CryptoCode)); } vm.WalletId = new WalletId(vm.Store.Id, vm.CryptoCode); if (vm.InitialRendering) { return(View(vm)); } await using var ctx = _dbContextFactory.CreateContext(); var payoutsCount = await ctx.Payouts .Where(p => p.PullPaymentData.StoreId == vm.Store.Id && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingApproval) .CountAsync(); var refundsCount = await ctx.Invoices .Where(i => i.StoreData.Id == vm.Store.Id && !i.Archived && i.CurrentRefundId != null) .CountAsync(); var derivation = vm.Store.GetDerivationSchemeSettings(_networkProvider, vm.CryptoCode); int?transactionsCount = null; if (derivation != null && _nbxConnectionFactory.Available) { await using var conn = await _nbxConnectionFactory.OpenConnection(); var wid = NBXplorer.Client.DBUtils.nbxv1_get_wallet_id(derivation.Network.CryptoCode, derivation.AccountDerivation.ToString()); var afterDate = DateTimeOffset.UtcNow - TimeSpan.FromDays(vm.TransactionDays); var count = await conn.ExecuteScalarAsync <long>("SELECT COUNT(*) FROM wallets_history WHERE code=@code AND wallet_id=@wid AND seen_at > @afterDate", new { code = derivation.Network.CryptoCode, wid, afterDate }); transactionsCount = (int)count; } vm.PayoutsPending = payoutsCount; vm.Transactions = transactionsCount; vm.RefundsIssued = refundsCount; return(View(vm)); }
public async Task <WalletHistogramData> GetHistogram(StoreData store, WalletId walletId, WalletHistogramType type) { // https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Schema.md if (_connectionFactory.Available) { var derivationSettings = store.GetDerivationSchemeSettings(_networkProvider, walletId.CryptoCode); if (derivationSettings != null) { var wallet_id = derivationSettings.GetNBXWalletId(); await using var conn = await _connectionFactory.OpenConnection(); var code = walletId.CryptoCode; var to = DateTimeOffset.UtcNow; var labelCount = 6; (var days, var pointCount) = type switch { WalletHistogramType.Week => (7, 30), WalletHistogramType.Month => (30, 30), WalletHistogramType.Year => (365, 30), _ => throw new ArgumentException($"WalletHistogramType {type} does not exist.") }; var from = to - TimeSpan.FromDays(days); var interval = TimeSpan.FromTicks((to - from).Ticks / pointCount); var balance = await conn.ExecuteScalarAsync <decimal>( "SELECT to_btc(available_balance) FROM wallets_balances WHERE wallet_id=@wallet_id AND code=@code AND asset_id=''", new { code, wallet_id }); var rows = await conn.QueryAsync("SELECT date, to_btc(balance) balance FROM get_wallets_histogram(@wallet_id, @code, '', @from, @to, @interval)", new { code, wallet_id, from, to, interval }); var data = rows.AsList(); var series = new List <decimal>(pointCount); var labels = new List <string>(labelCount); var labelEvery = pointCount / labelCount; for (int i = 0; i < data.Count; i++) { var r = data[i]; series.Add((decimal)r.balance); labels.Add((i % labelEvery == 0) ? ((DateTime)r.date).ToString("MMM dd", CultureInfo.InvariantCulture) : null); } series[^ 1] = balance;