Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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>());
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        /// <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);
        }
Exemplo n.º 8
0
        /// <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);
        }
Exemplo n.º 9
0
        /// <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);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        /// <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());
        }
Exemplo n.º 12
0
        /// <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);
        }
Exemplo n.º 13
0
 public QuizVM()
 {
     this._quiz = new Domain.Quiz();
 }
Exemplo n.º 14
0
 public QuizVM(Domain.Quiz quiz)
 {
     this._quiz = quiz;
 }
Exemplo n.º 15
0
                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);
                }