/// <summary> /// Overload of SaveAnswer for a multiple choice question. /// It will verify if the user is the owner and if the already answer exists. /// Create a new answer in case of it is required, or save the values in the /// existing answer. /// </summary> /// <param name="answer">Answer to be persisted</param> /// <returns></returns> public ResultOperation SaveAnswer(MultipleChoiceAnswerView answer) { //It calls the method SaveAnswer that has a default routine for saving, and //gives two delegates, the first to be executed in case of Inclusion and the //second in case of Update. return(this.SaveAnswer(answer, repository => { var newAnswer = new Domain.MultipleChoiceAnswer() { MultipleChoice_Choices = new List <Choice>() }; for (int i = 0; i < answer.IdAnswers.Count; i++) { newAnswer.MultipleChoice_Choices.Add(new Choice() { // ensure that the choice exists IdChoice = repository.GetMultipleChoiceOption(answer.IdAnswers[i]).Id }); } return newAnswer; }, (repository, updatedItem) => { //in case of update Domain.MultipleChoiceAnswer multipleChoiceAnswer = repository.GetMultipleChoiceAnswer(updatedItem.Id); var deleted = multipleChoiceAnswer.MultipleChoice_Choices.Where( r => !answer.IdAnswers.Contains(r.IdChoice) ).ToList(); foreach (var item in answer.IdAnswers.Where(r => !multipleChoiceAnswer.MultipleChoice_Choices.Any(choice => choice.IdChoice == r))) { multipleChoiceAnswer.MultipleChoice_Choices.Add ( new Choice() { // ensure that the choice exists IdChoice = repository.GetMultipleChoiceOption(item).Id } ); } if (deleted != null && deleted.Any()) { deleted.ForEach(r => multipleChoiceAnswer.MultipleChoice_Choices.Remove(r)); } return true; })); }
/// <summary> /// Create the specific AnswerView based on the question type. /// Can return a TrueFalseAnswerview, MultipleChoiceAnswerView or OpenEndedAnswerView /// </summary> /// <param name="repository"></param> /// <param name="answer"></param> /// <param name="idQuestion"></param> /// <param name="infoAnswer"></param> /// <returns></returns> private AnswerModelViewBase CreateAnswerModelView(IRepository repository, Answer answer, int idQuestion, Domain.AnswerQuestionOption infoAnswer) { AnswerModelViewBase returnAnswer = null; switch (repository.GetQuestion(idQuestion).QuestionType) { case QuestionType.TrueFalse_Question: returnAnswer = new TrueFalseAnswerView() { Option = (infoAnswer as TrueFalseAnswer).Choice }; break; case QuestionType.Multiple_Choice: returnAnswer = new MultipleChoiceAnswerView() { IdAnswers = new List <int>() }; foreach (var item in repository.GetMultipleChoiceAnswer(answer.Id, idQuestion).MultipleChoice_Choices) { (returnAnswer as MultipleChoiceAnswerView).IdAnswers.Add(item.IdChoice); } break; case QuestionType.Open_Ended: returnAnswer = new OpenEndedAnswerView() { Content = (infoAnswer as OpenEnded).Response }; break; } return(returnAnswer); }