Esempio n. 1
0
        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"));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 private void RollBackTransactionAndAbortProcess(BalanceAdjustment originData, string error)
 {
     this.CreditMoney(originData);
     throw new Exception($"Transaction Cancelled: {error}");
 }