Example #1
0
        public async Task <Models.LoanApplication> CheckApprovalAsync(Models.LoanApplication loanApp)
        {
            _logger.LogInformation("Sending loan for approval");
            _logger.LogInformation(loanApp.AsJson());

            var s_loanApp = new StringContent(loanApp.AsJson(), Encoding.UTF8, "application/json");

            HttpResponseMessage resp;

            try{
                resp = await _client.PostAsync(_loanCheckerOptions.Value.ApprovalCheckPath, s_loanApp);
            }catch (Exception) {
                throw;
            }

            if (!resp.IsSuccessStatusCode)
            {
                _logger.LogError("Error requesting approval, http code {StatusCode}, reason {ReasonPhrase}", resp);
                throw new IOException(string.Format("Error checking loan, return http status code {0}", resp.StatusCode));
            }

            string respContent = await resp.Content.ReadAsStringAsync();

            _logger.LogInformation("Approval service response");
            _logger.LogInformation(respContent);

            var respLoan = Models.LoanApplication.FromJson(respContent);

            return(respLoan);
        }
        public async Task <ActionResult <Models.LoanApplication> > ApplyForLoan([FromBody] Models.NewLoanApplication newApp)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (string.IsNullOrEmpty(newApp.name))
            {
                return(BadRequest("Missing loan applicant name"));
            }

            //Add the new entry to get id
            Models.LoanApplicationEntity loan = null;
            try{
                loan = _loans.Add(newApp);
            }catch (ArgumentOutOfRangeException) {
                _logger.LogInformation("Loan rejected due to amount > max allowed");
                return(BadRequest("Loan amount exceeds allowed limit"));
            }

            if (_env.IsDevelopment())
            {
                return(Models.LoanApplication.FromJson(loan.AsLoanApplication().AsJson()));
            }

            //check for approval
            Models.LoanApplication loanApproval = null;
            try{
                loanApproval = await _loanCheckerservice.CheckApprovalAsync(loan.AsLoanApplication());
            }catch (IOException io) {           //http response code != 200
                _logger.LogError(io, "Error running loan check");
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }catch (Exception ex) {
                _logger.LogError(ex, "General error running loan check");
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }

            if (loanApproval == null)
            {
                _logger.LogError("returned loan entity was null");
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }

            //save new status
            try{
                _loans.Update(loanApproval);
            }catch (ArgumentNullException an) {
                _logger.LogError(an, "Error updating loan status after check for approval, argument {0} value was not found", an.ParamName);
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }catch (Exception ex) {
                _logger.LogError(ex, "General error updating loan status after check for approval");
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }

            return(loanApproval);
        }