Exemplo n.º 1
0
        public async Task <QuestionSubmissionChallengeDto> Handle(SubmitAnswerCommand request, CancellationToken cancellationToken)
        {
            var team = await _context.Teams.Include(t => t.QuestionSubmissions)
                       .Include(t => t.Users)
                       .FirstOrDefaultAsync(t => t.EventId == request.EventId &&
                                            t.Users.Any(u => u.Id == _currentUserService.UserId), cancellationToken);

            if (team == null)
            {
                throw new NotFoundException("Team was not found for current user");
            }

            var question = await _context.Questions.Include(q => q.Challenge)
                           .ThenInclude(c => c.Questions)
                           .FirstOrDefaultAsync(q => q.Id == request.QuestionId, cancellationToken);

            var isCorrect = question.Answer == request.Answer;

            // Create or update submission
            var submissions = await _context.QuestionSubmissions.Where(qs => qs.QuestionId == request.QuestionId).ToListAsync(cancellationToken);

            var calculatedPoints = isCorrect ? CalculatePoints(submissions, question.Point) : 0;

            var submission = submissions.FirstOrDefault(qs => qs.TeamId == team.Id);

            if (submission == null)
            {
                submission = QuestionSubmission.Create(request.QuestionId, team.Id, isCorrect, request.Answer, calculatedPoints);

                await _context.QuestionSubmissions.AddAsync(submission, cancellationToken);
            }
            else
            {
                if (submission.IsCorrect)
                {
                    return(_mapper.Map <QuestionSubmissionChallengeDto>(submission));
                }

                submission.Update(isCorrect, request.Answer, calculatedPoints);
            }

            if (submission.IsCorrect)
            {
                await UpdateTeamResultAsync(request.EventId, team, submission, question);
            }

            await _context.SaveChangesAsync(cancellationToken);

            return(_mapper.Map <QuestionSubmissionChallengeDto>(submission));
        }