コード例 #1
0
 protected override void UpdateCache(VoteResponse result)
 {
     if (result.Success)
     {
         //update cache somehow
     }
 }
コード例 #2
0
        /// <summary>
        /// Vote Implementation
        /// </summary>
        /// <param name="vote"></param>
        /// <returns></returns>
        internal async Task <VoteResponse> VoteAction(VoteMessage vote)
        {
            return(await Task.Run(async() =>
            {
                var data_req = JsonConvert.SerializeObject(vote);
                var content = new StringContent(data_req, Encoding.UTF8, "application/json");

                var handler = new HttpClientHandler();
                handler.ServerCertificateCustomValidationCallback =
                    HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
                handler.AllowAutoRedirect = true;
                using (var client = new HttpClient(handler))
                {
                    client.BaseAddress = new Uri("https://localhost:44380/");
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    var response = await client.PostAsync("api/Identity/Vote", content);
                    var voteresponse = new VoteResponse();
                    try
                    {
                        var data_resp = await response.Content.ReadAsStringAsync();

                        voteresponse = JsonConvert.DeserializeObject <VoteResponse>(data_resp);
                    }
                    catch (Exception e)
                    {
                        logger.Error(e, "Vote error");
                    }

                    return voteresponse;
                }
            }));
        }
コード例 #3
0
        private void rejectVote(VoteRequest request, AcceptorState state)
        {
            VoteStatus   voteStatus = VoteStatus.Rejected;
            VoteResponse response   = generateVoteResponse(state, request, voteStatus);

            sendVoteResponse(request.MessageSender, response);
        }
コード例 #4
0
 private void storePreviousAcceptedValuesFromAcceptors(LeaderState state, VoteResponse responseDecision)
 {
     if (responseDecision != null)
     {
         state.ValuesAcceptedByAcceptors.Add(responseDecision);
     }
 }
コード例 #5
0
        private static ManageVoteResponseModel CreateManageVoteResponse(Ballot ballot)
        {
            var model = new ManageVoteResponseModel
            {
                BallotManageGuid = ballot.ManageGuid,
                Votes            = new List <VoteResponse>()
            };

            if (ballot.VoterName != null)
            {
                model.VoterName = ballot.VoterName;
            }

            foreach (Vote vote in ballot.Votes)
            {
                var voteResponse = new VoteResponse
                {
                    ChoiceNumber = vote.Choice.PollChoiceNumber,
                    Value        = vote.VoteValue,
                    ChoiceName   = vote.Choice.Name
                };
                model.Votes.Add(voteResponse);
            }

            return(model);
        }
コード例 #6
0
        public void VoteOnResponse(VoteResponse v)
        {
            Response r = _ctx.Responses.FirstOrDefault(x => x.Id == v.ResponseId);

            r.Popularity += v.Value;
            _ctx.Responses.Update(r);
            _ctx.SaveChanges();
        }
コード例 #7
0
            public void PollWithBallotsWithVotes_ReturnsAll()
            {
                var          manageGuid = new Guid("A76287F6-BC56-421C-9294-A477D1E9C4B3");
                const string voterName  = "Derek";

                const int    optionNumber = 1;
                const string optionName   = "Value?";
                const int    optionValue  = 23;

                IDbSet <Poll> existingPolls = DbSetTestHelper.CreateMockDbSet <Poll>();
                var           poll          = new Poll()
                {
                    ManageId = PollManageGuid
                };

                var ballot = new Ballot()
                {
                    ManageGuid = manageGuid,
                    VoterName  = voterName,
                    TokenGuid  = new Guid("1AC3FABB-A077-4EF3-84DC-62074BA8FDF1")
                };

                var vote = new Vote()
                {
                    Choice = new Choice()
                    {
                        PollChoiceNumber = optionNumber,
                        Name             = optionName
                    },
                    VoteValue = optionValue
                };


                ballot.Votes.Add(vote);
                poll.Ballots.Add(ballot);
                existingPolls.Add(poll);

                IContextFactory       contextFactory = ContextFactoryTestHelper.CreateContextFactory(existingPolls);
                ManageVoterController controller     = CreateManageVoteController(contextFactory);


                List <ManageVoteResponseModel> response = controller.Get(PollManageGuid);


                Assert.AreEqual(1, response.Count);

                ManageVoteResponseModel responseBallot = response[0];

                Assert.AreEqual(manageGuid, responseBallot.BallotManageGuid);
                Assert.AreEqual(voterName, responseBallot.VoterName);
                Assert.AreEqual(1, responseBallot.Votes.Count);

                VoteResponse responseVote = responseBallot.Votes[0];

                Assert.AreEqual(optionName, responseVote.ChoiceName);
                Assert.AreEqual(optionValue, responseVote.Value);
                Assert.AreEqual(optionNumber, responseVote.ChoiceNumber);
            }
コード例 #8
0
ファイル: Vote.cs プロジェクト: Ysovuka/DhtNet
        public override void Handle(DhtEngine engine, Node node)
        {
            base.Handle(engine, node);

            BEncodedString token    = engine.TokenManager.GenerateToken(node);
            VoteResponse   response = new VoteResponse(engine.RoutingTable.LocalNode.Id, TransactionId, token);

            engine.MessageLoop.EnqueueSend(response, node.EndPoint);
        }
コード例 #9
0
ファイル: Backend.cs プロジェクト: auxua/Qurvey
        /// <summary>
        /// Gets the vote for a user-survey pair. Returns null if the user hasnt voted on this survey
        /// </summary>
        /// <returns>The vote. Null if not-existing</returns>
        /// <param name="survey">The survey.</param>
        /// <param name="user">The User</param>
        public async static Task <Vote> GetVoteForUserAsync(Survey survey, User user)
        {
            VoteResponse res = await CallBackendAsync <VoteResponse>("getvoteforuser", new GetVoteForUserRequest(survey, user));

            if (!string.IsNullOrEmpty(res.ExceptionMessage))
            {
                throw new Exception(res.ExceptionMessage);
            }
            return(res.Vote);
        }
コード例 #10
0
ファイル: Leader.cs プロジェクト: JulienDollon/CSharpPaxos
        private void notifyAllReplicasOfElectedValue(VoteResponse message)
        {
            ProposalDecision decision = new ProposalDecision(message);

            decision.Command = this.currentState.ProposalsBySlotId[message.SlotNumber];
            foreach (MessageSender replica in this.currentState.Replicas)
            {
                this.MessageBroker.SendMessage(replica.UniqueId, decision);
            }
        }
コード例 #11
0
        private VoteResponse generateVoteResponse(AcceptorState state, VoteRequest request, VoteStatus voteStatus)
        {
            VoteResponse response = new VoteResponse
            {
                BallotNumber  = state.BallotNumber,
                MessageSender = state.MessageSender,
                SlotNumber    = request.SlotNumber,
                VoteStatus    = voteStatus
            };

            return(response);
        }
コード例 #12
0
    public void Upvote(int tabIndex)
    {
        if (!this.PreCheck())
        {
            return;
        }
        if (this.Upvoting)
        {
            MsgController.ShowMsg(SFST.T.Sharing_Wait_Request);
            return;
        }
        string ID = this.pages[tabIndex].ID;

        this.Upvoting = true;
        VotePacket toSend = new VotePacket
        {
            vote   = true,
            voteOn = ID
        };

        GameTracker.Tracker.client.AuthedRequest(toSend, delegate(DefaultPacket r)
        {
            SyncContext.RunOnUI(delegate
            {
                if (r.Success)
                {
                    VoteResponse voteResponse = r.ToTargetPacket <VoteResponse>();
                    Debug.Log(voteResponse.Action);
                    if (voteResponse.Action == "VOTE_PLACED")
                    {
                        MsgController.ShowMsg(SFST.T.Sharing_Vote_Placed);
                    }
                    else
                    {
                        MsgController.ShowMsg(SFST.T.Sharing_Vote_Revoked);
                    }
                    this.ReloadPage(delegate
                    {
                        RocketPost post = this.GetPost(ID);
                        if (post != null)
                        {
                            post.PlayAnimation();
                        }
                    });
                }
                else
                {
                    MsgController.ShowMsg(SFST.T.Sharing_Vote_Failed);
                }
                this.Upvoting = false;
            });
        });
    }
コード例 #13
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]
            VoteRequest Request,
            HttpRequest req,
            ILogger log
            )
        {
            string Error   = "";
            string Content = "";

            try
            {
                IPAddress result = null;
                if (req.Headers.TryGetValue("X-Forwarded-For", out StringValues values))
                {
                    var ipn = values.FirstOrDefault().Split(new char[] { ',' }).FirstOrDefault().Split(new char[] { ':' }).FirstOrDefault();
                    IPAddress.TryParse(ipn, out result);
                }
                if (result == null)
                {
                    result = req.HttpContext.Connection.RemoteIpAddress;
                }
                string IP = result?.ToString();


                var VoteSuccessful = ComicRepository.Vote(Request.EpisodeNumber, Request.EpisodeSubNumber, Request.StarRating, IP);
                return(new JsonResult(new VoteResponse()
                {
                    Successful = VoteSuccessful
                }));
            }
            catch (UnsupportedMediaTypeException ex)
            {
                log.LogError(ex, "Unsupported media type returned");
                Error = "Unsupported Media Type: " + ex.Message + "|" + ex.StackTrace;
            }
            catch (Exception ex)
            {
                log.LogError(ex.Message);
                Error = "Error.  Content: " + Content + ", " + ex.Message + "|" + ex.StackTrace;
            }

            var ErrorResponse = new VoteResponse()
            {
                Successful = false,
                Error      = Error
            };

            return(new JsonResult(ErrorResponse));
        }
コード例 #14
0
ファイル: PostServiceTests.cs プロジェクト: dzenplay1/Forum
        public async Task UnVote_ShouldReturnResponceSuccessFalse_WhenPostDoesNotExist()
        {
            //Arange
            var postId = Guid.NewGuid().ToString();
            var userId = Guid.NewGuid().ToString();

            _postRepoMock.Setup(x => x.GetAsync(postId)).ReturnsAsync(() => null);

            //Act
            VoteResponse vr = await _sut.UnVote(postId, userId);

            //Assert
            Assert.False(vr.Success);
            Assert.Equal("Post not found.", vr.Message);
        }
コード例 #15
0
        private void acceptVote(VoteRequest request, AcceptorState state)
        {
            VoteResponse vote = new VoteResponse()
            {
                BallotNumber = request.BallotNumber,
                SlotNumber   = request.SlotNumber,
                Command      = request.Command
            };

            state.LastAcceptedVote = vote;

            VoteStatus   voteStatus = VoteStatus.Accepted;
            VoteResponse response   = generateVoteResponse(state, request, voteStatus);

            sendVoteResponse(request.MessageSender, response);
        }
コード例 #16
0
        public IActionResult MarkSolution([FromForm] VoteResponse r)
        {
            _service.MarkSolution(r.ResponseId);
            var origQ        = _service.GetQuestionById(r.QuestionId);
            var qResponses   = _service.GetRelatedResponses(origQ.Id);
            var viewQuestion = new QuestionForView
            {
                Id         = origQ.Id,
                Title      = origQ.Title,
                Body       = origQ.Body,
                UserId     = origQ.UserId,
                Popularity = origQ.Popularity,
                Responses  = qResponses
            };

            return(View("Details", viewQuestion));
        }
コード例 #17
0
ファイル: VoteManager.cs プロジェクト: kyapp69/BigDataBushido
    public static void QueryVotes(bool eventChoice)
    {
        ParseQuery <ParseObject> query = ParseObject.GetQuery("Vote")
                                         .WhereGreaterThan("createdAt", instance._lastTime);

        query.FindAsync().ContinueWith(t =>
        {
            instance.ResetVotes();

            instance.winningVote = VoteResponse.Tie;
            int mostVotes        = 0;

            IEnumerable <ParseObject> results = t.Result;
            foreach (ParseObject vote in results)
            {
                if (!instance._countedVotes.Contains(vote.ObjectId))
                {
                    instance._countedVotes.Add(vote.ObjectId);

                    VoteResponse voteType = (VoteResponse)Enum.Parse(typeof(VoteResponse), vote.Get <String>("vote"));

                    if ((eventChoice && (voteType != VoteResponse.Yes || voteType != VoteResponse.No)) ||
                        (!eventChoice && (voteType != VoteResponse.No && voteType != VoteResponse.Yes)))
                    {
                        ++instance._votes[voteType];

                        int voteCount = instance._votes[voteType];
                        if (voteCount > mostVotes)
                        {
                            instance.winningVote = voteType;
                            mostVotes            = voteCount;
                        }
                        else if (voteCount == mostVotes)
                        {
                            instance.winningVote = VoteResponse.Tie;
                        }
                    }
                }
            }

            instance._votesDirty = true;
        });
    }
コード例 #18
0
        //辩题详情
        public VoteResponse Detail(int id)
        {
            VoteResponse response = null;

            try
            {
                var detail = _dbContext.Get <t_sys_vote>(id);
                if (detail != null)
                {
                    response = new VoteResponse
                    {
                        Id            = detail.id,
                        UpdateTime    = detail.updatetime,
                        CreateTime    = detail.createtime,
                        Remark        = detail.remark,
                        Title         = detail.title,
                        VoteEndTime   = detail.voteEndTime,
                        VoteStartTime = detail.voteStartTime
                    };

                    var votedetail = _dbContext.Select <t_sys_vote_detail>(c => c.voteId == id).ToList();
                    if (votedetail != null && votedetail.Count > 0)
                    {
                        foreach (var item in votedetail)
                        {
                            response.VoteDetail.Add(new VoteDetailResponse
                            {
                                Id            = item.id,
                                NumberOfVotes = item.numberOfVotes,
                                Title         = item.title,
                                VoteId        = item.voteId
                            });
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtils.LogError("VoteService.Detail", ex);
            }
            return(response);
        }
コード例 #19
0
        public async Task <JsonResult> Vote(Domain.Models.ContentType contentType, int id, int voteStatus)
        {
            VoteResponse result = null;

            switch (contentType)
            {
            case Domain.Models.ContentType.Submission:
                var cmdV = new SubmissionVoteCommand(id, voteStatus, IpHash.CreateHash(Request.RemoteAddress())).SetUserContext(User);
                result = await cmdV.Execute();

                break;

            case Domain.Models.ContentType.Comment:
                var cmdC = new CommentVoteCommand(id, voteStatus, IpHash.CreateHash(Request.RemoteAddress())).SetUserContext(User);
                result = await cmdC.Execute();

                break;
            }
            return(Json(result));
        }
コード例 #20
0
ファイル: PostServiceTests.cs プロジェクト: dzenplay1/Forum
        public async Task UnVote_ShouldReturnResponseSuccessFalse_WhenUserDidNotVote()
        {
            //Arange
            var  postId = Guid.NewGuid().ToString();
            var  userId = Guid.NewGuid().ToString();
            Vote vote   = new Vote
            {
                Id     = Guid.NewGuid().ToString(),
                UserId = userId,
                PostId = postId
            };

            _postRepoMock.Setup(x => x.GetAsync(postId)).ReturnsAsync(new Post());
            _voteRepoMock.Setup(x => x.FindInstance(postId, userId)).ReturnsAsync(() => null);

            //Act
            VoteResponse vr = await _sut.UnVote(postId, userId);

            //Assert
            Assert.False(vr.Success);
            Assert.Equal("You did not vote.", vr.Message);
        }
コード例 #21
0
ファイル: PostServiceTests.cs プロジェクト: dzenplay1/Forum
        public async Task UnVote_ShouldReturnResponseSuccessTrue_WhenUserSuccessfulyUnVote()
        {
            //Arange
            var  postId = Guid.NewGuid().ToString();
            var  userId = Guid.NewGuid().ToString();
            Vote vote   = new Vote
            {
                Id     = Guid.NewGuid().ToString(),
                UserId = userId,
                PostId = postId
            };

            _postRepoMock.Setup(x => x.GetAsync(postId)).ReturnsAsync(new Post());
            _voteRepoMock.Setup(x => x.FindInstance(postId, userId)).ReturnsAsync(vote);

            //Act
            VoteResponse vr = await _sut.UnVote(postId, userId);

            //Assert
            Assert.True(vr.Success);
            Assert.Equal(postId, vr.Resource.PostId);
            Assert.Equal(userId, vr.Resource.UserId);
        }
コード例 #22
0
        public void Execute(MessageStrategyExecuteArg <IMessage> obj)
        {
            if (!(obj.Message is VoteResponse))
            {
                throw new MessageStrategyException("This strategy shouldn't be invoked with this message type");
            }

            VoteResponse response = obj.Message as VoteResponse;
            LeaderState  state    = obj.RoleState as LeaderState;

            state.VoteRequestPendingDecisionPerSlot[response.SlotNumber].Remove(response.MessageSender);

            if (isBallotValid(response.BallotNumber, state.BallotNumber))
            {
                if (isElected(response, state))
                {
                    OnApprovalElected?.Invoke(this, response);
                }
            }
            else
            {
                OnApprovalPreempted?.Invoke(this, EventArgs.Empty);
            }
        }
コード例 #23
0
 private Vote ToModel(VoteResponse obj) => new Vote(
     count: obj.Count,
     optionName: obj.OptionName
     );
コード例 #24
0
 private bool isElected(VoteResponse response, LeaderState state)
 {
     return(state.VoteRequestPendingDecisionPerSlot[response.SlotNumber].Count < state.Acceptors.Count / 2);
 }
コード例 #25
0
            public void MultiplePolls_ReturnsOnlyRequested()
            {
                Guid otherManageGuid = new Guid("35FC553F-2F0E-49E0-A919-802900262046");

                const string expectedVoterName = "Expected Voter";
                const string otherVoterName    = "Someone else voting";



                const string expectedChoiceName   = "SomeChoice";
                const int    expectedChoiceNumber = 3;

                var expectedChoice = new Choice()
                {
                    PollChoiceNumber = expectedChoiceNumber, Name = expectedChoiceName
                };
                const int expectedVoteValue = 42;

                const int otherChoiceNumber = 1;
                var       otherChoice       = new Choice()
                {
                    PollChoiceNumber = otherChoiceNumber, Name = "Some Other Choice"
                };
                const int otherVoteValue = 16;


                IDbSet <Poll> existingPolls = DbSetTestHelper.CreateMockDbSet <Poll>();

                var poll1 = new Poll()
                {
                    ManageId = PollManageGuid,
                    Ballots  = new List <Ballot>()
                    {
                        CreateBallot(expectedVoterName, CreateVote(expectedChoice, expectedVoteValue))
                    }
                };
                var poll2 =
                    new Poll()
                {
                    ManageId = otherManageGuid,
                    Ballots  = new List <Ballot>()
                    {
                        CreateBallot(otherVoterName, CreateVote(otherChoice, otherVoteValue))
                    }
                };

                existingPolls.Add(poll1);
                existingPolls.Add(poll2);


                IContextFactory       contextFactory = ContextFactoryTestHelper.CreateContextFactory(existingPolls);
                ManageVoterController controller     = CreateManageVoteController(contextFactory);


                List <ManageVoteResponseModel> response = controller.Get(PollManageGuid);

                Assert.AreEqual(1, response.Count);

                ManageVoteResponseModel responseBallot = response[0];

                Assert.AreEqual(expectedVoterName, responseBallot.VoterName);
                Assert.AreEqual(1, responseBallot.Votes.Count);

                VoteResponse responseVote = responseBallot.Votes[0];

                Assert.AreEqual(expectedChoiceName, responseVote.ChoiceName);
                Assert.AreEqual(expectedVoteValue, responseVote.Value);
                Assert.AreEqual(expectedChoiceNumber, responseVote.ChoiceNumber);
            }
コード例 #26
0
 private void sendVoteResponse(MessageSender sendTo, VoteResponse response)
 {
     this.broker.SendMessage(sendTo.UniqueId, response);
 }
コード例 #27
0
        public object Any(Vote request)
        {
            Guid userId = UserSession.GetUserId();

            VoteResponse response = new VoteResponse
            {
                Result = ErrorCode.OK,
            };

            TableRepository tableRepository = new TableRepository();

            UserQuestionEntry userQuestionEntry = tableRepository.Get <UserQuestionEntry>(Tables.UserQuestion, request.QuestionId, userId);

            // Création d'un nouveau vote
            if (userQuestionEntry == null)
            {
                DateTime dateTime = DateTime.UtcNow;
                userQuestionEntry = new UserQuestionEntry(request.QuestionId, userId)
                {
                    Creation     = dateTime,
                    Modification = dateTime
                };
            }
            else
            {
                userQuestionEntry.Modification = DateTime.UtcNow;
            }

            Guid target = request.VoteTarget == VoteTarget.Question ? request.QuestionId : request.OwnerId;

            HashSet <string> votesUp   = new HashSet <string>(userQuestionEntry.VotesUp?.Split('|') ?? new string[] { });
            HashSet <string> votesDown = new HashSet <string>(userQuestionEntry.VotesDown?.Split('|') ?? new string[] { });

            VoteKind oldValue = VoteKind.None;

            if (votesUp.Contains(target.ToString()))
            {
                oldValue = VoteKind.Up;
            }
            else if (votesDown.Contains(target.ToString()))
            {
                oldValue = VoteKind.Down;
            }

            response.VoteKind = request.VoteKind;

            votesUp.Remove(target.ToString());
            votesDown.Remove(target.ToString());

            if (response.VoteKind == oldValue)
            {
                response.VoteKind = VoteKind.None;
            }
            else
            {
                switch (response.VoteKind)
                {
                case VoteKind.Up:
                    votesUp.Add(target.ToString());
                    break;

                case VoteKind.Down:
                    votesDown.Add(target.ToString());
                    break;
                }
            }

            userQuestionEntry.VotesUp   = votesUp.Join("|");
            userQuestionEntry.VotesDown = votesDown.Join("|");

            if (request.VoteTarget == VoteTarget.Answer)
            {
                AnswerEntry answerEntry = tableRepository.Get <AnswerEntry>(Tables.Answers, request.QuestionId, request.OwnerId);
                answerEntry.Votes -= (int)oldValue;
                answerEntry.Votes += (int)response.VoteKind;
                tableRepository.InsertOrMerge(answerEntry, Tables.Answers);
                response.VoteValue = answerEntry.Votes;

                // badges
                if (response.VoteKind == VoteKind.Up)
                {
                    switch (answerEntry.Votes)
                    {
                    case 1: AllBadges.Approved.CreateIfNotExist(tableRepository, answerEntry.GetAnswerOwnerId()); break;

                    case 10: AllBadges.NiceAnswer.CreateForQuestion(tableRepository, answerEntry.GetAnswerOwnerId(), request.QuestionId); break;

                    case 25: AllBadges.GoodAnswer.CreateForQuestion(tableRepository, answerEntry.GetAnswerOwnerId(), request.QuestionId); break;

                    case 100: AllBadges.GreatAnswer.CreateForQuestion(tableRepository, answerEntry.GetAnswerOwnerId(), request.QuestionId); break;
                    }
                }
            }
            else
            {
                QuestionEntry questionEntry = tableRepository.Get <QuestionEntry>(Tables.Questions, request.OwnerId, request.QuestionId);
                questionEntry.Votes -= (int)oldValue;
                questionEntry.Votes += (int)response.VoteKind;
                tableRepository.InsertOrMerge(questionEntry, Tables.Questions);
                response.VoteValue = questionEntry.Votes;

                // badges
                if (response.VoteKind == VoteKind.Up)
                {
                    switch (questionEntry.Votes)
                    {
                    case 1: AllBadges.Padawan.CreateIfNotExist(tableRepository, questionEntry.GetOwnerId()); break;

                    case 10: AllBadges.NiceQuestion.CreateForQuestion(tableRepository, questionEntry.GetOwnerId(), request.QuestionId); break;

                    case 25: AllBadges.GoodQuestion.CreateForQuestion(tableRepository, questionEntry.GetOwnerId(), request.QuestionId); break;

                    case 100: AllBadges.GreatQuestion.CreateForQuestion(tableRepository, questionEntry.GetOwnerId(), request.QuestionId); break;
                    }
                }
            }

            // insert le vote
            tableRepository.InsertOrReplace(userQuestionEntry, Tables.UserQuestion);


            // badges
            if (response.VoteKind == VoteKind.Up)
            {
                AllBadges.Supporter.CreateIfNotExist(tableRepository, userId);
            }
            else if (response.VoteKind == VoteKind.Down)
            {
                AllBadges.Critic.CreateIfNotExist(tableRepository, userId);
            }

            return(response);
        }
コード例 #28
0
ファイル: YaqaapService.cs プロジェクト: Filimindji/YAQAAP
        public object Any(Vote request)
        {
            Guid userId = UserSession.GetUserId();

            VoteResponse response = new VoteResponse
            {
                Result = ErrorCode.OK,
            };

            TableRepository tableRepository = new TableRepository();

            UserQuestionEntry userQuestionEntry = tableRepository.Get<UserQuestionEntry>(Tables.UserQuestion, request.QuestionId, userId);

            // Création d'un nouveau vote
            if (userQuestionEntry == null)
            {
                DateTime dateTime = DateTime.UtcNow;
                userQuestionEntry = new UserQuestionEntry(request.QuestionId, userId)
                {
                    Creation = dateTime,
                    Modification = dateTime
                };
            }
            else
            {
                userQuestionEntry.Modification = DateTime.UtcNow;
            }

            Guid target = request.VoteTarget == VoteTarget.Question ? request.QuestionId : request.OwnerId;

            HashSet<string> votesUp = new HashSet<string>(userQuestionEntry.VotesUp?.Split('|') ?? new string[] { });
            HashSet<string> votesDown = new HashSet<string>(userQuestionEntry.VotesDown?.Split('|') ?? new string[] { });

            VoteKind oldValue = VoteKind.None;
            if (votesUp.Contains(target.ToString()))
                oldValue = VoteKind.Up;
            else if (votesDown.Contains(target.ToString()))
                oldValue = VoteKind.Down;

            response.VoteKind = request.VoteKind;

            votesUp.Remove(target.ToString());
            votesDown.Remove(target.ToString());

            if (response.VoteKind == oldValue) response.VoteKind = VoteKind.None;
            else
            {
                switch (response.VoteKind)
                {
                    case VoteKind.Up:
                        votesUp.Add(target.ToString());
                        break;
                    case VoteKind.Down:
                        votesDown.Add(target.ToString());
                        break;
                }
            }

            userQuestionEntry.VotesUp = votesUp.Join("|");
            userQuestionEntry.VotesDown = votesDown.Join("|");

            if (request.VoteTarget == VoteTarget.Answer)
            {
                AnswerEntry answerEntry = tableRepository.Get<AnswerEntry>(Tables.Answers, request.QuestionId, request.OwnerId);
                answerEntry.Votes -= (int)oldValue;
                answerEntry.Votes += (int)response.VoteKind;
                tableRepository.InsertOrMerge(answerEntry, Tables.Answers);
                response.VoteValue = answerEntry.Votes;

                // badges
                if (response.VoteKind == VoteKind.Up)
                {
                    switch (answerEntry.Votes)
                    {
                        case 1: AllBadges.Approved.CreateIfNotExist(tableRepository, answerEntry.GetAnswerOwnerId()); break;
                        case 10: AllBadges.NiceAnswer.CreateForQuestion(tableRepository, answerEntry.GetAnswerOwnerId(), request.QuestionId); break;
                        case 25: AllBadges.GoodAnswer.CreateForQuestion(tableRepository, answerEntry.GetAnswerOwnerId(), request.QuestionId); break;
                        case 100: AllBadges.GreatAnswer.CreateForQuestion(tableRepository, answerEntry.GetAnswerOwnerId(), request.QuestionId); break;
                    }
                }
            }
            else
            {
                QuestionEntry questionEntry = tableRepository.Get<QuestionEntry>(Tables.Questions, request.OwnerId, request.QuestionId);
                questionEntry.Votes -= (int)oldValue;
                questionEntry.Votes += (int)response.VoteKind;
                tableRepository.InsertOrMerge(questionEntry, Tables.Questions);
                response.VoteValue = questionEntry.Votes;

                // badges
                if (response.VoteKind == VoteKind.Up)
                {
                    switch (questionEntry.Votes)
                    {
                        case 1: AllBadges.Padawan.CreateIfNotExist(tableRepository, questionEntry.GetOwnerId()); break;
                        case 10: AllBadges.NiceQuestion.CreateForQuestion(tableRepository, questionEntry.GetOwnerId(), request.QuestionId); break;
                        case 25: AllBadges.GoodQuestion.CreateForQuestion(tableRepository, questionEntry.GetOwnerId(), request.QuestionId); break;
                        case 100: AllBadges.GreatQuestion.CreateForQuestion(tableRepository, questionEntry.GetOwnerId(), request.QuestionId); break;
                    }
                }
            }

            // insert le vote
            tableRepository.InsertOrReplace(userQuestionEntry, Tables.UserQuestion);

            // badges
            if (response.VoteKind == VoteKind.Up)
                AllBadges.Supporter.CreateIfNotExist(tableRepository, userId);
            else if (response.VoteKind == VoteKind.Down)
                AllBadges.Critic.CreateIfNotExist(tableRepository, userId);

            return response;
        }
コード例 #29
0
 private Vote ToModel(VoteResponse obj) => new Vote
 {
     Count      = obj.Count,
     OptionName = obj.OptionName
 };