private async Task <PayPalLog> SavePaymentDetails(Payment payment, PayPalSuccessModel model)
        {
            var total = decimal.Parse(payment.transactions[0].amount.total, CultureInfo.InvariantCulture);
            var price = decimal.Parse(payment.transactions[0].item_list.items[0].price, CultureInfo.InvariantCulture);

            int.TryParse(payment.transactions[0].item_list.items[0].quantity, out var quantity);

            var payerInfo    = payment.payer.payer_info;
            var shippingInfo = payerInfo.shipping_address;

            var payPalLog = new PayPalLog()
            {
                UserId          = model.UserId,
                PayerId         = model.PayerId,
                PaymentId       = model.PaymentId,
                Total           = total,
                Currency        = "USD",
                Date            = DateTime.Now,
                PayerFirstName  = payerInfo.first_name,
                PayerLastName   = payerInfo.last_name,
                PayerEmail      = payerInfo.email,
                Item            = "Donation Point",
                Price           = price,
                Quantity        = quantity,
                PayerPostalCode = shippingInfo.postal_code,
                PayerCity       = shippingInfo.city
            };

            await _websiteContext.PayPalLogs.AddAsync(payPalLog);

            await _websiteContext.SaveChangesAsync();

            return(payPalLog);
        }
        public async Task <IActionResult> ExecutePayment([FromBody] PayPalSuccessModel model)
        {
            var accountData = await _authContext.AccountData.FirstOrDefaultAsync(x => x.Id == model.AccountId);

            var payPalLog = await RetrievePaymentDetails(model);

            if (payPalLog != null)
            {
                return(Ok(new { dp = accountData.Dp, payPalLog }));
            }

            Payment payment;

            try
            {
                payment = await _payPalService.ExecutePayment(model.PayerId, model.PaymentId, model.Token);
            }
            catch (Exception e)
            {
                return(RequestHandler.BadRequest(e.Message));
            }

            foreach (var resultTransaction in payment.transactions)
            {
                foreach (var item in resultTransaction.item_list.items)
                {
                    int.TryParse(item.quantity, out var amount);
                    accountData.Dp += amount;
                }
            }

            await _authContext.SaveChangesAsync();

            payPalLog = await SavePaymentDetails(payment, model);

            return(Ok(new { dp = accountData.Dp, payPalLog }));
        }
 private async Task <PayPalLog> RetrievePaymentDetails(PayPalSuccessModel model)
 {
     return(await _websiteContext.PayPalLogs.FirstOrDefaultAsync(x =>
                                                                 x.UserId == model.UserId && x.PayerId == model.PayerId && x.PaymentId == model.PaymentId));
 }