public async Task <ActionResult> Put(int id, [FromBody] ApplicationCore.Models.Question question) { try { if (id != question.QuestionId) { return(BadRequest("Question Ids do not match.")); } if (question.QuestionChoices.Count < 4) { return(BadRequest("Question must have at least 4 choices.")); } var existing = await _questionRepo.GetQuestionAsync(id); if (existing is null) { return(NotFound()); } var success = await _questionRepo.EditQuestionAsync(question); if (!success) { return(BadRequest()); } return(NoContent()); } catch { return(BadRequest()); } }
public async Task <ApplicationCore.Models.Question> AddQuestionAsync(ApplicationCore.Models.Question question) { if (question is null) { throw new ArgumentNullException(nameof(question)); } Entities.Question entity = Mapper.Map(question); await _context.Question.AddAsync(entity); await _context.SaveChangesAsync(); //add questionchoices to db foreach (var choice in question.QuestionChoices) { var coreChoice = new ApplicationCore.Models.Choice { QuestionId = entity.QuestionId, Correct = (bool)choice.Correct, ChoiceString = choice.ChoiceString }; await AddChoiceAsync(coreChoice); } await _context.SaveChangesAsync(); return(Mapper.Map(entity)); }
public async Task <bool> EditQuestionAsync(ApplicationCore.Models.Question question) { if (question == null) { throw new ArgumentException(); } try { var existing = await _context.Question .Include(q => q.Choice) .FirstOrDefaultAsync(item => item.QuestionId == question.QuestionId); Entities.Question newQuestion = Mapper.MapQuestionWithChoices(question); _context.Entry(existing).CurrentValues.SetValues(newQuestion); //add choices if they don't exist, or update them if they exist foreach (var choice in question.QuestionChoices) { var existingChoice = existing.Choice .FirstOrDefault(c => c.ChoiceId == choice.ChoiceId); if (existingChoice == null) { existing.Choice.Add(Mapper.MapChoiceWithoutId(choice)); } else { _context.Entry(existingChoice).CurrentValues.SetValues(Mapper.Map(choice)); } } //delete choices not included in request but still in DB foreach (var choice in existing.Choice) { if (!question.QuestionChoices.Any(c => c.ChoiceId == choice.ChoiceId)) { _context.Remove(choice); } } await _context.SaveChangesAsync(); return(true); } catch { return(false); } }
public async Task <IActionResult> Post([FromBody] ApplicationCore.Models.Question question) { if (!ModelState.IsValid) { return(BadRequest()); } if (question.QuestionChoices.Count < 4) { return(BadRequest("Question must have at least 4 choices.")); } if (!await _questionRepo.CategoryExistsAsync((int)question.CategoryId)) { return(BadRequest($"Category with id {question.CategoryId} does not exist.")); } var createdItem = await _questionRepo.AddQuestionAsync(question); return(CreatedAtAction( actionName: nameof(Get), routeValues: new { id = createdItem.QuestionId }, value: createdItem)); }