public async Task <ActionResult <CreatedTestResultDto> > CreateTestResult([FromBody] UserUrlDto userUrlDto)
        {
            if (userUrlDto == null)
            {
                return(BadRequest());
            }

            return(Ok(await passingTestService.CreateTestResult(userUrlDto)));
        }
Example #2
0
        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));
        }