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)); }
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; } } }