public async Task DeleteQuestionAsync(int questionId) { if (await DoesQuestionHaveUserAnswersAsync(questionId)) { throw new Exception("A questão não pode ser excluída, pois usuários já responderam ela."); } foreach (var existingAnswer in await _answerRepository.FindAsync(a => a.QuestionId == questionId)) { _answerRepository.Remove(existingAnswer); } var question = await FindQuestionByIdAsync(questionId); _questionRepository.Remove(question); await _unitOfWork.CommitAsync(); }
public async Task UpdateRankingAfterUserAnswerAsync(AnsweredQuestion answeredQuestion) { var question = await _questionRepository.FindAsync(answeredQuestion.QuestionId); var answer = await _answerRepository.FindAsync(answeredQuestion.AnswerId); if (!await _questionService.DoesAnswerBelongToQuestionAsync(answeredQuestion.AnswerId, answeredQuestion.QuestionId)) { throw new Exception("A resposta não é uma das respostas possíveis para a questão."); } bool didUserCompleteTrack = await _questionService.HasUserFinishedTrackAsync(answeredQuestion.UserId, question.TrackId); if (answer.IsAnswerCorrect || didUserCompleteTrack) { var trackRanking = (await _trackRankingRepository .FindAsync(tr => tr.TrackId == question.TrackId && tr.UserId == answeredQuestion.UserId)) .FirstOrDefault(); if (answer.IsAnswerCorrect) { trackRanking.Points += (int)question.QuestionLevel; } if (didUserCompleteTrack) { trackRanking.CompletedTime = DateTime.UtcNow - trackRanking.StartedAtUtc; } _trackRankingRepository.Update(trackRanking); await _unitOfWork.CommitAsync(); } }
public async Task <ProcessResult> DeleteQuestionAsync(int questionId) { if (await DoesQuestionHaveUserAnswersAsync(questionId)) { return(new ProcessResult { Message = "A questão não pode ser excluída, pois usuários já responderam ela.", Result = false }); } foreach (var existingAnswer in await _answerRepository.FindAsync(a => a.QuestionId == questionId)) { _answerRepository.Remove(existingAnswer); } var question = await FindQuestionByIdAsync(questionId); _questionRepository.Remove(question); await _unitOfWork.CommitAsync(); return(new ProcessResult { Message = "Pergunta deletada com sucesso", Result = true }); }