[bugfix] fix poll vote count responses on client and fedi API vote creation (#2343)

* increment poll votes *before* enqueuing vote to client API worker

* increment vote counts before federating status update after vote in local poll

* improved vote count calculation during backend -> frontend model conversion
This commit is contained in:
kim
2023-11-08 22:37:35 +00:00
committed by GitHub
parent e9e5dc5a40
commit 34d0879c16
3 changed files with 27 additions and 24 deletions

View File

@ -1310,13 +1310,21 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou
}
var (
options []apimodel.PollOption
totalVotes int
totalVoters int
voteCounts []int
ownChoices []int
isAuthor bool
)
// Preallocate a slice of frontend model poll choices.
options = make([]apimodel.PollOption, len(poll.Options))
// Add the titles to all of the options.
for i, title := range poll.Options {
options[i].Title = title
}
if requester != nil {
// Get vote by requester in poll (if any).
vote, err := c.state.DB.GetPollVoteBy(ctx,
@ -1335,37 +1343,28 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou
// case that counts are hidden.
totalVotes = len(vote.Choices)
totalVoters = 1
for _, choice := range ownChoices {
options[choice].VotesCount++
}
}
// Check if requester is author of source status.
isAuthor = (requester.ID == poll.Status.AccountID)
}
// Preallocate a slice of frontend model poll choices.
options := make([]apimodel.PollOption, len(poll.Options))
// Add the titles to all of the options.
for i, title := range poll.Options {
options[i].Title = title
}
if isAuthor || !*poll.HideCounts {
// A remote status,
// the simple route!
//
// Pull cached remote values.
totalVoters = *poll.Voters
voteCounts = poll.Votes
// Accumulate total from all counts.
for _, count := range poll.Votes {
totalVotes += count
}
totalVoters = (*poll.Voters)
// When this is status author, or hide counts
// is disabled, set the counts known per vote.
for i, count := range voteCounts {
// is disabled, set the counts known per vote,
// and accumulate all the vote totals.
for i, count := range poll.Votes {
options[i].VotesCount = count
totalVotes += count
}
}
@ -1373,7 +1372,7 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou
ID: poll.ID,
ExpiresAt: util.FormatISO8601(poll.ExpiresAt),
Expired: poll.Closed(),
Multiple: *poll.Multiple,
Multiple: (*poll.Multiple),
VotesCount: totalVotes,
VotersCount: totalVoters,
Voted: (isAuthor || len(ownChoices) > 0),