send out poll votes as separate create activities given that no other AP servers support multiple objects in a single activity (#3582)

This commit is contained in:
kim
2024-11-28 15:37:37 +00:00
committed by GitHub
parent 3cc50491c2
commit d9f67efae5
3 changed files with 75 additions and 48 deletions

View File

@@ -1701,10 +1701,14 @@ func (c *Converter) ReportToASFlag(ctx context.Context, r *gtsmodel.Report) (voc
// PollVoteToASCreate converts a vote on a poll into a Create
// activity, suitable for federation, with each choice in the
// vote appended as a Note to the Create's Object field.
func (c *Converter) PollVoteToASCreate(
//
// TODO: as soon as other AP server implementations support
// the use of multiple objects in a single create, update this
// to return just the one create event again.
func (c *Converter) PollVoteToASCreates(
ctx context.Context,
vote *gtsmodel.PollVote,
) (vocab.ActivityStreamsCreate, error) {
) ([]vocab.ActivityStreamsCreate, error) {
if len(vote.Choices) == 0 {
panic("no vote.Choices")
}
@@ -1743,22 +1747,25 @@ func (c *Converter) PollVoteToASCreate(
return nil, gtserror.Newf("invalid account uri: %w", err)
}
// Allocate Create activity and address 'To' poll author.
create := streams.NewActivityStreamsCreate()
ap.AppendTo(create, pollAuthorIRI)
// Parse each choice to a Note and add it to the list of Creates.
creates := make([]vocab.ActivityStreamsCreate, len(vote.Choices))
for i, choice := range vote.Choices {
// Create ID formatted as: {$voterIRI}/activity#vote/{$statusIRI}.
id := author.URI + "/activity#vote/" + poll.Status.URI
ap.MustSet(ap.SetJSONLDIdStr, ap.WithJSONLDId(create), id)
// Allocate Create activity and address 'To' poll author.
create := streams.NewActivityStreamsCreate()
ap.AppendTo(create, pollAuthorIRI)
// Set Create actor appropriately.
ap.AppendActorIRIs(create, authorIRI)
// Create ID formatted as: {$voterIRI}/activity#vote{$index}/{$statusIRI}.
createID := fmt.Sprintf("%s/activity#vote%d/%s", author.URI, i, poll.Status.URI)
ap.MustSet(ap.SetJSONLDIdStr, ap.WithJSONLDId(create), createID)
// Set publish time for activity.
ap.SetPublished(create, vote.CreatedAt)
// Set Create actor appropriately.
ap.AppendActorIRIs(create, authorIRI)
// Parse each choice to a Note and add it to the Create.
for _, choice := range vote.Choices {
// Set publish time for activity.
ap.SetPublished(create, vote.CreatedAt)
// Allocate new note to hold the vote.
note := streams.NewActivityStreamsNote()
// For AP IRI generate from author URI + poll ID + vote choice.
@@ -1775,11 +1782,14 @@ func (c *Converter) PollVoteToASCreate(
ap.AppendInReplyTo(note, statusIRI)
ap.AppendTo(note, pollAuthorIRI)
// Append this note as Create Object.
// Append this note to the Create Object.
appendStatusableToActivity(create, note, false)
// Set create in slice.
creates[i] = create
}
return create, nil
return creates, nil
}
// populateValuesForProp appends the given PolicyValues