public IHttpActionResult DebitAccount(BalanceAdjustment data) { if (data.Amount <= 0) { return(Content(HttpStatusCode.BadRequest, "Cannot debit negative amount")); } var studentInDb = _context.Students.SingleOrDefault(s => s.Id == data.Student); if (studentInDb == null) { return(Content(HttpStatusCode.NotFound, "Student not found")); } if (studentInDb.AccountBalance < data.Amount) { return(Content(HttpStatusCode.BadRequest, "Insufficient Funds")); } studentInDb.AccountBalance -= data.Amount; _context.SaveChanges(); return(Ok("Account debited")); }
private IRestResponse DebitMoney(BalanceAdjustment dataToDebitMoney) { dataToDebitMoney.Type = TransactionType.Debit.ToString(); var postAccountEndpoint = $"{this.BASE_ENDPOINT}/api/Account"; var client = new RestClient(postAccountEndpoint); var requestOrigin = new RestRequest(Method.POST); requestOrigin.AddHeader("content-type", "application/json"); requestOrigin.AddParameter( "application/json", JsonConvert.SerializeObject(dataToDebitMoney), ParameterType.RequestBody ); var responseOrigin = client.Execute(requestOrigin); if (responseOrigin.StatusCode == System.Net.HttpStatusCode.InternalServerError) { responseOrigin = this.RetryRequest(client, requestOrigin, 5); } return(responseOrigin); }
public void MakeFinancialTransfer(BalanceAdjustment originData, BalanceAdjustment destinationData) { var originResponse = this.DebitMoney(originData); Console.WriteLine(originResponse?.ErrorMessage); if (originResponse.StatusCode != System.Net.HttpStatusCode.OK) { throw new Exception($"Service Unavailable, try again later | {originResponse?.Content}"); } var destinationResponse = this.CreditMoney(destinationData); if (destinationResponse.StatusCode != System.Net.HttpStatusCode.OK) { this.RollBackTransactionAndAbortProcess(originData, destinationResponse.Content); } }
private static (BalanceAdjustment, BalanceAdjustment) BuildOriginAndDestinationData(Transaction transactionOrder) { var originData = new BalanceAdjustment { AccountNumber = transactionOrder.TransactionRequest.AccountOrigin, Type = TransactionType.Debit.ToString(), Value = transactionOrder.TransactionRequest.Value }; var destinationData = new BalanceAdjustment { AccountNumber = transactionOrder.TransactionRequest.AccountDestination, Type = TransactionType.Credit.ToString(), Value = transactionOrder.TransactionRequest.Value }; return(originData, destinationData); }
private void RollBackTransactionAndAbortProcess(BalanceAdjustment originData, string error) { this.CreditMoney(originData); throw new Exception($"Transaction Cancelled: {error}"); }