diff options
author | 2024-06-11 11:54:59 +0200 | |
---|---|---|
committer | 2024-06-11 11:54:59 +0200 | |
commit | 611f9de39b7a29e89616c9ffe76d2aca1194877b (patch) | |
tree | c5792f5c4c21070b608e0bb3b743edffbd190074 /internal/federation/dereferencing/account.go | |
parent | [bugfix] boost and account recursion (#2982) (diff) | |
download | gotosocial-611f9de39b7a29e89616c9ffe76d2aca1194877b.tar.xz |
[bugfix] Deref stats async, serve stub collections if handshaking (#2990)v0.16.0-rc2
* [bugfix] Deref stats async, allow peek if handshaking
* don't return totalItems when handshaking or hiding collections
* use GetLimit()
* use StubAccountStats
Diffstat (limited to 'internal/federation/dereferencing/account.go')
-rw-r--r-- | internal/federation/dereferencing/account.go | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 33a71ceb9..069fca1bc 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -102,11 +102,15 @@ func (d *Dereferencer) GetAccountByURI(ctx context.Context, requestUser string, } if accountable != nil { - // This account was updated, enqueue re-dereference featured posts. + // This account was updated, enqueue re-dereference featured posts + stats. d.state.Workers.Dereference.Queue.Push(func(ctx context.Context) { if err := d.dereferenceAccountFeatured(ctx, requestUser, account); err != nil { log.Errorf(ctx, "error fetching account featured collection: %v", err) } + + if err := d.dereferenceAccountStats(ctx, requestUser, account); err != nil { + log.Errorf(ctx, "error fetching account stats: %v", err) + } }) } @@ -150,11 +154,22 @@ func (d *Dereferencer) getAccountByURI(ctx context.Context, requestUser string, } // Create and pass-through a new bare-bones model for dereferencing. - return d.enrichAccountSafely(ctx, requestUser, uri, >smodel.Account{ + account, accountable, err := d.enrichAccountSafely(ctx, requestUser, uri, >smodel.Account{ ID: id.NewULID(), Domain: uri.Host, URI: uriStr, }, nil) + if err != nil { + return nil, nil, err + } + + // We have a new account. Ensure basic account stats populated; + // real stats will be fetched from remote asynchronously. + if err := d.state.DB.StubAccountStats(ctx, account); err != nil { + return nil, nil, gtserror.Newf("error stubbing account stats: %w", err) + } + + return account, accountable, nil } if accountFresh(account, nil) { @@ -199,11 +214,15 @@ func (d *Dereferencer) GetAccountByUsernameDomain(ctx context.Context, requestUs } if accountable != nil { - // This account was updated, enqueue re-dereference featured posts. + // This account was updated, enqueue re-dereference featured posts + stats. d.state.Workers.Dereference.Queue.Push(func(ctx context.Context) { if err := d.dereferenceAccountFeatured(ctx, requestUser, account); err != nil { log.Errorf(ctx, "error fetching account featured collection: %v", err) } + + if err := d.dereferenceAccountStats(ctx, requestUser, account); err != nil { + log.Errorf(ctx, "error fetching account stats: %v", err) + } }) } @@ -251,6 +270,12 @@ func (d *Dereferencer) getAccountByUsernameDomain( return nil, nil, err } + // We have a new account. Ensure basic account stats populated; + // real stats will be fetched from remote asynchronously. + if err := d.state.DB.StubAccountStats(ctx, account); err != nil { + return nil, nil, gtserror.Newf("error stubbing account stats: %w", err) + } + return account, accountable, nil } @@ -320,11 +345,15 @@ func (d *Dereferencer) RefreshAccount( } if accountable != nil { - // This account was updated, enqueue re-dereference featured posts. + // This account was updated, enqueue re-dereference featured posts + stats. d.state.Workers.Dereference.Queue.Push(func(ctx context.Context) { if err := d.dereferenceAccountFeatured(ctx, requestUser, latest); err != nil { log.Errorf(ctx, "error fetching account featured collection: %v", err) } + + if err := d.dereferenceAccountStats(ctx, requestUser, latest); err != nil { + log.Errorf(ctx, "error fetching account stats: %v", err) + } }) } @@ -369,10 +398,14 @@ func (d *Dereferencer) RefreshAccountAsync( } if accountable != nil { - // This account was updated, enqueue re-dereference featured posts. + // This account was updated, enqueue re-dereference featured posts + stats. if err := d.dereferenceAccountFeatured(ctx, requestUser, latest); err != nil { log.Errorf(ctx, "error fetching account featured collection: %v", err) } + + if err := d.dereferenceAccountStats(ctx, requestUser, latest); err != nil { + log.Errorf(ctx, "error fetching account stats: %v", err) + } } }) } @@ -697,12 +730,12 @@ func (d *Dereferencer) enrichAccount( latestAcc.ID = account.ID latestAcc.FetchedAt = time.Now() - // Ensure the account's avatar media is populated, passing in existing to check for chages. + // Ensure the account's avatar media is populated, passing in existing to check for changes. if err := d.fetchRemoteAccountAvatar(ctx, tsport, account, latestAcc); err != nil { log.Errorf(ctx, "error fetching remote avatar for account %s: %v", uri, err) } - // Ensure the account's avatar media is populated, passing in existing to check for chages. + // Ensure the account's avatar media is populated, passing in existing to check for changes. if err := d.fetchRemoteAccountHeader(ctx, tsport, account, latestAcc); err != nil { log.Errorf(ctx, "error fetching remote header for account %s: %v", uri, err) } @@ -712,11 +745,6 @@ func (d *Dereferencer) enrichAccount( log.Errorf(ctx, "error fetching remote emojis for account %s: %v", uri, err) } - // Fetch followers/following count for this account. - if err := d.fetchRemoteAccountStats(ctx, latestAcc, requestUser); err != nil { - log.Errorf(ctx, "error fetching remote stats for account %s: %v", uri, err) - } - if account.IsNew() { // Prefer published/created time from // apubAcc, fall back to FetchedAt value. @@ -1007,7 +1035,7 @@ func (d *Dereferencer) fetchRemoteAccountEmojis(ctx context.Context, targetAccou return changed, nil } -func (d *Dereferencer) fetchRemoteAccountStats(ctx context.Context, account *gtsmodel.Account, requestUser string) error { +func (d *Dereferencer) dereferenceAccountStats(ctx context.Context, requestUser string, account *gtsmodel.Account) error { // Ensure we have a stats model for this account. if account.Stats == nil { if err := d.state.DB.PopulateAccountStats(ctx, account); err != nil { |