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!" })); } }