private HelpfulnessVoteResponse RegisterAnonymousVote(HelpfulnessVoteModel voteModel, ProductReview productReview, Product productPage, bool isHelpful)
        {
            if (productReview.Votes.Any(v => v.IPAddress == voteModel.IPAddress))
            {
                return(new HelpfulnessVoteResponse
                {
                    Type = ProductReviewResponseType.Info,
                    Message = "Already voted",
                    RedirectUrl = "~/" + productPage.LiveUrlSegment
                });
            }

            var vote = new HelpfulnessVote
            {
                IsHelpful     = isHelpful,
                ProductReview = productReview,
                IPAddress     = voteModel.IPAddress
            };

            productReview.Votes.Add(vote);
            _session.Transact(session => session.Save(vote));
            return(new HelpfulnessVoteResponse
            {
                Message = "Vote registered",
                RedirectUrl = "~/" + productPage.LiveUrlSegment,
                Type = ProductReviewResponseType.Success
            });
        }
        private HelpfulnessVoteResponse RegisterLoggedInVote(HelpfulnessVoteModel voteModel, ProductReview productReview, User currentUser, Product productPage, bool isHelpful)
        {
            if (productReview.Votes.Any(v => v.IsHelpful == isHelpful && v.User == currentUser))
            {
                return(new HelpfulnessVoteResponse
                {
                    Type = ProductReviewResponseType.Info,
                    Message = "Already voted",
                    RedirectUrl = "~/" + productPage.LiveUrlSegment
                });
            }
            List <HelpfulnessVote> oppositeVotes =
                productReview.Votes.Where(v => v.IsHelpful != isHelpful && v.User == currentUser).ToList();

            if (oppositeVotes.Any())
            {
                _session.Transact(session => oppositeVotes.ForEach(v =>
                {
                    productReview.Votes.Remove(v);
                    session.Delete(v);
                }));
            }
            var vote = new HelpfulnessVote
            {
                IsHelpful     = isHelpful,
                User          = currentUser,
                ProductReview = productReview,
                IPAddress     = voteModel.IPAddress
            };

            productReview.Votes.Add(vote);
            _session.Transact(session => session.Save(vote));
            return(new HelpfulnessVoteResponse
            {
                Message = "Vote registered",
                RedirectUrl = "~/" + productPage.LiveUrlSegment,
                Type = ProductReviewResponseType.Success
            });
        }