public async Task <ActionResult <CreatedTestResultDto> > CreateTestResult([FromBody] UserUrlDto userUrlDto) { if (userUrlDto == null) { return(BadRequest()); } return(Ok(await passingTestService.CreateTestResult(userUrlDto))); }
public async Task <CreatedTestResultDto> CreateTestResult(UserUrlDto userUrlDto) { var testEvents = testEventRepository.Get(e => e.SessionId == userUrlDto.SessionId); var eventsQuestionAnswered = testEvents.Where(e => e.EventType == EventType.QuestionAnswered).ToList(); var payloadQuestions = eventsQuestionAnswered.Select(eventQuestion => JsonConvert.DeserializeObject <PayloadQuestion>(eventQuestion.Payload)).ToList(); var eventTestStarted = testEvents.First(e => e.EventType == EventType.TestStarted); var payloadTest = JsonConvert.DeserializeObject <PayloadTest>(eventTestStarted.Payload); var test = testRepository.GetById(id: payloadTest.TestId, includeProperties: prop => prop.Include(t => t.TestQuestions).ThenInclude(q => q.TestQuestionOptions)); var testResult = new TestResult { IntervieweeName = payloadTest.IntervieweeName, PassingStartTime = eventTestStarted.StartTime, PassingEndTime = DateTime.Now, UrlId = userUrlDto.UrlId }; foreach (var question in test.TestQuestions) { var payloadQuestionIndex = payloadQuestions.FindIndex(q => q.QuestionId == question.Id); var resultAnswer = CreateResultAnswerWithOptions(payloadQuestionIndex >= 0 ? payloadQuestions[payloadQuestionIndex] : null, payloadQuestionIndex, eventsQuestionAnswered, eventTestStarted); resultAnswer.QuestionId = question.Id; testResult.ResultAnswers.Add(resultAnswer); testResult.Score += resultAnswer.IsInTime(question) ? testCalculationService.CalculateQuestionScore(question, payloadQuestionIndex >= 0 ? payloadQuestions[payloadQuestionIndex] : null) : 0; } testResult.Score = test.HasAtLeastOneQuestion && testResult.IsInTime(test, timeErrorSetting.MarginOfErrorSeconds) ? testResult.PercentageScore : 0; testEventRepository.Delete(testEvents); testResultRepository.Insert(testResult); await unitOfWork.SaveAsync(); return(mapper.Map <CreatedTestResultDto>(testResult)); }