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()); }
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); }
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); }
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); }