diff options
Diffstat (limited to 'internal/typeutils/astointernal.go')
-rw-r--r-- | internal/typeutils/astointernal.go | 83 |
1 files changed, 34 insertions, 49 deletions
diff --git a/internal/typeutils/astointernal.go b/internal/typeutils/astointernal.go index ad42a687d..5bcb35d75 100644 --- a/internal/typeutils/astointernal.go +++ b/internal/typeutils/astointernal.go @@ -527,29 +527,15 @@ func (c *Converter) ASBlockToBlock(ctx context.Context, blockable ap.Blockable) }, nil } -// ASAnnounceToStatus converts an activitystreams 'announce' into a status. -// -// The returned bool indicates whether this status is new (true) or not new (false). -// -// In other words, if the status is already in the database with the ID set on the announceable, then that will be returned, -// the returned bool will be false, and no further processing is necessary. If the returned bool is true, indicating -// that this is a new announce, then further processing will be necessary, because the returned status will be bareboned and -// require further dereferencing. -// -// This is useful when multiple users on an instance might receive the same boost, and we only want to process the boost once. -// -// NOTE -- this is different from one status being boosted multiple times! In this case, new boosts should indeed be created. -// -// Implementation note: this function creates and returns a boost WRAPPER -// status which references the boosted status in its BoostOf field. No -// dereferencing is done on the boosted status by this function. Callers -// should look at `status.BoostOf` to see the status being boosted, and do -// dereferencing on it as appropriate. -// -// The returned boolean indicates whether or not the boost has already been -// seen before by this instance. If it was, then status.BoostOf should be a -// fully filled-out status. If not, then only status.BoostOf.URI will be set. -func (c *Converter) ASAnnounceToStatus(ctx context.Context, announceable ap.Announceable) (*gtsmodel.Status, bool, error) { +// ASAnnounceToStatus converts an activitystreams 'announce' into a boost +// wrapper status. The returned bool indicates whether this boost is new +// (true) or not. If new, callers should use `status.BoostOfURI` to see the +// status being boosted, and do dereferencing on it as appropriate. If not +// new, then the boost has already been fully processed and can be ignored. +func (c *Converter) ASAnnounceToStatus( + ctx context.Context, + announceable ap.Announceable, +) (*gtsmodel.Status, bool, error) { // Default assume // we already have. isNew := false @@ -565,21 +551,21 @@ func (c *Converter) ASAnnounceToStatus(ctx context.Context, announceable ap.Anno uri := uriObj.String() // Check if we already have this boost in the database. - status, err := c.state.DB.GetStatusByURI(ctx, uri) + boost, err := c.state.DB.GetStatusByURI(ctx, uri) if err != nil && !errors.Is(err, db.ErrNoEntries) { err = gtserror.Newf("db error trying to get status with uri %s: %w", uri, err) return nil, isNew, err } - if status != nil { - // We already have this status, + if boost != nil { + // We already have this boost, // no need to proceed further. - return status, isNew, nil + return boost, isNew, nil } - // Create DB status with URI - status = new(gtsmodel.Status) - status.URI = uri + // Create boost with URI + boost = new(gtsmodel.Status) + boost.URI = uri isNew = true // Get the URI of the boosted status. @@ -590,22 +576,21 @@ func (c *Converter) ASAnnounceToStatus(ctx context.Context, announceable ap.Anno } // Set the URI of the boosted status on - // the new status, for later dereferencing. - status.BoostOf = new(gtsmodel.Status) - status.BoostOf.URI = boostOf[0].String() + // the boost, for later dereferencing. + boost.BoostOfURI = boostOf[0].String() // Extract published time for the boost, // zero-time will fall back to db defaults. if pub := ap.GetPublished(announceable); !pub.IsZero() { - status.CreatedAt = pub - status.UpdatedAt = pub + boost.CreatedAt = pub + boost.UpdatedAt = pub } else { log.Warnf(ctx, "unusable published property on %s", uri) } // Extract and load the boost actor account, // (this MUST already be in database by now). - status.Account, err = c.getASActorAccount(ctx, + boost.Account, err = c.getASActorAccount(ctx, uri, announceable, ) @@ -614,13 +599,13 @@ func (c *Converter) ASAnnounceToStatus(ctx context.Context, announceable ap.Anno } // Set the related status<->account fields. - status.AccountURI = status.Account.URI - status.AccountID = status.Account.ID + boost.AccountURI = boost.Account.URI + boost.AccountID = boost.Account.ID // Calculate intended visibility of the boost. - status.Visibility, err = ap.ExtractVisibility( + boost.Visibility, err = ap.ExtractVisibility( announceable, - status.Account.FollowersURI, + boost.Account.FollowersURI, ) if err != nil { err := gtserror.Newf("error extracting status visibility for %s: %w", uri, err) @@ -629,15 +614,15 @@ func (c *Converter) ASAnnounceToStatus(ctx context.Context, announceable ap.Anno // Below IDs will all be included in the // boosted status, so set them empty here. - status.AttachmentIDs = make([]string, 0) - status.TagIDs = make([]string, 0) - status.MentionIDs = make([]string, 0) - status.EmojiIDs = make([]string, 0) - - // Remaining fields on the boost status will be taken - // from the boosted status; it's not our job to do all - // that dereferencing here. - return status, isNew, nil + boost.AttachmentIDs = make([]string, 0) + boost.TagIDs = make([]string, 0) + boost.MentionIDs = make([]string, 0) + boost.EmojiIDs = make([]string, 0) + + // Remaining fields on the boost will be + // taken from the target status; it's not + // our job to do all that dereferencing here. + return boost, isNew, nil } // ASFlagToReport converts a remote activitystreams 'flag' representation into a gts model report. |