Example #1
0
            private async Task <ModuleDraft> CreateModuleDraft(
                Contract request, Module originalModule, CancellationToken token
                )
            {
                var moduleId = ObjectId.Parse(request.ModuleId);

                var module = ModuleDraft.Create(
                    moduleId, originalModule.Title, originalModule.Excerpt, originalModule.ImageUrl, originalModule.Published,
                    originalModule.InstructorId, originalModule.Instructor, originalModule.InstructorMiniBio, originalModule.InstructorImageUrl,
                    originalModule.Duration, originalModule.VideoDuration, originalModule.VideoUrl,
                    originalModule.CertificateUrl, originalModule.StoreUrl, originalModule.EcommerceUrl, false,
                    originalModule.Tags, originalModule.TutorsIds
                    ).Data;

                module.Subjects         = originalModule.Subjects;
                module.Requirements     = originalModule.Requirements;
                module.SupportMaterials = originalModule.SupportMaterials;

                await _db.ModuleDraftCollection.InsertOneAsync(
                    module, cancellationToken : token
                    );

                var dbModulesQuestionsQuery = _db.QuestionCollection
                                              .AsQueryable()
                                              .Where(q => q.ModuleId == moduleId);

                var dbModuleQuestions = await(
                    (IAsyncCursorSource <Question>)dbModulesQuestionsQuery
                    ).ToListAsync();

                if (dbModuleQuestions.Count > 0)
                {
                    var draftQuestions = dbModuleQuestions.Select(q =>
                                                                  QuestionDraft.Create(
                                                                      q.Id, module.Id,
                                                                      q.Text, q.Level, q.Duration,
                                                                      q.Concepts, q.Answers,
                                                                      q.ModuleId, q.SubjectId
                                                                      ).Data
                                                                  );

                    await _db.QuestionDraftCollection.InsertManyAsync(
                        draftQuestions, cancellationToken : token
                        );
                }

                return(module);
            }
Example #2
0
            public async Task <Result <ModuleDraft> > Handle(Contract request, CancellationToken cancellationToken)
            {
                try
                {
                    if (request.UserRole != "Admin" && request.UserRole != "Author")
                    {
                        return(Result.Fail <ModuleDraft>("Acesso Negado"));
                    }

                    var tags = new List <Tag>();
                    foreach (var tagStr in request.Tags)
                    {
                        var tag = Tag.Create(tagStr);
                        tags.Add(tag.Data);
                    }

                    var tutorsIds = request.TutorsIds != null?
                                    request.TutorsIds.Select(x => ObjectId.Parse(x)).ToList() :
                                        new List <ObjectId>();

                    var instructorId = String.IsNullOrEmpty(request.InstructorId) ?
                                       ObjectId.Empty : ObjectId.Parse(request.InstructorId);

                    Module          dbModule          = null;
                    Module          dbModuleClone     = null;
                    List <Question> dbModuleQuestions = new List <Question>();

                    if (!String.IsNullOrEmpty(request.ModuleId))
                    {
                        dbModule = await GetModule(request.ModuleId);
                    }

                    dbModuleClone = Module.Create(
                        request.Title,
                        dbModule.Excerpt,
                        dbModule.Instructor,
                        dbModule.ImageUrl,
                        new List <ObjectId>(),
                        instructorId,
                        new List <SupportMaterial>(),
                        new List <Requirement>(),
                        tags,
                        false,
                        null,
                        new List <Subject>(),
                        dbModule.CertificateUrl,
                        tutorsIds,
                        dbModule.ExtraInstructorIds,
                        dbModule.StoreUrl,
                        dbModule.EcommerceUrl,
                        dbModule.ModuleGradeType,
                        dbModule.ValidFor
                        ).Data;

                    await _db.ModuleCollection.InsertOneAsync(
                        dbModuleClone, cancellationToken : cancellationToken
                        );

                    dbModuleQuestions = await GetModuleQuestions(request.ModuleId);

                    var draft = ModuleDraft.Create(
                        dbModuleClone.Id, dbModuleClone.Title, dbModuleClone.Excerpt, dbModuleClone.ImageUrl, dbModuleClone.Published,
                        instructorId, dbModuleClone.Instructor, dbModuleClone.InstructorMiniBio, dbModuleClone.InstructorImageUrl,
                        null, null, null, dbModuleClone.CertificateUrl, dbModuleClone.StoreUrl, dbModuleClone.EcommerceUrl, request.CreateInEcommerce ?? false,
                        tags, tutorsIds
                        ).Data;

                    draft.Subjects         = dbModule.Subjects;
                    draft.Requirements     = dbModule.Requirements;
                    draft.SupportMaterials = dbModule.SupportMaterials;

                    await _db.ModuleDraftCollection.InsertOneAsync(
                        draft, cancellationToken : cancellationToken
                        );

                    if (dbModuleQuestions.Count > 0)
                    {
                        var draftQuestions = dbModuleQuestions.Select(q =>
                                                                      QuestionDraft.Create(
                                                                          ObjectId.GenerateNewId(), draft.Id,
                                                                          q.Text, q.Level, q.Duration,
                                                                          q.Concepts, q.Answers,
                                                                          dbModuleClone.Id, q.SubjectId
                                                                          ).Data
                                                                      );

                        await _db.QuestionDraftCollection.InsertManyAsync(
                            draftQuestions, cancellationToken : cancellationToken
                            );
                    }


                    return(Result.Ok(draft));
                }
                catch (Exception ex)
                {
                    return(Result.Fail <ModuleDraft>(ex.Message));
                }
            }
Example #3
0
            private async Task<ModuleDraft> CreateModuleDraft(ObjectId userId, Contract request, Module originalModule,
                Duration duration, Duration videoDuration, CancellationToken token
            ) {
                var tags = new List<Tag>();
                foreach (var tagStr in request.Tags)
                {
                    var tag = Tag.Create(tagStr);
                    tags.Add(tag.Data);
                }

                var tutorsIds = request.TutorsIds != null ?
                    request.TutorsIds.Select(x => ObjectId.Parse(x)).ToList() :
                    new List<ObjectId>();

                var instructorId = String.IsNullOrEmpty(request.InstructorId) ?
                    ObjectId.Empty : ObjectId.Parse(request.InstructorId);

                var extraInstructorIds = request.ExtraInstructorIds != null ?
                    request.ExtraInstructorIds.Select(x => ObjectId.Parse(x)).ToList() :
                    new List<ObjectId>();

                var moduleId = ObjectId.Parse(request.Id);

                var module = ModuleDraft.Create(
                    moduleId, request.Title, request.Excerpt, request.ImageUrl, request.Published,
                    instructorId, request.Instructor, request.InstructorMiniBio, request.InstructorImageUrl,
                    duration, videoDuration, request.VideoUrl, request.CertificateUrl, request.StoreUrl, request.EcommerceUrl,
                    request.CreateInEcommerce.HasValue ? request.CreateInEcommerce.Value : false,
                    tags, tutorsIds, extraInstructorIds, request.ModuleGradeType
                ).Data;

                module.Subjects = originalModule.Subjects;
                module.Requirements = originalModule.Requirements;
                module.SupportMaterials = originalModule.SupportMaterials;

                await _db.ModuleDraftCollection.InsertOneAsync(
                    module, cancellationToken: token
                );

                var creationLog = AuditLog.Create(userId, moduleId, module.GetType().ToString(),
                    JsonConvert.SerializeObject(module), EntityAction.Add);

                await _db.AuditLogCollection.InsertOneAsync(creationLog);

                var dbModuleQuestions = await _db.QuestionCollection.AsQueryable()
                    .Where(q => q.ModuleId == moduleId)
                    .ToListAsync();

                if (dbModuleQuestions.Count > 0)
                {
                    var draftQuestions = dbModuleQuestions.Select(q =>
                        QuestionDraft.Create(
                            q.Id, module.Id,
                            q.Text, q.Level, q.Duration,
                            q.Concepts, q.Answers,
                            q.ModuleId, q.SubjectId
                        ).Data
                    );

                    await _db.QuestionDraftCollection.InsertManyAsync(
                        draftQuestions, cancellationToken: token
                    );
                }

                return module;
            }
Example #4
0
            public async Task <Result <ModuleDraft> > Handle(Contract request, CancellationToken cancellationToken)
            {
                if (request.UserRole != "Admin" && request.UserRole != "Author")
                {
                    return(Result.Fail <ModuleDraft>("Acesso Negado"));
                }

                var userId = ObjectId.Parse(request.UserId);
                var tags   = new List <Tag>();

                foreach (var tagStr in request.Tags)
                {
                    var tag = Tag.Create(tagStr);
                    tags.Add(tag.Data);
                }

                var tutorsIds = request.TutorsIds != null?
                                request.TutorsIds.Select(x => ObjectId.Parse(x)).ToList() :
                                    new List <ObjectId>();

                var instructorId = String.IsNullOrEmpty(request.InstructorId) ?
                                   ObjectId.Empty : ObjectId.Parse(request.InstructorId);

                var extraInstructorIds = request.ExtraInstructorIds != null?
                                         request.ExtraInstructorIds.Select(x => ObjectId.Parse(x)).ToList() :
                                             new List <ObjectId>();

                Module          dbModule          = null;
                List <Question> dbModuleQuestions = new List <Question>();

                if (!String.IsNullOrEmpty(request.ModuleId))
                {
                    dbModule = await GetModule(request.ModuleId);
                }

                if (dbModule == null)
                {
                    dbModule = Module.Create(
                        request.Title,
                        request.Excerpt,
                        request.Instructor,
                        request.ImageUrl,
                        new List <ObjectId>(),
                        instructorId,
                        new List <SupportMaterial>(),
                        new List <Requirement>(),
                        tags,
                        request.Published ?? false,
                        null,
                        new List <Subject>(),
                        request.CertificateUrl,
                        tutorsIds,
                        extraInstructorIds,
                        request.StoreUrl,
                        request.EcommerceUrl,
                        request.ModuleGradeType,
                        request.ValidFor
                        ).Data;

                    await _db.ModuleCollection.InsertOneAsync(
                        dbModule, cancellationToken : cancellationToken
                        );
                }
                else
                {
                    dbModuleQuestions = await GetModuleQuestions(request.ModuleId);
                }

                var draft = ModuleDraft.Create(
                    dbModule.Id, request.Title, request.Excerpt, request.ImageUrl, request.Published ?? false,
                    instructorId, request.Instructor, request.InstructorMiniBio, request.InstructorImageUrl,
                    null, null, null, request.CertificateUrl, request.StoreUrl, request.EcommerceUrl, request.CreateInEcommerce ?? false,
                    tags, tutorsIds, extraInstructorIds, request.ModuleGradeType
                    ).Data;

                var newDraftList = new List <ModuleDraft>
                {
                    draft
                };

                await _db.ModuleDraftCollection.InsertOneAsync(
                    draft, cancellationToken : cancellationToken
                    );

                var creationLog = AuditLog.Create(userId, draft.Id, draft.GetType().ToString(),
                                                  JsonConvert.SerializeObject(newDraftList), EntityAction.Add);

                await _db.AuditLogCollection.InsertOneAsync(creationLog);

                if (dbModuleQuestions.Count > 0)
                {
                    var draftQuestions = dbModuleQuestions.Select(q =>
                                                                  QuestionDraft.Create(
                                                                      q.Id, draft.Id,
                                                                      q.Text, q.Level, q.Duration,
                                                                      q.Concepts, q.Answers,
                                                                      q.ModuleId, q.SubjectId
                                                                      ).Data
                                                                  );

                    await _db.QuestionDraftCollection.InsertManyAsync(
                        draftQuestions, cancellationToken : cancellationToken
                        );
                }

                return(Result.Ok(draft));
            }
Example #5
0
            public async Task <Result> Handle(Contract request, CancellationToken cancellationToken)
            {
                if (request.UserRole == "Secretary")
                {
                    return(Result.Fail("Acesso Negado"));
                }

                var moduleId = ObjectId.Parse(request.ModuleId);
                var module   = await _db.ModuleDraftCollection.AsQueryable()
                               .Where(x => (
                                          x.DeletedAt == null || x.DeletedAt == DateTimeOffset.MinValue
                                          ) && !x.DraftPublished && (
                                          x.Id == moduleId || x.ModuleId == moduleId
                                          )
                                      )
                               .FirstOrDefaultAsync(cancellationToken: cancellationToken);

                if (module == null)
                {
                    var originalModule = await GetModule(request.ModuleId);

                    if (originalModule == null)
                    {
                        return(Result.Fail("Módulo não existe"));
                    }

                    module = await CreateModuleDraft(
                        request, originalModule, cancellationToken
                        );
                }

                var subjectConceptDictionary = new Dictionary <string, List <string> >();

                foreach (var subject in module.Subjects)
                {
                    var subjectConcepts = subject.Concepts.Select(x => x.Name).ToList();
                    subjectConceptDictionary.Add(subject.Id.ToString(), subjectConcepts);
                }

                var questions = new List <QuestionDraft>();

                request.File = request.File.Substring(request.File.IndexOf(",", StringComparison.Ordinal) + 1);
                Byte[] bytes = Convert.FromBase64String(request.File);
                using (Stream stream = new MemoryStream(bytes))
                {
                    using (var xlPackage = new ExcelPackage(stream))
                    {
                        var baseWorksheet = xlPackage.Workbook.Worksheets[0];
                        var currentLine   = 2;

                        while (baseWorksheet.Cells[currentLine, 1].Value != null)
                        {
                            /*
                             *  IDExterno Assunto
                             *  ID Nível
                             *  Descrição Questão
                             *  Tempo médio de Resposta em minutos
                             *  Resposta 1
                             *  Valor Resposta 1
                             *  Conceitos certos Resposta 1
                             *  Resposta 2
                             *  Valor Resposta 2
                             *  Conceitos certos Resposta 2
                             *  Resposta 3
                             *  Valor Resposta 3
                             *  Conceitos certos Resposta 3
                             *  Resposta 4
                             *  Valor Resposta 4
                             *  Conceitos certos Resposta 4
                             *  Resposta 5
                             *  Valor Resposta 5
                             *  Conceitos certos Resposta 5
                             */

                            var subjectId = baseWorksheet.Cells[currentLine, 1].Value.ToString();

                            if (!subjectConceptDictionary.ContainsKey(subjectId))
                            {
                                return(Result.Fail <bool>("Assunto não encontrado"));
                            }
                            var subjectConcepts =
                                subjectConceptDictionary[subjectId];

                            var quest = new AddOrModifyQuestionCommand.Contract();
                            if (!int.TryParse(baseWorksheet.Cells[currentLine, 2].Value.ToString(), out int level))
                            {
                                var availableLevels = Level.GetLevels().Data.Select(x => x.Id.ToString())
                                                      .Aggregate((x, y) => x + "," + y);
                                return(Result.Fail <bool>(
                                           $"Não foi possível definir o nível de dificuldade da pergunta da linha {currentLine}. Valores possíveis são ({availableLevels})"));
                            }
                            quest.Level = level;

                            quest.Text = baseWorksheet.Cells[currentLine, 3].Value?.ToString();
                            if (quest.Text == null || quest.Text.Length < 10)
                            {
                                return(Result.Fail <bool>(
                                           $"Texto da pergunta da linha {currentLine} não pode ser menor que 10 caracteres"));
                            }

                            var durationStr = baseWorksheet.Cells[currentLine, 4].Value?.ToString();
                            if (durationStr != null && int.TryParse(durationStr, out int duration))
                            {
                                quest.Duration = duration;
                            }

                            if (baseWorksheet.Cells[currentLine, 5].Value != null)
                            {
                                var answer1 =
                                    this.getAnswerFromWorksheet(baseWorksheet, currentLine, 5, "Resposta 1");
                                if (answer1.IsFailure)
                                {
                                    return(Result.Fail <bool>(answer1.Error));
                                }
                                quest.Answers.Add(answer1.Data);
                            }

                            if (baseWorksheet.Cells[currentLine, 8].Value != null)
                            {
                                var answer2 =
                                    this.getAnswerFromWorksheet(baseWorksheet, currentLine, 8, "Resposta 2");
                                if (answer2.IsFailure)
                                {
                                    return(Result.Fail <bool>(answer2.Error));
                                }
                                quest.Answers.Add(answer2.Data);
                            }

                            if (baseWorksheet.Cells[currentLine, 11].Value != null)
                            {
                                var answer3 =
                                    this.getAnswerFromWorksheet(baseWorksheet, currentLine, 11, "Resposta 3");
                                if (answer3.IsFailure)
                                {
                                    return(Result.Fail <bool>(answer3.Error));
                                }
                                quest.Answers.Add(answer3.Data);
                            }

                            if (baseWorksheet.Cells[currentLine, 14].Value != null)
                            {
                                var answer4 =
                                    this.getAnswerFromWorksheet(baseWorksheet, currentLine, 14, "Resposta 4");
                                if (answer4.IsFailure)
                                {
                                    return(Result.Fail <bool>(answer4.Error));
                                }
                                quest.Answers.Add(answer4.Data);
                            }

                            if (baseWorksheet.Cells[currentLine, 17].Value != null)
                            {
                                var answer5 =
                                    this.getAnswerFromWorksheet(baseWorksheet, currentLine, 17, "Resposta 5");
                                if (answer5.IsFailure)
                                {
                                    return(Result.Fail <bool>(answer5.Error));
                                }
                                quest.Answers.Add(answer5.Data);
                            }

                            var concepts = quest.Answers.SelectMany(x => x.Concepts).Select(x => x.Concept).Distinct().ToList();
                            quest.Concepts = concepts.ToArray();

                            var notContainedConcepts = concepts.Where(x => !subjectConcepts.Contains(x)).ToList();
                            if (notContainedConcepts.Any())
                            {
                                return(Result.Fail <bool>($"Os conceitos ({notContainedConcepts.Aggregate((x, y) => x + "," + y)}) das repostas da linha {currentLine} não estão contidos no assunto"));
                            }

                            // Colocando os conceitos errados da pergunta
                            foreach (var answer in quest.Answers)
                            {
                                var answerConcepts     = answer.Concepts.Select(x => x.Concept);
                                var notPresentConcepts = concepts.Where(x => !answerConcepts.Contains(x)).Select(
                                    x => new AddOrModifyQuestionCommand.ContractAnswerConcept()
                                {
                                    Concept = x.Trim(),
                                    IsRight = false
                                });
                                answer.Concepts.AddRange(notPresentConcepts);
                            }

                            var answers = quest.Answers.Select(x => new Answer(x.Description, x.Points,
                                                                               x.Concepts.Select(y => new AnswerConcept(y.Concept, y.IsRight)).ToList())).ToList();

                            var newObject = QuestionDraft.Create(
                                module.Id, quest.Text, quest.Level,
                                quest.Duration, quest.Concepts, answers,
                                ObjectId.Parse(request.ModuleId), ObjectId.Parse(subjectId)
                                );

                            if (newObject.IsFailure)
                            {
                                return(Result.Fail <bool>($"Erro na linha {currentLine}: {newObject.Error}"));
                            }

                            questions.Add(newObject.Data);

                            currentLine++;
                        }
                    }
                }

                if (!request.AddQuestions)
                {
                    var baseQuestionDraftCollection = await _db.QuestionDraftCollection
                                                      .AsQueryable()
                                                      .Where(x =>
                                                             x.DraftId == module.Id
                                                             )
                                                      .ToListAsync();

                    await _db.QuestionDraftCollection.DeleteManyAsync(x =>
                                                                      x.DraftId == module.Id,
                                                                      cancellationToken : cancellationToken
                                                                      );

                    var deleteLog = AuditLog.Create(ObjectId.Parse(request.UserId), moduleId, baseQuestionDraftCollection.GetType().ToString(),
                                                    JsonConvert.SerializeObject(baseQuestionDraftCollection), EntityAction.Delete);

                    await _db.AuditLogCollection.InsertOneAsync(deleteLog);
                }

                await _db.QuestionDraftCollection.InsertManyAsync(
                    questions, cancellationToken : cancellationToken
                    );

                var creationLog = AuditLog.Create(ObjectId.Parse(request.UserId), moduleId, questions[0].GetType().ToString(),
                                                  JsonConvert.SerializeObject(questions), EntityAction.Add);

                await _db.AuditLogCollection.InsertOneAsync(creationLog);

                return(Result.Ok());
            }
Example #6
0
            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));
            }