private static async Task TryEvaluateSession(ILogger log, IAssessmentCalculationService resultsService, IFilterAssessmentCalculationService filterAssessmentCalculationService, UserSession userSession) { var state = userSession.CurrentState; if (state.IsComplete) { if (userSession.IsFilterAssessment) { await filterAssessmentCalculationService.CalculateAssessment(userSession, log); } else { await resultsService.CalculateAssessment(userSession, log); } } else { userSession.CurrentState.MoveToNextQuestion(); } }
public static async Task <HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assessment/{sessionId}")] HttpRequest req, string sessionId, ILogger log, [Inject] IHttpRequestHelper httpRequestHelper, [Inject] IHttpResponseMessageHelper httpResponseMessageHelper, [Inject] IUserSessionRepository userSessionRepository, [Inject] IQuestionRepository questionRepository, [Inject] IAssessmentCalculationService resultsService, [Inject] IFilterAssessmentCalculationService filterAssessmentCalculationService) { try { var correlationId = httpRequestHelper.GetDssCorrelationId(req); if (string.IsNullOrEmpty(correlationId)) { log.LogInformation("Unable to locate 'DssCorrelationId' in request header"); } if (!Guid.TryParse(correlationId, out var correlationGuid)) { log.LogInformation("Unable to parse 'DssCorrelationId' to a Guid"); correlationGuid = Guid.NewGuid(); } if (string.IsNullOrEmpty(sessionId)) { log.LogInformation($"CorrelationId: {correlationGuid} - Session Id not supplied"); return(httpResponseMessageHelper.BadRequest()); } PostAnswerRequest postAnswerRequest; using (var streamReader = new StreamReader(req.Body)) { var body = streamReader.ReadToEnd(); postAnswerRequest = JsonConvert.DeserializeObject <PostAnswerRequest>(body); } AnswerOption answerValue; if (Enum.TryParse(postAnswerRequest.SelectedOption, out answerValue) == false) { log.LogInformation( $"CorrelationId: {correlationGuid} - Answer supplied is invalid {postAnswerRequest.SelectedOption}"); return(httpResponseMessageHelper.BadRequest()); } var userSession = await userSessionRepository.GetUserSession(sessionId); if (userSession == null) { log.LogInformation($"CorrelationId: {correlationGuid} - Session Id does not exist {sessionId}"); return(httpResponseMessageHelper.NoContent()); } var question = await questionRepository.GetQuestion(postAnswerRequest.QuestionId); if (question == null) { log.LogInformation( $"CorrelationId: {correlationGuid} - Question Id does not exist {postAnswerRequest.QuestionId}"); return(httpResponseMessageHelper.NoContent()); } userSession.AddAnswer(answerValue, question); await TryEvaluateSession(log, resultsService, filterAssessmentCalculationService, userSession); var displayFinish = question.IsFilterQuestion ? userSession.FilteredAssessmentState.IsComplete : userSession.AssessmentState.IsComplete; if (!question.IsFilterQuestion) { userSession.AssessmentState.CurrentQuestion = question.Order; } var result = new PostAnswerResponse() { IsSuccess = true, IsComplete = displayFinish, IsFilterAssessment = question.IsFilterQuestion, JobCategorySafeUrl = question.IsFilterQuestion ? userSession.FilteredAssessmentState.JobFamilyNameUrlSafe : null, NextQuestionNumber = question.IsFilterQuestion ? userSession.FilteredAssessmentState.MoveToNextQuestion() : userSession.AssessmentState.MoveToNextQuestion() }; await userSessionRepository.UpdateUserSession(userSession); return(httpResponseMessageHelper.Ok(JsonConvert.SerializeObject(result))); } catch (Exception ex) { log.LogError(ex, "Fatal exception {message}", ex.Message); return(new HttpResponseMessage { StatusCode = HttpStatusCode.InternalServerError }); } }