public async Task <Wallet> GetWallet(WalletQuery query)
        {
            await using var dbContext = _dbContextFactory.CreateDbContext();
            var queryable = dbContext.Wallets
                            .Where(w => w.UserId == query.UserId && w.WalletId == query.WalletId);

            if (query.IncludeTransactions)
            {
                queryable = queryable.Include(w => w.Transactions).AsNoTracking();
            }

            return(await queryable.FirstOrDefaultAsync());
        }
        public async Task <Transaction> GetTransaction(TransactionQuery query)
        {
            await using var dbContext = _dbContextFactory.CreateDbContext();
            IQueryable <Transaction> queryable = dbContext.Transactions.AsQueryable();

            if (query.WalletId != null)
            {
                var walletQuery = new WalletQuery
                {
                    WalletId            = query.WalletId,
                    IncludeTransactions = true
                };

                if (query.UserId != null)
                {
                    walletQuery.UserId = query.UserId;
                }

                var wallet = await GetWallet(walletQuery);

                if (wallet == null)
                {
                    return(null);
                }

                queryable = wallet.Transactions.AsQueryable();
            }

            if (query.InvoiceId != null)
            {
                queryable = queryable.Where(t => t.InvoiceId == query.InvoiceId);
            }
            else if (query.HasInvoiceId)
            {
                queryable = queryable.Where(t => t.InvoiceId != null);
            }

            if (query.TransactionId != null)
            {
                queryable = queryable.Where(t => t.TransactionId == query.TransactionId);
            }

            if (query.PaymentRequest != null)
            {
                queryable = queryable.Where(t => t.PaymentRequest == query.PaymentRequest);
            }

            return(queryable.SingleOrDefault());
        }