예제 #1
0
        public async Task Update_Answers(IStateService stateService, Question entity, QuestionRequest request, Answer answer, AnswerRequest answerRequest)
        {
            var context = TestSetup.SetupContext();
            var service = new QuestionService(context, TestSetup.SetupHttpContext(), stateService);

            answer.QuestionId = entity.Id;

            var newAnswer = new Answer();

            newAnswer.CloneFrom(answer);
            newAnswer.CloneFrom(answerRequest);

            request.Answers.Clear();
            request.Answers.Add(answerRequest);

            entity.Answers.Clear();
            entity.Answers.Add(answer);
            await context.Questions.AddAsync(entity);

            await context.SaveChangesAsync();

            var result = await service.Update(entity.Id, request);

            result.Answers.Should().HaveCount(1);
            result.Answers.First().Should().BeEquivalentTo(answerRequest);
            context.Answers.AsEnumerable().Should().HaveCount(1).And.ContainEquivalentOf(result.Answers.First());
        }
예제 #2
0
        public override async Task <Question> Create(QuestionRequest entity, CancellationToken token = default)
        {
            var final = new Question();

            final.CloneFrom(entity);

            final.Answers = entity.Answers.Select(x =>
            {
                var answer = new Answer();
                answer.CloneFrom(x);
                return(answer);
            }).ToList();

            var result = await SafeExecute(async set => await set.AddAsync(final, token), token);

            if (result?.Entity == null)
            {
                return(null);
            }

            var subject = await Context.Subjects.FirstOrDefaultAsync(x =>
                                                                     x.Modules.Any(module => module.Concepts.Any(concept => concept.Exercises.Any(exercise => exercise.Id == result.Entity.ExerciseId)) ||
                                                                                   module.Concepts.Any(concept => concept.Lessons.Any(lesson => lesson.Exercises.Any(exercise => exercise.Id == result.Entity.ExerciseId)))),
                                                                     token
                                                                     );

            await _stateService.UpdateSubjectState(subject?.Id ?? default, token);

            return(result.Entity);
        }
예제 #3
0
        public override async Task <Question> Update(Guid id, QuestionRequest entity, CancellationToken token = default)
        {
            var storedQuestion = await Get(id, token);

            storedQuestion.CloneFrom(entity);

            if (entity.Answers != null)
            {
                var newAnswers = new List <Answer>();

                foreach (var answer in entity.Answers)
                {
                    var newAnswer = new Answer();
                    newAnswer.CloneFrom(answer);
                    newAnswer.Id = Guid.NewGuid();
                    newAnswers.Add(newAnswer);
                }

                storedQuestion.Answers.Clear();
                storedQuestion.Answers.AddRange(newAnswers);
            }

            var result = await SafeExecute(set => set.Update(storedQuestion), token);

            if (result?.Entity == null)
            {
                return(null);
            }

            var subject = await Context.Subjects.FirstOrDefaultAsync(x =>
                                                                     x.Modules.Any(module => module.Concepts.Any(concept => concept.Exercises.Any(exercise => exercise.Id == result.Entity.ExerciseId)) ||
                                                                                   module.Concepts.Any(concept => concept.Lessons.Any(lesson => lesson.Exercises.Any(exercise => exercise.Id == result.Entity.ExerciseId)))),
                                                                     token
                                                                     );

            await _stateService.UpdateSubjectState(subject?.Id ?? default, token);

            return(result.Entity);
        }
예제 #4
0
        public override async Task <Lesson> Update(Guid id, LessonRequest entity, CancellationToken token = default)
        {
            var entry = await Get(id, token);

            var newVersion = new Lesson();

            newVersion.CloneFrom(entry);
            newVersion.CloneFrom(entity);
            newVersion.Version += 1;

            var result = await SafeExecute(async set =>
            {
                // Retrieve all exercises associated to the lesson to clone them and their children
                var exercises = Context.Exercises.Where(exercise => exercise.LessonId == entry.Id && exercise.LessonVersion == entry.Version)
                                .Include(exercise => exercise.Questions)
                                .ThenInclude(question => question.Answers)
                                .ToList();

                newVersion.Exercises = new List <Exercise>(exercises.Count);

                foreach (var exercise in exercises)
                {
                    var newExercise = new Exercise();
                    newExercise.CloneFrom(exercise);

                    newExercise.Id            = default;
                    newExercise.LessonId      = default;
                    newExercise.LessonVersion = default;
                    newExercise.Questions     = new List <Question>(exercise.Questions.Count);

                    foreach (var question in exercise.Questions)
                    {
                        var newQuestion = new Question();
                        newQuestion.CloneFrom(question);

                        newQuestion.Id         = default;
                        newQuestion.ExerciseId = default;
                        newQuestion.Answers    = new List <Answer>(question.Answers.Count);

                        foreach (var answer in question.Answers)
                        {
                            var newAnswer = new Answer();
                            newAnswer.CloneFrom(answer);

                            newAnswer.Id         = Guid.NewGuid();
                            newAnswer.QuestionId = default;

                            newQuestion.Answers.Add(newAnswer);
                        }

                        newExercise.Questions.Add(newQuestion);
                    }

                    newVersion.Exercises.Add(newExercise);
                }

                return(await set.AddAsync(newVersion, token));
            }, token);

            if (result?.Entity == null)
            {
                return(null);
            }

            var subject = await Context.Subjects.FirstOrDefaultAsync(x => x.Modules.Any(module => module.Concepts.Any(concept => concept.Id == result.Entity.ConceptId)), token);

            await _stateService.UpdateSubjectState(subject?.Id ?? default, token);

            return(result.Entity);
        }