Example #1
0
        public JsonResult Vote(int id, string fingerprint, Collection <string> votes)
        {
            var    currentUser = _orchardServices.WorkContext.CurrentUser;
            string user        = currentUser == null ? "Anonymous" : currentUser.UserName;
            var    poll        = _pollService.GetPoll(id);

            if (poll == null)
            {
                return(Json(new { success = false, error = "Poll doesn't exist!" }));
            }
            if (votes == null || votes.Count == 0)
            {
                return(Json(new { success = false, error = "You have to choose at least 1 option!" }));
            }
            if (votes.Count > poll.MaxVotes)
            {
                return(Json(new { success = false, error = "You have chosen too many options!" }));
            }
            var voteIds = votes.Select(v => int.Parse(v));
            var list    = _pollService.GetChoices(id).Where(c => voteIds.Contains(c.Id));

            if (_votingService.CanVote(id, user, fingerprint))
            {
                // Hvis vi har en MusicPoll, og en choice er uploadet af den samme bruger som stemmer, så hop over
                if (poll.MusicPoll)
                {
                    foreach (var choice in list)
                    {
                        var song = _songService.GetSongByChoiceId(choice.Id);
                        if (song != null)
                        {
                            if (song.SongEditorUserName == user)
                            {
                                // Services.Notifier.Information(@T("Du kan desværre ikke stemme på din egen sang " + song.SongTitle));
                                return(Json(new { success = false, error = "Du kan desværre ikke stemme på din egen sang, " + song.SongTitle + "!" }));
                            }
                        }
                    }
                }

                // Hvis bruger stemmer på den samme sang / choice to gange hurtigt efter hinanden, fx på mobilen, så spring anden gang over
                foreach (var choice in list)
                {
                    if (_pollService.IsVoteDuplicate(poll.Id, user, choice.Id))
                    {
                        return(Json(new { success = false, error = "Du har allerede stemt på " + choice.Answer + "!" }));
                    }
                }

                // TODO: Implementer tilbagemelding til bruger, hvis antallet af stemmer overskrider det tilladte
                // Som det er nu, stopper historien bare ved det sidst tilladte item.
                _votingService.TryVote(id, user, fingerprint, list);
                return(Json(new { success = true }));
            }
            else
            {
                if (_pollService.IsPollClosed(id))
                {
                    return(Json(new { success = false, error = "This poll is closed!" }));
                }
                return(Json(new { success = false, error = "You have already voted!" }));
            }
        }