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()); }
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); }