public async Task <IActionResult> PutCustomTest(int id, CustomTestDto customTest)
        {
            if (User?.Identity.Name == null || !string.Equals(User.Identity.Name, customTest.AuthorUsername, StringComparison.OrdinalIgnoreCase))
            {
                return(Unauthorized());
            }

            if (id != customTest.Id)
            {
                return(BadRequest());
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var updateSucceed = await TryUpdateCustomTest(customTest);

            if (!updateSucceed)
            {
                return(BadRequest());
            }

            var removeSucceed = await TryRemoveCustomTestResults(customTest.Id);

            if (!removeSucceed)
            {
                return(BadRequest());
            }

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!CustomTestExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
        public async Task <ActionResult <CustomTestDto> > PostCustomTest(CustomTestDto customTest)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var customTestDbModel = _customTestMapper.ToDbModel(customTest);
            await _context.TestsSet.AddAsync(customTestDbModel);

            await _context.SaveChangesAsync();

            var createdCustomTest = _context.TestsSet.OrderByDescending(e => e.Id).First();

            return(CreatedAtAction(nameof(GetCustomTest), new { id = createdCustomTest.Id }, _customTestMapper.ToDto(createdCustomTest)));
        }
 public CustomTestDbModel ToDbModel(CustomTestDto item)
 {
     if (item.Id == 0)
     {
         return(new CustomTestDbModel
         {
             Questions = _customQuestionMapper.ToDbModelList(item.Questions), Name = item.Name,
             Topic = item.Topic,
             Description = item.Description, AuthorUsername = item.AuthorUsername
         });
     }
     else
     {
         return(new CustomTestDbModel
         {
             Questions = _customQuestionMapper.ToDbModelList(item.Questions), Id = item.Id, Name = item.Name,
             Topic = item.Topic, Description = item.Description, AuthorUsername = item.AuthorUsername
         });
     }
 }
        private async Task <bool> TryUpdateCustomTest(CustomTestDto customTest)
        {
            try
            {
                var customTestDbModel = _customTestMapper.ToDbModel(customTest);

                var questionDbModelsToAdd = customTestDbModel.Questions.Where(e => e.Id == 0).ToList();
                if (questionDbModelsToAdd.Count != 0)
                {
                    await _context.QuestionsSet.AddRangeAsync(questionDbModelsToAdd);
                }

                var questionIdsList = await _context.QuestionsSet.Where(e => e.TestId == customTestDbModel.Id)
                                      .Select(e => e.Id).ToListAsync();

                foreach (var questionId in questionIdsList)
                {
                    if (customTestDbModel.Questions.Any(e => e.Id == questionId))
                    {
                        var questionDbModelToUpdate =
                            customTestDbModel.Questions.First(e => e.Id == questionId);
                        var answerDbModelsToAdd = questionDbModelToUpdate.Answers
                                                  .Where(e => e.Id == 0 && e.QuestionId != 0)
                                                  .ToList();
                        if (answerDbModelsToAdd.Count != 0)
                        {
                            await _context.AnswersSet.AddRangeAsync(answerDbModelsToAdd);
                        }

                        var answerIdsList = await _context.AnswersSet
                                            .Where(e => e.QuestionId == questionDbModelToUpdate.Id).Select(e => e.Id)
                                            .ToListAsync();

                        foreach (var answerId in answerIdsList)
                        {
                            if (questionDbModelToUpdate.Answers.Any(e => e.Id == answerId))
                            {
                                var answerDbModelToUpdate =
                                    questionDbModelToUpdate.Answers.First(e => e.Id == answerId);
                                _context.Entry(answerDbModelToUpdate).State = EntityState.Modified;
                            }
                            else
                            {
                                var answerDbModelToRemove = await _context.AnswersSet.FindAsync(answerId);

                                _context.AnswersSet.Remove(answerDbModelToRemove);
                            }
                        }

                        _context.Entry(questionDbModelToUpdate).State = EntityState.Modified;
                    }
                    else
                    {
                        var questionDbModelToRemove = await _context.QuestionsSet.Where(e => e.Id == questionId)
                                                      .Include(e => e.Answers).FirstOrDefaultAsync();

                        _context.QuestionsSet.Remove(questionDbModelToRemove);
                    }
                }

                _context.Entry(customTestDbModel).State = EntityState.Modified;
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }