Esempio n. 1
0
    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));
    }
Esempio n. 2
0
    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;