diff options
| -rw-r--r-- | internal/federation/dereferencing/account.go | 35 | ||||
| -rw-r--r-- | internal/federation/dereferencing/status.go | 26 | 
2 files changed, 52 insertions, 9 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  } diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index fede8b3ea..e4ecee639 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -27,6 +27,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" @@ -80,15 +81,23 @@ func (d *deref) getStatusByURI(ctx context.Context, requestUser string, uri *url  		err    error  	) -	// Search the database for existing status with ID URI. -	status, err = d.state.DB.GetStatusByURI(ctx, uriStr) +	// Search the database for existing status with URI. +	status, err = d.state.DB.GetStatusByURI( +		// 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 status %s by uri: %w", uriStr, err)  	}  	if status == nil { -		// Else, search the database for existing by ID URL. -		status, err = d.state.DB.GetStatusByURL(ctx, uriStr) +		// Else, search the database for existing by URL. +		status, err = d.state.DB.GetStatusByURL( +			gtscontext.SetBarebones(ctx), +			uriStr, +		)  		if err != nil && !errors.Is(err, db.ErrNoEntries) {  			return nil, nil, gtserror.Newf("error checking database for status %s by url: %w", uriStr, err)  		} @@ -107,6 +116,15 @@ func (d *deref) getStatusByURI(ctx context.Context, requestUser string, uri *url  		}, nil)  	} +	// Check whether needs update. +	if statusUpToDate(status) { +		// This is existing up-to-date status, ensure it is populated. +		if err := d.state.DB.PopulateStatus(ctx, status); err != nil { +			log.Errorf(ctx, "error populating existing status: %v", err) +		} +		return status, nil, nil +	} +  	// Try to update + deref existing status model.  	latest, apubStatus, err := d.enrichStatus(ctx,  		requestUser,  | 
