/// <summary> /// Returns the list of publications/answers for a specific quiz. /// </summary> /// <param name="idquiz"></param> /// <param name="urlBase"></param> /// <returns></returns> public QuizViewModel GetPublicationsForQuiz(int idquiz, string urlBase) { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(idquiz); QuizViewModel returnedQuiz = null; if (quiz != null && quiz.Creator == repository.GetUser(this.currentUserId)) { returnedQuiz = new QuizViewModel() { Access = quiz.Access, ExpirationDate = quiz.ExpirationDate, UserIds = new List <string>(), Url = quiz.Url ?? $"{urlBase}/{quiz.Id}/{quiz.Name}", Quiz = new Quiz() { Description = quiz.Description, Id = quiz.Id, Name = quiz.Name } }; if (returnedQuiz.Access == Domain.EnumQuizAccess.Private) { returnedQuiz.UserIds.AddRange(repository.GetUsersIds(quiz)); } } return(returnedQuiz); } }
/// <summary> /// Returns the list of answers for a quiz that the user created. /// </summary> /// <param name="idQuiz"></param> /// <returns></returns> public List <UserAnswerForQuiz> GetQuizesForOwner(int idQuiz) { var returnList = new List <UserAnswerForQuiz>(); if (idQuiz != 0) { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(idQuiz); if (quiz != null && quiz.Creator.Id == currentUserId) { List <Domain.Answer> answers = repository.GetAnswers(quiz); if (answers != null) { foreach (var answer in answers) { returnList.Add(new UserAnswerForQuiz() { Id = answer.Id, AnsweredAt = answer.AnsweredAt, Evaluated = answer.Evaluated, IsOpen = answer.IsOpen, Name = answer.User.UserName }); } } } } } return(returnList); }
/// <summary> /// Creates a PublishedQuiz view model for a quiz. /// </summary> /// <param name="quiz"></param> /// <returns></returns> private PublishedQuiz CreatePublishedQuiz(Domain.Quiz quiz) { if (quiz != null) { return(new PublishedQuiz() { Quiz = new Quiz() { Id = quiz.Id, Name = quiz.Name, Description = quiz.Description }, Questions = quiz.Questions.Select(r => new Question() { Id = r.Id, Description = r.Description, IdQuiz = quiz.Id, ImageURL = r.ImageURL, QuestionType = r.QuestionType }).ToList() }); } return(null); }
/// <summary> /// Get all questions for one specific quiz. /// Returns only if the user is the creator of this quiz. /// The view returned here is for edition mode. /// </summary> /// <param name="idQuiz"></param> /// <returns></returns> public List <Question> GetAll(int idQuiz) { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(idQuiz); if (quiz != null) { if (quiz.Creator == repository.GetUser(this.currentUserId)) { if (quiz.Questions != null) { return(quiz.Questions.Select( r => new Question() { Id = r.Id, Description = r.Description, ImageURL = r.ImageURL, QuestionType = r.QuestionType, IdQuiz = quiz.Id, Options = null }).ToList()); } } } } return(new List <Question>()); }
public ResultOperation SavePublicationForQuiz(QuizViewModel quizModelView) { try { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuizWithAnswers(quizModelView.Quiz.Id); if (quiz != null && quiz.Creator == repository.GetUser(this.currentUserId)) { quiz.IsPublished = true; quiz.Access = quizModelView.Access; quiz.ExpirationDate = quizModelView.ExpirationDate.Value; quiz.Url = quizModelView.Url; if (quizModelView.UserIds != null) { // new users to be added var newUsers = quizModelView.UserIds.Where( r => !quiz.Answers.Any(answer => answer.User.Id == r)).ToList(); quiz.Answers.RemoveAll(r => !quizModelView.UserIds.Contains(r.User.Id)); // Adding new items to the list foreach (var item in newUsers) { quiz.Answers.Add(new Domain.Answer() { IsOpen = true, User = repository.GetUser(item) }); } repository.SaveQuiz(quiz); return(true); } } else { messages.Add("Quiz was not found."); } } } catch (Exception ex) { LogException(ex); messages.Add(DefaultErrorMessage()); } return(messages); }
public override ResultOperation Save(Quiz entity) { try { using (IRepository repository = Repository.Repository.CreateRepository()) { if (VerifyFields(entity)) { Domain.Quiz quiz = null; if (entity.Id != 0) { quiz = repository.GetQuiz(entity.Id); if (quiz == null) { return("Quiz was not found."); } else if (quiz.Creator != repository.GetUser(this.currentUserId)) { return("Quiz was not found."); } } else { quiz = new Domain.Quiz() { Creator = repository.GetUser(this.currentUserId) }; } quiz.Name = entity.Name; quiz.Description = entity.Description; repository.SaveQuiz(quiz); entity.Id = quiz.Id; return(true); } } } catch (Exception ex) { LogException(ex); messages.Add(DefaultErrorMessage()); } return(messages); }
/// <summary> /// If the user is the creator, it saves the question. /// </summary> /// <param name="entity"></param> /// <returns></returns> public override ResultOperation Save(Question entity) { try { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(entity.IdQuiz); if (quiz != null) { if (quiz.Creator == repository.GetUser(this.currentUserId)) { Domain.Question question = new Domain.Question() { Id = entity.Id, Description = entity.Description, ImageURL = entity.ImageURL, QuestionType = entity.QuestionType, Options = entity.GetOptions() }; if (entity.Id == 0) { quiz.Questions.Add(question); } repository.SaveQuestion(question); entity.Id = question.Id; return(true); } } else { messages.Add("quiz was not found."); } } } catch (Exception ex) { LogException(ex); messages.Add(DefaultErrorMessage()); } return(messages); }
/// <summary> /// Implements the default behavior for saving an answer, such as checking /// the ownership of that quiz, identifying the parameters and etc. /// At the end of the execution, this method will delegate the operation to /// one of the functions sent as parameter, depending on the results encontered here. /// </summary> /// <param name="answer">The answer to be persisted</param> /// <param name="insert">The instructions for including a new value</param> /// <param name="update">The instructions for updating a item that is already in the database</param> /// <returns></returns> protected ResultOperation SaveAnswer(AnswerModelViewBase answer, Func <IRepository, AnswerQuestionOption> insert, Func <IRepository, AnswerQuestionOption, bool> update) { try { // Disposing repository to avoid overloading the data context using (IRepository repository = Repository.Repository.CreateRepository()) { // Loading the quiz from the database Domain.Quiz quiz = repository.GetQuiz(answer.Question.IdQuiz); // Loading the answer for that qu iz and for that user Domain.Answer savedAnswer = repository.GetAnswer(quiz.Id, userId); if (savedAnswer.Id == answer.Id) { // If there is no answer, it might mean that someone is trying to send bad data. // We also will allow only changes to quizes that are open and have not been evaluated if (savedAnswer != null && savedAnswer.IsOpen && !savedAnswer.Evaluated) { // Making sure that the question received belongs to that quiz var question = quiz.Questions.FirstOrDefault(r => r.Id == answer.Question.Id); if (question != null) { SaveAnswer(savedAnswer, answer, repository, question, insert, update); } } else { messages.Add("There is no quiz active for this question!"); } } else { messages.Add("There is no quiz active for this question!"); } } } catch (Exception ex) { LogException(ex); messages.Add(DefaultErrorMessage()); } return(messages); }
/// <summary> /// Returns a quiz based on its Id and its creator. /// </summary> /// <param name="id"></param> /// <returns></returns> public override Quiz Get(int id) { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(id); if (quiz != null && quiz.Creator == repository.GetUser(this.currentUserId)) { return(new Quiz() { Id = quiz.Id, Name = quiz.Name, Description = quiz.Description }); } } return(null); }
public List <UserQuizPublish> GetListOfUsersForPublication(int idquiz, string userId) { using (Repository.IRepository repository = QuizAPI.Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(idquiz); if (quiz.Creator.Id == userId) { List <UserQuizPublish> returnList = new List <UserQuizPublish>(); if (quiz != null) { //List of users that have been marked to answer the quiz List <string> usersMarkedToAnswer = repository.GetUsersIds(quiz); //List of users that have an answer in the database for that quiz List <string> usersThatAnswered = repository.GetUsersIds(quiz, true); List <Domain.UserQuiz> users = repository.GetUsers(); foreach (var item in users) { if (item.Id != userId) { returnList.Add(new UserQuizPublish() { IdQuiz = idquiz, IdUser = item.Id, IsMarked = usersMarkedToAnswer.Any(r => r == item.Id), Username = item.UserName, HasAnswered = usersThatAnswered.Any(r => r == item.Id) }); } } } return(returnList); } } return(null); }
/// <summary> /// Identifies if a quiz can be removed, considering /// The logged user; /// If there are any questions; /// Or if there are answers for this quiz. /// </summary> /// <param name="repository"></param> /// <param name="quiz"></param> /// <returns></returns> private bool CanDeleteQuiz(IRepository repository, Domain.Quiz quiz) { if (quiz != null && quiz.Creator == repository.GetUser(this.currentUserId)) { if (quiz.Questions.Any()) { messages.Add("There are questions for this quiz. Please delete the questions before."); } else if (repository.GetAnswers(quiz).Any()) { messages.Add("This quiz has answers, it cannot be removed."); } } else { messages.Add("Item was not found."); } return(!messages.Any()); }
/// <summary> /// Delete a quiz if CanDeleteQuiz returns true. /// </summary> /// <param name="id"></param> /// <returns></returns> public override ResultOperation Delete(int id) { try { using (IRepository repository = Repository.Repository.CreateRepository()) { Domain.Quiz quiz = repository.GetQuiz(id); if (CanDeleteQuiz(repository, quiz)) { repository.DeleteQuiz(quiz); } } } catch (Exception ex) { LogException(ex); messages.Add(DefaultErrorMessage()); } return(messages); }
public QuizVM() { this._quiz = new Domain.Quiz(); }
public QuizVM(Domain.Quiz quiz) { this._quiz = quiz; }
public async Task <QuizDto> Handle(CreateQuizCommand request, CancellationToken cancellationToken) { var category = await _context.Categories .Where(x => x.Id == request.CategoryId) .FirstOrDefaultAsync(); if (category == null) { throw new RestException(HttpStatusCode.NotFound, "Category Not Found"); } var quizToken = "quiz-" + _stringGenerator.RamdomString(25); var quizWithToken = await _context.Quizzes .Where(x => x.QuizToken == quizToken) .FirstOrDefaultAsync(); while (quizWithToken != null) { quizToken = "quiz-" + _stringGenerator.RamdomString(25); quizWithToken = await _context.Quizzes .Where(x => x.QuizToken == quizToken) .FirstOrDefaultAsync(); } var editToken = "edit-" + _stringGenerator.RamdomString(25); var quizWithEditToken = await _context.Quizzes .Where(x => x.EditToken == editToken) .FirstOrDefaultAsync(); while (quizWithEditToken != null) { editToken = "edit-" + _stringGenerator.RamdomString(25); quizWithEditToken = await _context.Quizzes .Where(x => x.EditToken == editToken) .FirstOrDefaultAsync(); } var quiz = new Domain.Quiz { Title = request.Title, Description = request.Description, CreatedAt = DateTime.Now, Category = category, EditToken = editToken, QuizToken = quizToken, NotificationEmail = request.NotificationEmail, PublicAnswer = request.PublicAnswer, PublicQuiz = request.PublicQuiz }; await _context.Quizzes.AddAsync(quiz); if (await _context.SaveChangesAsync() < 1) { throw new RestException(HttpStatusCode.BadRequest, "Error savig changes"); } var mapper = _customMapper.GetMapper(); var quizDto = mapper.Map <QuizDto>(quiz); quizDto.Category = category.Description; return(quizDto); }