From 896461dec3bed512f039340bc91741a1a82c80c0 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Wed, 18 Aug 2021 12:41:43 +0200 Subject: [PATCH] and some more --- internal/cliactions/admin/account/account.go | 20 ++++----- internal/db/account.go | 5 ++- internal/db/pg/account.go | 29 ++++++++---- internal/db/pg/status.go | 13 +++++- internal/db/status.go | 3 ++ internal/federation/dereferencing/status.go | 6 +-- internal/federation/federatingdb/delete.go | 11 ++--- internal/federation/federatingdb/following.go | 23 ++++++++-- internal/federation/federatingdb/owns.go | 16 +++---- internal/federation/federatingprotocol.go | 4 +- internal/media/handler.go | 4 +- internal/processing/federation.go | 25 +++++------ internal/processing/instance.go | 8 ++-- internal/processing/search.go | 23 +++------- internal/transport/controller.go | 6 +-- internal/visibility/util.go | 44 +++++++++++++------ 16 files changed, 145 insertions(+), 95 deletions(-) diff --git a/internal/cliactions/admin/account/account.go b/internal/cliactions/admin/account/account.go index 732527aa4..0ae7f32de 100644 --- a/internal/cliactions/admin/account/account.go +++ b/internal/cliactions/admin/account/account.go @@ -88,8 +88,8 @@ var Confirm cliactions.GTSAction = func(ctx context.Context, c *config.Config, l return err } - a := >smodel.Account{} - if err := dbConn.GetLocalAccountByUsername(username, a); err != nil { + a, err := dbConn.GetLocalAccountByUsername(username) + if err != nil { return err } @@ -123,8 +123,8 @@ var Promote cliactions.GTSAction = func(ctx context.Context, c *config.Config, l return err } - a := >smodel.Account{} - if err := dbConn.GetLocalAccountByUsername(username, a); err != nil { + a, err := dbConn.GetLocalAccountByUsername(username) + if err != nil { return err } @@ -155,8 +155,8 @@ var Demote cliactions.GTSAction = func(ctx context.Context, c *config.Config, lo return err } - a := >smodel.Account{} - if err := dbConn.GetLocalAccountByUsername(username, a); err != nil { + a, err := dbConn.GetLocalAccountByUsername(username) + if err != nil { return err } @@ -187,8 +187,8 @@ var Disable cliactions.GTSAction = func(ctx context.Context, c *config.Config, l return err } - a := >smodel.Account{} - if err := dbConn.GetLocalAccountByUsername(username, a); err != nil { + a, err := dbConn.GetLocalAccountByUsername(username) + if err != nil { return err } @@ -233,8 +233,8 @@ var Password cliactions.GTSAction = func(ctx context.Context, c *config.Config, return err } - a := >smodel.Account{} - if err := dbConn.GetLocalAccountByUsername(username, a); err != nil { + a, err := dbConn.GetLocalAccountByUsername(username) + if err != nil { return err } diff --git a/internal/db/account.go b/internal/db/account.go index 2aa12af57..29194b551 100644 --- a/internal/db/account.go +++ b/internal/db/account.go @@ -31,11 +31,14 @@ type Account interface { // GetAccountByURI returns one account with the given URI, or an error if something goes wrong. GetAccountByURI(uri string) (*gtsmodel.Account, DBError) + // GetAccountByURL returns one account with the given URL, or an error if something goes wrong. + GetAccountByURL(uri string) (*gtsmodel.Account, DBError) + // GetLocalAccountByUsername is a shortcut for the common action of fetching an account ON THIS INSTANCE // according to its username, which should be unique. // The given account pointer will be set to the result of the query, whatever it is. // In case of no entries, a 'no entries' error will be returned - GetLocalAccountByUsername(username string, account *gtsmodel.Account) DBError + GetLocalAccountByUsername(username string) (*gtsmodel.Account, DBError) // GetAccountFollowRequests is a shortcut for the common action of fetching a list of follow requests targeting the given account ID. // The given slice 'followRequests' will be set to the result of the query, whatever it is. diff --git a/internal/db/pg/account.go b/internal/db/pg/account.go index 6ebfd4de4..4d17488d8 100644 --- a/internal/db/pg/account.go +++ b/internal/db/pg/account.go @@ -67,6 +67,17 @@ func (a *accountDB) GetAccountByURI(uri string) (*gtsmodel.Account, db.DBError) return account, err } +func (a *accountDB) GetAccountByURL(uri string) (*gtsmodel.Account, db.DBError) { + account := >smodel.Account{} + + q := a.newAccountQ(account). + Where("account.url = ?", uri) + + err := processErrorResponse(q.Select()) + + return account, err +} + func (a *accountDB) GetInstanceAccount(domain string) (*gtsmodel.Account, db.DBError) { account := >smodel.Account{} @@ -126,14 +137,16 @@ func (a *accountDB) SetAccountHeaderOrAvatar(mediaAttachment *gtsmodel.MediaAtta return nil } -func (a *accountDB) GetLocalAccountByUsername(username string, account *gtsmodel.Account) db.DBError { - if err := a.conn.Model(account).Where("username = ?", username).Where("? IS NULL", pg.Ident("domain")).Select(); err != nil { - if err == pg.ErrNoRows { - return db.ErrNoEntries - } - return err - } - return nil +func (a *accountDB) GetLocalAccountByUsername(username string) (*gtsmodel.Account, db.DBError) { + account := >smodel.Account{} + + q := a.newAccountQ(account). + Where("username = ?", username). + Where("? IS NULL", pg.Ident("domain")) + + err := processErrorResponse(q.Select()) + + return account, err } func (a *accountDB) GetAccountFollowRequests(accountID string, followRequests *[]gtsmodel.FollowRequest) db.DBError { diff --git a/internal/db/pg/status.go b/internal/db/pg/status.go index 147f86320..227c48353 100644 --- a/internal/db/pg/status.go +++ b/internal/db/pg/status.go @@ -82,6 +82,17 @@ func (s *statusDB) GetStatusByURI(uri string) (*gtsmodel.Status, db.DBError) { return status, err } +func (s *statusDB) GetStatusByURL(uri string) (*gtsmodel.Status, db.DBError) { + status := >smodel.Status{} + + q := s.newStatusQ(status). + Where("LOWER(status.url) = LOWER(?)", uri) + + err := processErrorResponse(q.Select()) + + return status, err +} + func (s *statusDB) PutStatus(status *gtsmodel.Status) db.DBError { transaction := func(tx *pg.Tx) error { // create links between this status and any emojis it uses @@ -142,7 +153,7 @@ func (s *statusDB) statusParent(status *gtsmodel.Status, foundStatuses *[]*gtsmo if onlyDirect { return } - + s.statusParent(parentStatus, foundStatuses, false) } diff --git a/internal/db/status.go b/internal/db/status.go index 4f8e94dd8..2a6e527e2 100644 --- a/internal/db/status.go +++ b/internal/db/status.go @@ -27,6 +27,9 @@ type Status interface { // GetStatusByURI returns one status from the database, with all rel fields populated (if possible). GetStatusByURI(uri string) (*gtsmodel.Status, DBError) + // GetStatusByURL returns one status from the database, with all rel fields populated (if possible). + GetStatusByURL(uri string) (*gtsmodel.Status, DBError) + // PutStatus stores one status in the database. PutStatus(status *gtsmodel.Status) DBError diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index 3687d2983..59bf642c2 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -66,8 +66,8 @@ func (d *deref) GetRemoteStatus(username string, remoteStatusID *url.URL, refres new := true // check if we already have the status in our db - maybeStatus := >smodel.Status{} - if err := d.db.GetWhere([]db.Where{{Key: "uri", Value: remoteStatusID.String()}}, maybeStatus); err == nil { + maybeStatus, err := d.db.GetStatusByURI(remoteStatusID.String()) + if err == nil { // we've seen this status before so it's not new new = false @@ -339,7 +339,7 @@ func (d *deref) populateStatusFields(status *gtsmodel.Status, requestingUsername m.StatusID = status.ID m.Status = status - + m.OriginAccountID = status.Account.ID m.OriginAccount = status.Account m.OriginAccountURI = status.Account.URI diff --git a/internal/federation/federatingdb/delete.go b/internal/federation/federatingdb/delete.go index 02ce43620..4e95c9770 100644 --- a/internal/federation/federatingdb/delete.go +++ b/internal/federation/federatingdb/delete.go @@ -6,7 +6,6 @@ import ( "net/url" "github.com/sirupsen/logrus" - "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/util" ) @@ -52,10 +51,8 @@ func (f *federatingDB) Delete(ctx context.Context, id *url.URL) error { // in a delete we only get the URI, we can't know if we have a status or a profile or something else, // so we have to try a few different things... - where := []db.Where{{Key: "uri", Value: id.String()}} - - s := >smodel.Status{} - if err := f.db.GetWhere(where, s); err == nil { + s, err := f.db.GetStatusByURI(id.String()) + if err == nil { // it's a status l.Debugf("uri is for status with id: %s", s.ID) if err := f.db.DeleteByID(s.ID, >smodel.Status{}); err != nil { @@ -69,8 +66,8 @@ func (f *federatingDB) Delete(ctx context.Context, id *url.URL) error { } } - a := >smodel.Account{} - if err := f.db.GetWhere(where, a); err == nil { + a, err := f.db.GetAccountByURI(id.String()) + if err == nil { // it's an account l.Debugf("uri is for an account with id: %s", s.ID) if err := f.db.DeleteByID(a.ID, >smodel.Account{}); err != nil { diff --git a/internal/federation/federatingdb/following.go b/internal/federation/federatingdb/following.go index f5023d1b6..953b9032a 100644 --- a/internal/federation/federatingdb/following.go +++ b/internal/federation/federatingdb/following.go @@ -8,7 +8,6 @@ import ( "github.com/go-fed/activity/streams" "github.com/go-fed/activity/streams/vocab" "github.com/sirupsen/logrus" - "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/util" ) @@ -28,15 +27,31 @@ func (f *federatingDB) Following(c context.Context, actorIRI *url.URL) (followin ) l.Debugf("entering FOLLOWING function with actorIRI %s", actorIRI.String()) - acct := >smodel.Account{} + var acct *gtsmodel.Account if util.IsUserPath(actorIRI) { - if err := f.db.GetWhere([]db.Where{{Key: "uri", Value: actorIRI.String()}}, acct); err != nil { + username, err := util.ParseUserPath(actorIRI) + if err != nil { + return nil, fmt.Errorf("FOLLOWING: error parsing user path: %s", err) + } + + a, err := f.db.GetLocalAccountByUsername(username) + if err != nil { return nil, fmt.Errorf("FOLLOWING: db error getting account with uri %s: %s", actorIRI.String(), err) } + + acct = a } else if util.IsFollowingPath(actorIRI) { - if err := f.db.GetWhere([]db.Where{{Key: "following_uri", Value: actorIRI.String()}}, acct); err != nil { + username, err := util.ParseFollowingPath(actorIRI) + if err != nil { + return nil, fmt.Errorf("FOLLOWING: error parsing following path: %s", err) + } + + a, err := f.db.GetLocalAccountByUsername(username) + if err != nil { return nil, fmt.Errorf("FOLLOWING: db error getting account with following uri %s: %s", actorIRI.String(), err) } + + acct = a } else { return nil, fmt.Errorf("FOLLOWING: could not parse actor IRI %s as users or following path", actorIRI.String()) } diff --git a/internal/federation/federatingdb/owns.go b/internal/federation/federatingdb/owns.go index 3cb9603cd..0a65397ff 100644 --- a/internal/federation/federatingdb/owns.go +++ b/internal/federation/federatingdb/owns.go @@ -54,7 +54,8 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { if err != nil { return false, fmt.Errorf("error parsing statuses path for url %s: %s", id.String(), err) } - if err := f.db.GetWhere([]db.Where{{Key: "uri", Value: uid}}, >smodel.Status{}); err != nil { + status, err := f.db.GetStatusByURI(uid) + if err != nil { if err == db.ErrNoEntries { // there are no entries for this status return false, nil @@ -62,8 +63,7 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { // an actual error happened return false, fmt.Errorf("database error fetching status with id %s: %s", uid, err) } - l.Debugf("we own url %s", id.String()) - return true, nil + return status.Local, nil } if util.IsUserPath(id) { @@ -71,7 +71,7 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { if err != nil { return false, fmt.Errorf("error parsing statuses path for url %s: %s", id.String(), err) } - if err := f.db.GetLocalAccountByUsername(username, >smodel.Account{}); err != nil { + if _, err := f.db.GetLocalAccountByUsername(username); err != nil { if err == db.ErrNoEntries { // there are no entries for this username return false, nil @@ -88,7 +88,7 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { if err != nil { return false, fmt.Errorf("error parsing statuses path for url %s: %s", id.String(), err) } - if err := f.db.GetLocalAccountByUsername(username, >smodel.Account{}); err != nil { + if _, err := f.db.GetLocalAccountByUsername(username); err != nil { if err == db.ErrNoEntries { // there are no entries for this username return false, nil @@ -105,7 +105,7 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { if err != nil { return false, fmt.Errorf("error parsing statuses path for url %s: %s", id.String(), err) } - if err := f.db.GetLocalAccountByUsername(username, >smodel.Account{}); err != nil { + if _, err := f.db.GetLocalAccountByUsername(username); err != nil { if err == db.ErrNoEntries { // there are no entries for this username return false, nil @@ -122,7 +122,7 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { if err != nil { return false, fmt.Errorf("error parsing like path for url %s: %s", id.String(), err) } - if err := f.db.GetLocalAccountByUsername(username, >smodel.Account{}); err != nil { + if _, err := f.db.GetLocalAccountByUsername(username); err != nil { if err == db.ErrNoEntries { // there are no entries for this username return false, nil @@ -147,7 +147,7 @@ func (f *federatingDB) Owns(c context.Context, id *url.URL) (bool, error) { if err != nil { return false, fmt.Errorf("error parsing block path for url %s: %s", id.String(), err) } - if err := f.db.GetLocalAccountByUsername(username, >smodel.Account{}); err != nil { + if _, err := f.db.GetLocalAccountByUsername(username); err != nil { if err == db.ErrNoEntries { // there are no entries for this username return false, nil diff --git a/internal/federation/federatingprotocol.go b/internal/federation/federatingprotocol.go index 36179dc76..ee235cd7b 100644 --- a/internal/federation/federatingprotocol.go +++ b/internal/federation/federatingprotocol.go @@ -113,8 +113,8 @@ func (f *federator) AuthenticatePostInbox(ctx context.Context, w http.ResponseWr return nil, false, errors.New("username was empty") } - requestedAccount := >smodel.Account{} - if err := f.db.GetLocalAccountByUsername(username, requestedAccount); err != nil { + requestedAccount, err := f.db.GetLocalAccountByUsername(username) + if err != nil { return nil, false, fmt.Errorf("could not fetch requested account with username %s: %s", username, err) } diff --git a/internal/media/handler.go b/internal/media/handler.go index 5879d8946..c383a922e 100644 --- a/internal/media/handler.go +++ b/internal/media/handler.go @@ -231,8 +231,8 @@ func (mh *mediaHandler) ProcessLocalEmoji(emojiBytes []byte, shortcode string) ( // since emoji aren't 'owned' by an account, but we still want to use the same pattern for serving them through the filserver, // (ie., fileserver/ACCOUNT_ID/etc etc) we need to fetch the INSTANCE ACCOUNT from the database. That is, the account that's created // with the same username as the instance hostname, which doesn't belong to any particular user. - instanceAccount := >smodel.Account{} - if err := mh.db.GetLocalAccountByUsername(mh.config.Host, instanceAccount); err != nil { + instanceAccount, err := mh.db.GetInstanceAccount("") + if err != nil { return nil, fmt.Errorf("error fetching instance account: %s", err) } diff --git a/internal/processing/federation.go b/internal/processing/federation.go index 8e65ede91..997603fa7 100644 --- a/internal/processing/federation.go +++ b/internal/processing/federation.go @@ -36,13 +36,12 @@ import ( func (p *processor) GetFediUser(ctx context.Context, requestedUsername string, requestURL *url.URL) (interface{}, gtserror.WithCode) { // get the account the request is referring to - requestedAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(requestedUsername, requestedAccount); err != nil { + requestedAccount, err := p.db.GetLocalAccountByUsername(requestedUsername) + if err != nil { return nil, gtserror.NewErrorNotFound(fmt.Errorf("database error getting account with username %s: %s", requestedUsername, err)) } var requestedPerson vocab.ActivityStreamsPerson - var err error if util.IsPublicKeyPath(requestURL) { // if it's a public key path, we don't need to authenticate but we'll only serve the bare minimum user profile needed for the public key requestedPerson, err = p.tc.AccountToASMinimal(requestedAccount) @@ -91,8 +90,8 @@ func (p *processor) GetFediUser(ctx context.Context, requestedUsername string, r func (p *processor) GetFediFollowers(ctx context.Context, requestedUsername string, requestURL *url.URL) (interface{}, gtserror.WithCode) { // get the account the request is referring to - requestedAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(requestedUsername, requestedAccount); err != nil { + requestedAccount, err := p.db.GetLocalAccountByUsername(requestedUsername) + if err != nil { return nil, gtserror.NewErrorNotFound(fmt.Errorf("database error getting account with username %s: %s", requestedUsername, err)) } @@ -136,8 +135,8 @@ func (p *processor) GetFediFollowers(ctx context.Context, requestedUsername stri func (p *processor) GetFediFollowing(ctx context.Context, requestedUsername string, requestURL *url.URL) (interface{}, gtserror.WithCode) { // get the account the request is referring to - requestedAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(requestedUsername, requestedAccount); err != nil { + requestedAccount, err := p.db.GetLocalAccountByUsername(requestedUsername) + if err != nil { return nil, gtserror.NewErrorNotFound(fmt.Errorf("database error getting account with username %s: %s", requestedUsername, err)) } @@ -181,8 +180,8 @@ func (p *processor) GetFediFollowing(ctx context.Context, requestedUsername stri func (p *processor) GetFediStatus(ctx context.Context, requestedUsername string, requestedStatusID string, requestURL *url.URL) (interface{}, gtserror.WithCode) { // get the account the request is referring to - requestedAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(requestedUsername, requestedAccount); err != nil { + requestedAccount, err := p.db.GetLocalAccountByUsername(requestedUsername) + if err != nil { return nil, gtserror.NewErrorNotFound(fmt.Errorf("database error getting account with username %s: %s", requestedUsername, err)) } @@ -241,8 +240,8 @@ func (p *processor) GetFediStatus(ctx context.Context, requestedUsername string, func (p *processor) GetFediStatusReplies(ctx context.Context, requestedUsername string, requestedStatusID string, page bool, onlyOtherAccounts bool, minID string, requestURL *url.URL) (interface{}, gtserror.WithCode) { // get the account the request is referring to - requestedAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(requestedUsername, requestedAccount); err != nil { + requestedAccount, err := p.db.GetLocalAccountByUsername(requestedUsername) + if err != nil { return nil, gtserror.NewErrorNotFound(fmt.Errorf("database error getting account with username %s: %s", requestedUsername, err)) } @@ -374,8 +373,8 @@ func (p *processor) GetFediStatusReplies(ctx context.Context, requestedUsername func (p *processor) GetWebfingerAccount(ctx context.Context, requestedUsername string, requestURL *url.URL) (*apimodel.WellKnownResponse, gtserror.WithCode) { // get the account the request is referring to - requestedAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(requestedUsername, requestedAccount); err != nil { + requestedAccount, err := p.db.GetLocalAccountByUsername(requestedUsername) + if err != nil { return nil, gtserror.NewErrorNotFound(fmt.Errorf("database error getting account with username %s: %s", requestedUsername, err)) } diff --git a/internal/processing/instance.go b/internal/processing/instance.go index 89f60f5d4..b151744ef 100644 --- a/internal/processing/instance.go +++ b/internal/processing/instance.go @@ -51,8 +51,8 @@ func (p *processor) InstancePatch(form *apimodel.InstanceSettingsUpdateRequest) } // fetch the instance account from the db for processing - ia := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(p.config.Host, ia); err != nil { + ia, err := p.db.GetInstanceAccount("") + if err != nil { return nil, gtserror.NewErrorInternalError(fmt.Errorf("db error fetching instance account %s: %s", p.config.Host, err)) } @@ -67,8 +67,8 @@ func (p *processor) InstancePatch(form *apimodel.InstanceSettingsUpdateRequest) // validate & update site contact account if it's set on the form if form.ContactUsername != nil { // make sure the account with the given username exists in the db - contactAccount := >smodel.Account{} - if err := p.db.GetLocalAccountByUsername(*form.ContactUsername, contactAccount); err != nil { + contactAccount, err := p.db.GetLocalAccountByUsername(*form.ContactUsername) + if err != nil { return nil, gtserror.NewErrorBadRequest(err, fmt.Sprintf("account with username %s not retrievable", *form.ContactUsername)) } // make sure it has a user associated with it diff --git a/internal/processing/search.go b/internal/processing/search.go index eb4958347..2430fbd65 100644 --- a/internal/processing/search.go +++ b/internal/processing/search.go @@ -99,11 +99,6 @@ func (p *processor) SearchGet(authed *oauth.Auth, searchQuery *apimodel.SearchQu } for _, foundStatus := range foundStatuses { - statusOwner := >smodel.Account{} - if err := p.db.GetByID(foundStatus.AccountID, statusOwner); err != nil { - continue - } - if visible, err := p.filter.StatusVisible(foundStatus, authed.Account); !visible || err != nil { continue } @@ -126,12 +121,9 @@ func (p *processor) searchStatusByURI(authed *oauth.Auth, uri *url.URL, resolve "resolve": resolve, }) - maybeStatus := >smodel.Status{} - if err := p.db.GetWhere([]db.Where{{Key: "uri", Value: uri.String(), CaseInsensitive: true}}, maybeStatus); err == nil { - // we have it and it's a status + if maybeStatus, err := p.db.GetStatusByURI(uri.String()); err == nil { return maybeStatus, nil - } else if err := p.db.GetWhere([]db.Where{{Key: "url", Value: uri.String(), CaseInsensitive: true}}, maybeStatus); err == nil { - // we have it and it's a status + } else if maybeStatus, err := p.db.GetStatusByURL(uri.String()); err == nil { return maybeStatus, nil } @@ -150,14 +142,12 @@ func (p *processor) searchStatusByURI(authed *oauth.Auth, uri *url.URL, resolve } func (p *processor) searchAccountByURI(authed *oauth.Auth, uri *url.URL, resolve bool) (*gtsmodel.Account, error) { - maybeAccount := >smodel.Account{} - if err := p.db.GetWhere([]db.Where{{Key: "uri", Value: uri.String(), CaseInsensitive: true}}, maybeAccount); err == nil { - // we have it and it's an account + if maybeAccount, err := p.db.GetAccountByURI(uri.String()); err == nil { return maybeAccount, nil - } else if err = p.db.GetWhere([]db.Where{{Key: "url", Value: uri.String(), CaseInsensitive: true}}, maybeAccount); err == nil { - // we have it and it's an account + } else if maybeAccount, err := p.db.GetAccountByURL(uri.String()); err == nil { return maybeAccount, nil } + if resolve { // we don't have it locally so try and dereference it account, _, err := p.federator.GetRemoteAccount(authed.Account.Username, uri, true) @@ -179,7 +169,8 @@ func (p *processor) searchAccountByMention(authed *oauth.Auth, mention string, r // if it's a local account we can skip a whole bunch of stuff maybeAcct := >smodel.Account{} if domain == p.config.Host { - if err = p.db.GetLocalAccountByUsername(username, maybeAcct); err != nil { + maybeAcct, err = p.db.GetLocalAccountByUsername(username) + if err != nil { return nil, fmt.Errorf("searchAccountByMention: error getting local account by username: %s", err) } return maybeAcct, nil diff --git a/internal/transport/controller.go b/internal/transport/controller.go index 33eab2a3a..4eb6b5658 100644 --- a/internal/transport/controller.go +++ b/internal/transport/controller.go @@ -28,7 +28,6 @@ import ( "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" ) // Controller generates transports for use in making federation requests to other servers. @@ -95,14 +94,15 @@ func (c *controller) NewTransportForUsername(username string) (Transport, error) // We need an account to use to create a transport for dereferecing something. // If a username has been given, we can fetch the account with that username and use it. // Otherwise, we can take the instance account and use those credentials to make the request. - ourAccount := >smodel.Account{} var u string if username == "" { u = c.config.Host } else { u = username } - if err := c.db.GetLocalAccountByUsername(u, ourAccount); err != nil { + + ourAccount, err := c.db.GetLocalAccountByUsername(u) + if err != nil { return nil, fmt.Errorf("error getting account %s from db: %s", username, err) } diff --git a/internal/visibility/util.go b/internal/visibility/util.go index 914572446..aff9bb02a 100644 --- a/internal/visibility/util.go +++ b/internal/visibility/util.go @@ -23,6 +23,26 @@ func (f *filter) pullRelevantAccountsFromStatus(targetStatus *gtsmodel.Status) ( } accounts.StatusAuthor = targetStatus.Account + // now get all accounts with IDs that are mentioned in the status + if targetStatus.MentionIDs != nil && targetStatus.Mentions == nil { + mentions, err := f.db.GetMentions(targetStatus.MentionIDs) + if err != nil { + return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mentions from status: %s", err) + } + targetStatus.Mentions = mentions + } + + for _, m := range targetStatus.Mentions { + if m.TargetAccount == nil { + t, err := f.db.GetAccountByID(m.TargetAccountID) + if err != nil { + return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mentions from status: %s", err) + } + m.TargetAccount = t + } + accounts.MentionedAccounts = append(accounts.MentionedAccounts, m.TargetAccount) + } + // get the replied to account if it's not set on the status already if targetStatus.InReplyToAccountID != "" && targetStatus.InReplyToAccount == nil { repliedToAccount, err := f.db.GetAccountByID(targetStatus.InReplyToAccountID) @@ -65,8 +85,9 @@ func (f *filter) pullRelevantAccountsFromStatus(targetStatus *gtsmodel.Status) ( } targetStatus.BoostOf.InReplyToAccount = boostOfInReplyToAccount } + accounts.BoostedReplyToAccount = targetStatus.BoostOf.InReplyToAccount - // now get all accounts with IDs that are mentioned in the status + // now get all accounts with IDs that are mentioned in the boosted status if targetStatus.BoostOf.MentionIDs != nil && targetStatus.BoostOf.Mentions == nil { mentions, err := f.db.GetMentions(targetStatus.BoostOf.MentionIDs) if err != nil { @@ -74,20 +95,17 @@ func (f *filter) pullRelevantAccountsFromStatus(targetStatus *gtsmodel.Status) ( } targetStatus.BoostOf.Mentions = mentions } - } - // now get all accounts with IDs that are mentioned in the status - for _, mentionID := range targetStatus.MentionIDs { - mention := >smodel.Mention{} - if err := f.db.GetByID(mentionID, mention); err != nil { - return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mention with id %s: %s", mentionID, err) + for _, m := range targetStatus.BoostOf.Mentions { + if m.TargetAccount == nil { + t, err := f.db.GetAccountByID(m.TargetAccountID) + if err != nil { + return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mentions from boostOf status: %s", err) + } + m.TargetAccount = t + } + accounts.BoostedMentionedAccounts = append(accounts.BoostedMentionedAccounts, m.TargetAccount) } - - mentionedAccount := >smodel.Account{} - if err := f.db.GetByID(mention.TargetAccountID, mentionedAccount); err != nil { - return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mentioned account: %s", err) - } - accounts.MentionedAccounts = append(accounts.MentionedAccounts, mentionedAccount) } return accounts, nil