public async Task <int> AdicionarPublicacaoAsync(int professorId, int avaliacaoId, int turmaId, DateTime dataInicio, DateTime dataFim, int valorProva) { var publicacao = new Publicacao(); publicacao.AvaliacaoId = avaliacaoId; publicacao.TurmaId = turmaId; publicacao.DataInicio = dataInicio; publicacao.DataFim = dataFim; publicacao.ValorProva = valorProva; var erros = publicacao.Validate(); if (erros.Length == 0) { var avaliacao = await _avaliacaoRepository.ObterAsync(avaliacaoId); if (avaliacao == null) { throw new DomainException("A avaliação informada não foi encontrada!"); } if (avaliacao.ProfessorId != professorId) { throw new DomainException("A avaliação informada não pertence ao professor logado!"); } if (avaliacao.Publicacoes.Where(x => x.TurmaId == turmaId).Any()) { throw new DomainException("Essa avaliação já foi publicada para esta turma!"); } if (avaliacao.Questoes.Where(x => x.Opcoes.Where(y => y.Verdadeira).Count() != 1).Any()) { throw new DomainException("Esta avaliação possui pendências e não pode ser publicada!"); } if (!avaliacao.Questoes.Any() || avaliacao.Questoes.Where(x => x.Opcoes.Count < 4).Any()) { throw new DomainException("Essa avaliação não está completa! É necessário que todas as questões tenham ao menos 4 opções!"); } await _publicacaoRepository.AdicionarAsync(publicacao); _publicacaoRepository.SaveChanges(); return(publicacao.Id); } else { throw new DomainException(erros); } }