summaryrefslogtreecommitdiff
path: root/internal/federation/dereferencing/account.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2023-05-31 09:39:54 +0100
committerLibravatar GitHub <noreply@github.com>2023-05-31 10:39:54 +0200
commit9da20eeecb60a88688d17cecb4bfc78c4241558e (patch)
treeafcdf5008fc51c3ed620ae1a9dca0e10d14542ae /internal/federation/dereferencing/account.go
parent[docs] clarify other federation modes not yet implemented (#1849) (diff)
downloadgotosocial-9da20eeecb60a88688d17cecb4bfc78c4241558e.tar.xz
[bugfix] only attempt to populate account/statuses from DB if already exist (#1839)
* only attempt to populate account/statuses from DB if already up-to-date Signed-off-by: kim <grufwub@gmail.com> * add missing status is-up-to-date check :grimace: + ensure populated if so Signed-off-by: kim <grufwub@gmail.com> --------- Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/federation/dereferencing/account.go')
-rw-r--r--internal/federation/dereferencing/account.go35
1 files changed, 30 insertions, 5 deletions
diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go
index eec6e3e92..5b0de99bc 100644
--- a/internal/federation/dereferencing/account.go
+++ b/internal/federation/dereferencing/account.go
@@ -30,6 +30,7 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/superseriousbusiness/gotosocial/internal/db"
+ "github.com/superseriousbusiness/gotosocial/internal/gtscontext"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
"github.com/superseriousbusiness/gotosocial/internal/id"
@@ -90,15 +91,23 @@ func (d *deref) getAccountByURI(ctx context.Context, requestUser string, uri *ur
err error
)
- // Search the database for existing account with ID URI.
- account, err = d.state.DB.GetAccountByURI(ctx, uriStr)
+ // Search the database for existing account with URI.
+ account, err = d.state.DB.GetAccountByURI(
+ // request a barebones object, it may be in the
+ // db but with related models not yet dereferenced.
+ gtscontext.SetBarebones(ctx),
+ uriStr,
+ )
if err != nil && !errors.Is(err, db.ErrNoEntries) {
return nil, nil, gtserror.Newf("error checking database for account %s by uri: %w", uriStr, err)
}
if account == nil {
- // Else, search the database for existing by ID URL.
- account, err = d.state.DB.GetAccountByURL(ctx, uriStr)
+ // Else, search the database for existing by URL.
+ account, err = d.state.DB.GetAccountByURL(
+ gtscontext.SetBarebones(ctx),
+ uriStr,
+ )
if err != nil && !errors.Is(err, db.ErrNoEntries) {
return nil, nil, gtserror.Newf("error checking database for account %s by url: %w", uriStr, err)
}
@@ -120,6 +129,10 @@ func (d *deref) getAccountByURI(ctx context.Context, requestUser string, uri *ur
// Check whether needs update.
if accountUpToDate(account) {
+ // This is existing up-to-date account, ensure it is populated.
+ if err := d.state.DB.PopulateAccount(ctx, account); err != nil {
+ log.Errorf(ctx, "error populating existing account: %v", err)
+ }
return account, nil, nil
}
@@ -153,7 +166,12 @@ func (d *deref) GetAccountByUsernameDomain(ctx context.Context, requestUser stri
}
// Search the database for existing account with USERNAME@DOMAIN.
- account, err := d.state.DB.GetAccountByUsernameDomain(ctx, username, domain)
+ account, err := d.state.DB.GetAccountByUsernameDomain(
+ // request a barebones object, it may be in the
+ // db but with related models not yet dereferenced.
+ gtscontext.SetBarebones(ctx),
+ username, domain,
+ )
if err != nil && !errors.Is(err, db.ErrNoEntries) {
return nil, nil, gtserror.Newf("error checking database for account %s@%s: %w", username, domain, err)
}
@@ -196,6 +214,13 @@ func (d *deref) GetAccountByUsernameDomain(ctx context.Context, requestUser stri
return account, nil, nil //nolint
}
+ if apubAcc == nil {
+ // This is existing up-to-date account, ensure it is populated.
+ if err := d.state.DB.PopulateAccount(ctx, account); err != nil {
+ log.Errorf(ctx, "error populating existing account: %v", err)
+ }
+ }
+
return latest, apubAcc, nil
}