public async Task <Result <Contract> > Handle(Contract request, CancellationToken cancellationToken) { if (request.UserRole == "Secretary" || request.UserRole == "Recruiter") { return(Result.Fail <Contract>("Acesso Negado")); } var mId = ObjectId.Parse(request.ModuleId); var userId = ObjectId.Parse(request.UserId); var module = await _db.ModuleDraftCollection.AsQueryable() .Where(x => ( x.DeletedAt == null || x.DeletedAt == DateTimeOffset.MinValue ) && !x.DraftPublished && ( x.Id == mId || x.ModuleId == mId ) ) .FirstOrDefaultAsync(cancellationToken: cancellationToken); if (module == null) { return(Result.Fail <Contract>("Módulo não Encontrado")); } if (request.UserRole == "Student") { if (!ModuleDraft.IsInstructor(module, userId).Data) { return(Result.Fail <Contract>("Acesso Negado")); } } var subject = module.Subjects.FirstOrDefault(x => x.Id == ObjectId.Parse(request.SubjectId) ); if (subject == null) { return(Result.Fail <Contract>("Assunto não Encontrado")); } var answers = request.Answers.Select(x => new Answer( x.Description, x.Points, x.Concepts.Select(y => new AnswerConcept(y.Concept, y.IsRight)).ToList() ) ).ToList(); Result <QuestionDraft> newObject; if (!String.IsNullOrEmpty(request.QuestionId)) { var questionId = ObjectId.Parse(request.QuestionId); newObject = QuestionDraft.Create( questionId, module.Id, request.Text, request.Level, request.Duration, request.Concepts, answers, module.ModuleId, ObjectId.Parse(request.SubjectId) ); } else { newObject = QuestionDraft.Create( module.Id, request.Text, request.Level, request.Duration, request.Concepts, answers, module.ModuleId, ObjectId.Parse(request.SubjectId) ); } if (newObject.IsFailure) { return(Result.Fail <Contract>(newObject.Error)); } var newQuestion = newObject.Data; var newQuestionList = new List <QuestionDraft> { newQuestion }; if (string.IsNullOrEmpty(request.Id)) { await _db.QuestionDraftCollection.InsertOneAsync( newQuestion, cancellationToken : cancellationToken ); request.Id = newQuestion.Id.ToString(); var creationLog = AuditLog.Create(userId, mId, newQuestionList[0].GetType().ToString(), JsonConvert.SerializeObject(newQuestionList), EntityAction.Add); await _db.AuditLogCollection.InsertOneAsync(creationLog); } else { var question = await _db.QuestionDraftCollection .AsQueryable() .Where(x => x.Id == ObjectId.Parse(request.Id)) .FirstOrDefaultAsync(cancellationToken: cancellationToken); if (question == null) { return(Result.Fail <Contract>("Questão não Encontrada")); } var oldQuestionList = new List <QuestionDraft> { question }; var oldValues = JsonConvert.SerializeObject(oldQuestionList); question.ModuleId = newQuestion.ModuleId; question.SubjectId = newQuestion.SubjectId; question.Concepts = newQuestion.Concepts; question.Answers = newQuestion.Answers; question.Duration = newQuestion.Duration; question.Level = newQuestion.Level; question.Text = newQuestion.Text; question.UpdatedAt = DateTimeOffset.UtcNow; await _db.QuestionDraftCollection.ReplaceOneAsync(t => t.Id == question.Id, question, cancellationToken : cancellationToken ); var changeLog = AuditLog.Create(userId, mId, newQuestionList[0].GetType().ToString(), JsonConvert.SerializeObject(newQuestionList), EntityAction.Update, oldValues); await _db.AuditLogCollection.InsertOneAsync(changeLog); } return(Result.Ok(request)); }
public async Task <Result> Handle(Contract request, CancellationToken cancellationToken) { if (request.UserRole != "Admin" && request.UserRole != "Author") { return(Result.Fail("Acesso Negado")); } var userId = ObjectId.Parse(request.UserId); var draftId = ObjectId.Parse(request.ModuleId); var module = await _db.ModuleDraftCollection.AsQueryable() .Where(x => ( x.DeletedAt == null || x.DeletedAt == DateTimeOffset.MinValue ) && !x.DraftPublished && ( x.Id == draftId || x.ModuleId == draftId ) ) .FirstOrDefaultAsync(); if (module == null) { return(Result.Fail("Rascunho de Módulo não encontrado")); } if (module.CreatedBy != userId) { return(Result.Fail("Você não tem permissão de excluir o módulo selecionado.")); } if (request.UserRole == "Student") { if (!ModuleDraft.IsInstructor(module, userId).Data) { return(Result.Fail("Acesso Negado")); } } module.DeletedBy = ObjectId.Parse(request.UserId); module.DeletedAt = DateTimeOffset.Now; await _db.ModuleDraftCollection.ReplaceOneAsync(t => t.Id == module.Id, module, cancellationToken : cancellationToken ); var oldDraftList = new List <ModuleDraft> { module }; var changeLog = AuditLog.Create(userId, draftId, module.GetType().ToString(), "", EntityAction.Delete, JsonConvert.SerializeObject(oldDraftList)); await _db.AuditLogCollection.InsertOneAsync(changeLog); var questionDrafts = await _db.QuestionDraftCollection.AsQueryable() .Where(d => d.ModuleId == module.ModuleId && !d.DraftPublished) .ToListAsync(); if (questionDrafts.Count > 0) { var update = Builders <QuestionDraft> .Update .Set(d => d.DeletedAt, DateTimeOffset.Now) .Set(d => d.DeletedBy, ObjectId.Parse(request.UserId)); var ids = questionDrafts.Select(x => x.Id).ToArray(); await _db.QuestionDraftCollection.UpdateManyAsync(x => ids.Contains(x.Id), update, cancellationToken : cancellationToken ); } return(Result.Ok()); }