コード例 #1
0
        public async Task <UserPostVoteResponse> Put(UserPostVote request)
        {
            if (request.Id <= 0)
            {
                throw new ArgumentNullException(nameof(request.Id));
            }

            var user = GetUser();
            var post = await AssertPostAsync(request.Id);

            var groupMember = AssertCanAnnotateOnOrganization(Db, post.OrganizationId, user);

            AssertCanAnnotatePost(post, user, groupMember);

            var userId = GetUserId();

            await Db.DeleteAsync <PostVote>(x => x.UserId == userId && x.PostId == request.Id);

            if (request.Weight != 0)
            {
                await Db.InsertAsync(new PostVote
                {
                    UserId  = userId,
                    PostId  = request.Id,
                    Weight  = request.Weight < 0 ? -1 : 1,
                    Created = DateTime.Now,
                });
            }

            await Db.ExecuteSqlAsync(
                @"update post set 
                         up_votes   = (select count(*) from post_vote where post_id = @id and weight > 0), 
                         down_votes = (select count(*) from post_vote where post_id = @id and weight < 0)
                   where id = @id", new { id = request.Id });

            await Db.ExecuteSqlAsync(@"update post 
                set points = GREATEST(1 + (up_votes - down_votes) + points_modifier, 0)
                   where id = @id", new { id = request.Id });

            await Db.ExecuteSqlAsync(
                @"update user_activity set 
                         post_up_votes   = (select count(*) from post_vote v 
                                              join post p on p.id = v.post_id 
                                             where p.user_id = user_activity.id and weight > 0),
                         post_down_votes = (select count(*) from post_vote v 
                                              join post p on p.id = v.post_id 
                                             where p.user_id = user_activity.id and weight < 0)
                   where id = (select user_id from post where id = @id)",
                new { id = request.Id });

            ClearPostCaches();

            return(new UserPostVoteResponse());
        }
コード例 #2
0
        public async Task <int> VoteAsync(UserLoginInfo login, Guid postId, int votes)
        {
            var dbUser = await _users.LoadPrivateUserAsync(login) ?? throw new NullReferenceException("User does not exist");

            var dbVote = await DbContext.UserPostVotes.Where(upv => upv.User == dbUser && upv.PostId == postId).FirstOrDefaultAsync();

            int difference;

            if (dbVote == null)
            {
                difference = votes;
                if (votes != 0)
                {
                    dbVote = new UserPostVote {
                        PostId = postId, User = dbUser, Votes = votes
                    };
                    DbContext.UserPostVotes.Add(dbVote);
                }
            }
            else
            {
                difference = votes - dbVote.Votes;
                if (votes == 0)
                {
                    DbContext.UserPostVotes.Remove(dbVote);
                }
                else
                {
                    dbVote.Votes = votes;
                }
            }

            if (difference != 0)
            {
                await DbContext.Database.ExecuteSqlCommandAsync(
                    "UPDATE \"Posts\" SET \"Votes\" = \"Votes\" + @difference WHERE \"Id\" = @postId",
                    new NpgsqlParameter("@difference", difference),
                    new NpgsqlParameter("@postId", postId)
                    );
            }

            await DbContext.SaveChangesAsync();

            return(difference);
        }