Exemplo n.º 1
0
        public async Task <IActionResult> EditTextQuestion(int testId, int questionId,
                                                           [FromBody] AddTextQuestionViewModel model)
        {
            var user = await _userManager.GetUserAsync(HttpContext.User);

            var test = await _context.Tests.SingleOrDefaultAsync(t => t.Id == (int)RouteData.Values["testId"]);

            if (test == null)
            {
                return(NotFound());
            }
            if (test.CreatedBy != user)
            {
                return(Forbid());
            }
            var question = await _context.TextQuestions
                           .AsNoTracking()
                           .SingleAsync(q => q.Id == questionId);

            if (question.TestId != testId)
            {
                return(NotFound());
            }

            model.TestId = test.Id;
            TryValidateModel(model);

            if (ModelState.IsValid)
            {
                // транзакция
                using (var ts = _context.Database.BeginTransaction())
                {
                    // copy question
                    question.Id = 0;

                    _context.TextQuestions.Add(question);
                    await _context.SaveChangesAsync();

                    var questionCopyId = question.Id;

                    // заархивировать
                    var questionOld = await _context.TextQuestions
                                      .SingleAsync(q => q.Id == questionId);

                    questionOld.IsDeleted = true;
                    _context.TextQuestions.Update(questionOld);
                    await _context.SaveChangesAsync();

                    //обновить опшены и копию
                    var questionCopy = await _context.TextQuestions
                                       .SingleAsync(q => q.Id == questionCopyId);

                    questionCopy.TextRightAnswer = model.Options.Single().Text;
                    questionCopy.Title           = model.Title;
                    questionCopy.Score           = model.Score;
                    _context.TextQuestions.Update(questionCopy);


                    await _context.SaveChangesAsync();


                    ts.Commit();
                }

                var redirectUrl = Url.Action("Details", "Test", new { id = test.Id });
                return(new JsonResult(redirectUrl));
            }

            var errors = new List <ModelError>();

            foreach (var modelState in ViewData.ModelState.Values)
            {
                foreach (var error in modelState.Errors)
                {
                    errors.Add(error);
                }
            }

            Response.StatusCode = StatusCodes.Status400BadRequest;
            return(new JsonResult(errors));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> AddTextQuestion([FromBody] AddTextQuestionViewModel model)
        {
            var user = await _userManager.GetUserAsync(HttpContext.User);

            var test = await _context.Tests.SingleOrDefaultAsync(t => t.Id == (int)RouteData.Values["testId"]);

            if (test == null)
            {
                return(NotFound());
            }

            if (test.CreatedBy != user)
            {
                return(Forbid());
            }

            model.TestId = test.Id;
            TryValidateModel(model);
            if (ModelState.IsValid)
            {
                // транзакция
                using (var ts = _context.Database.BeginTransaction())
                {
                    var question = new TextQuestion
                    {
                        Title        = model.Title,
                        QuestionType = Enum.GetName(typeof(Question.QuestionTypeEnum), 3),
                        Test         = test,
                        Score        = model.Score
                    };
                    //создать в базе вопрос
                    var questionCreated = (await _context.AddAsync(question)).Entity;
                    await _context.SaveChangesAsync(); //применить изменения

                    var option = model.Options[0];
                    // добавить в базу Options
                    var optionCreated = (await _context.AddAsync(
                                             new Option {
                        Text = option.Text, Question = questionCreated
                    })).Entity;
                    //questionCreated.Options.Add(optionCreated);
                    questionCreated.TextRightAnswer = optionCreated.Text;
                    // обновить вопрос и применить изменения
                    _context.Questions.Update(questionCreated);
                    await _context.SaveChangesAsync();

                    ts.Commit();
                }

                var redirectUrl = Url.Action("Details", "Test", new { id = test.Id });
                return(new JsonResult(redirectUrl));
            }

            var errors = new List <ModelError>();

            foreach (var modelState in ViewData.ModelState.Values)
            {
                foreach (var error in modelState.Errors)
                {
                    errors.Add(error);
                }
            }
            Response.StatusCode = StatusCodes.Status400BadRequest;
            return(new JsonResult(errors));
        }