Пример #1
0
        public async Task <IActionResult> AddOrModifyQuestion([FromBody] AddOrModifyQuestionCommand.Contract request)
        {
            request.UserRole = this.GetUserRole();
            request.UserId   = this.GetUserId();
            var result = await this.Send(request);

            return(RestResult.CreateHttpResponse(result));
        }
Пример #2
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());
            }