public async Task <IActionResult> ProcessCoinGateHook([FromForm] CoinGateHookTransferModel model)
        {
            foreach (var key in Request.Form.Keys)
            {
                switch (key)
                {
                case "order_id":
                    model.OrderId = long.Parse(Request.Form[key]);
                    break;

                case "status":
                    model.Status = Request.Form[key];
                    break;

                case "id":
                    model.Id = long.Parse(Request.Form[key]);
                    break;

                case "price_amount":
                    model.PriceAmount = float.Parse(Request.Form[key]);
                    break;

                case "price_currency":
                    model.PriceCurrency = Request.Form[key];
                    break;

                case "receive_amount":
                    model.ReceiveAmount = float.Parse(Request.Form[key]);
                    break;

                case "receive_currency":
                    model.ReceiveCurrency = Request.Form[key];
                    break;

                case "pay_amount":
                    model.PayAmount = float.Parse(Request.Form[key]);
                    break;

                case "pay_currency":
                    model.PayCurrency = Request.Form[key];
                    break;

                case "created_at":
                    model.CreatedAt = DateTime.Parse(Request.Form[key]);
                    break;

                case "token":
                    model.Token = Request.Form[key];
                    break;
                }
            }

            await _tokenService.ProcessCoinGateHook(model);

            return(ApiResponder.RespondStatusCode(HttpStatusCode.OK));
        }
Esempio n. 2
0
        public async Task ProcessCoinGateHook(CoinGateHookTransferModel model)
        {
            using (var transaction = await _context.Database.BeginTransactionAsync())
            {
                try
                {
                    var tokenBilling = await _context.TokenBillings.Include(tb => tb.UserTokenTransaction)
                                       .ThenInclude(utt => utt.Customer)
                                       .FirstOrDefaultAsync(tb =>
                                                            tb.UserTokenTransactionId == model.OrderId && tb.GatewayInvoiceSecret.Equals(model.Token,
                                                                                                                                         StringComparison.InvariantCultureIgnoreCase));

                    if (tokenBilling == null)
                    {
                        throw new TokenBillingNotFoundException();
                    }

                    if (tokenBilling.UserTokenTransaction.ConfirmedDate >=
                        tokenBilling.UserTokenTransaction.AddedDate && tokenBilling.UserTokenTransaction.CancelledDate <
                        tokenBilling.UserTokenTransaction.AddedDate)
                    {
                        return;
                    }

                    tokenBilling.GatewayStatus  = model.Status;
                    tokenBilling.ReceivedAmount = model.ReceiveAmount;

                    if (model.Status.Equals("paid", StringComparison.InvariantCultureIgnoreCase))
                    {
                        tokenBilling.InvoiceFullyPaid = true;
                        tokenBilling.UserTokenTransaction.ConfirmedDate = DateTime.UtcNow;
                        _context.UserTokenTransactions.Update(tokenBilling.UserTokenTransaction);

                        tokenBilling.UserTokenTransaction.Customer.Balance += tokenBilling.UserTokenTransaction.Amount;
                        _context.Users.Update(tokenBilling.UserTokenTransaction.Customer);
                    }

                    _context.TokenBillings.Update(tokenBilling);
                    await _context.SaveChangesAsync();

                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }