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);
        }
        public async Task <ActionResult <Models.LoanApplication> > Get(Guid loanId)
        {
            Models.LoanApplicationEntity loan = null;

            try{
                loan = await _loans.GetAsync(loanId);
            }catch (ArgumentNullException) {
                return(NoContent());
            }catch (Exception ex) {
                _logger.LogError(ex, "General error retriving loan");
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }

            return(loan.AsLoanApplication());
        }
Esempio n. 3
0
        public LoanApplicationEntity Add(NewLoanApplication newLoanApp)
        {
            if (newLoanApp.amount > _loansConfig.Value.max_loan_amount)
            {
                _logger.LogInformation("Loan rejected due to amount > max");
                throw new ArgumentOutOfRangeException("amount");
            }

            var createApp = new Models.LoanApplicationEntity()
            {
                FullName   = newLoanApp.name,
                Amount     = newLoanApp.amount,
                LoanStatus = Models.LoanStatus.PENDING
            };

            _db.Loans.Add(createApp);
            _db.SaveChanges();

            return(createApp);
        }
Esempio n. 4
0
        public async Task <LoanApplicationEntity> AddAsync(NewLoanApplication newLoanApp)
        {
            if (newLoanApp.amount > _loansConfig.Value.max_loan_amount)
            {
                throw new ArgumentOutOfRangeException("amount");
            }

            var createApp = new Models.LoanApplicationEntity()
            {
                FullName   = newLoanApp.name,
                Amount     = newLoanApp.amount,
                LoanStatus = Models.LoanStatus.PENDING
            };

            await _db.Loans.AddAsync(createApp);

            await _db.SaveChangesAsync();

            return(createApp);
        }