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)); }