diff options
author | 2022-07-13 09:57:47 +0200 | |
---|---|---|
committer | 2022-07-13 09:57:47 +0200 | |
commit | 6418307c64da236a0268f4496f793d982e128ad0 (patch) | |
tree | 9c781c812697412936d671e0e42272dce8cf2d78 /internal/db | |
parent | [chore] improved router logging, recovery and error handling (#705) (diff) | |
download | gotosocial-6418307c64da236a0268f4496f793d982e128ad0.tar.xz |
[feature] Add back/next buttons to profiles for paging through statuses (#708)
* add GetAccountWebStatuses to db
* add WebStatusesGet func to processor
* don't add limit to next/prev links if 0
* take query params for next/prev statuses
* add separate next + prev links for convenience
* show 'nothing here' message if no statuses exist
* add back / next links to profiles
* allow paging down only
* go fmt ./...
* 'recent public toots' -> 'latest public toots'
Diffstat (limited to 'internal/db')
-rw-r--r-- | internal/db/account.go | 5 | ||||
-rw-r--r-- | internal/db/bundb/account.go | 62 |
2 files changed, 51 insertions, 16 deletions
diff --git a/internal/db/account.go b/internal/db/account.go index 4b0b0062d..79e7c01a5 100644 --- a/internal/db/account.go +++ b/internal/db/account.go @@ -54,6 +54,11 @@ type Account interface { // In case of no entries, a 'no entries' error will be returned GetAccountStatuses(ctx context.Context, accountID string, limit int, excludeReplies bool, excludeReblogs bool, maxID string, minID string, pinnedOnly bool, mediaOnly bool, publicOnly bool) ([]*gtsmodel.Status, Error) + // GetAccountWebStatuses is similar to GetAccountStatuses, but it's specifically for returning statuses that + // should be visible via the web view of an account. So, only public, federated statuses that aren't boosts + // or replies. + GetAccountWebStatuses(ctx context.Context, accountID string, limit int, maxID string) ([]*gtsmodel.Status, Error) + GetAccountBlocks(ctx context.Context, accountID string, maxID string, sinceID string, limit int) ([]*gtsmodel.Account, string, string, Error) // GetAccountLastPosted simply gets the timestamp of the most recent post by the account. diff --git a/internal/db/bundb/account.go b/internal/db/bundb/account.go index cf02ad100..2c97a6646 100644 --- a/internal/db/bundb/account.go +++ b/internal/db/bundb/account.go @@ -301,27 +301,33 @@ func (a *accountDB) GetAccountStatuses(ctx context.Context, accountID string, li return nil, a.conn.ProcessError(err) } - // Catch case of no statuses early - if len(statusIDs) == 0 { - return nil, db.ErrNoEntries - } + return a.statusesFromIDs(ctx, statusIDs) +} - // Allocate return slice (will be at most len statusIDS) - statuses := make([]*gtsmodel.Status, 0, len(statusIDs)) +func (a *accountDB) GetAccountWebStatuses(ctx context.Context, accountID string, limit int, maxID string) ([]*gtsmodel.Status, db.Error) { + statusIDs := []string{} - for _, id := range statusIDs { - // Fetch from status from database by ID - status, err := a.status.GetStatusByID(ctx, id) - if err != nil { - logrus.Errorf("GetAccountStatuses: error getting status %q: %v", id, err) - continue - } + q := a.conn. + NewSelect(). + Table("statuses"). + Column("id"). + Where("account_id = ?", accountID). + WhereGroup(" AND ", whereEmptyOrNull("in_reply_to_id")). + WhereGroup(" AND ", whereEmptyOrNull("boost_of_id")). + Where("visibility = ?", gtsmodel.VisibilityPublic). + Where("federated = ?", true) - // Append to return slice - statuses = append(statuses, status) + if maxID != "" { + q = q.Where("id < ?", maxID) } - return statuses, nil + q = q.Limit(limit).Order("id DESC") + + if err := q.Scan(ctx, &statusIDs); err != nil { + return nil, a.conn.ProcessError(err) + } + + return a.statusesFromIDs(ctx, statusIDs) } func (a *accountDB) GetAccountBlocks(ctx context.Context, accountID string, maxID string, sinceID string, limit int) ([]*gtsmodel.Account, string, string, db.Error) { @@ -363,3 +369,27 @@ func (a *accountDB) GetAccountBlocks(ctx context.Context, accountID string, maxI prevMinID := blocks[0].ID return accounts, nextMaxID, prevMinID, nil } + +func (a *accountDB) statusesFromIDs(ctx context.Context, statusIDs []string) ([]*gtsmodel.Status, db.Error) { + // Catch case of no statuses early + if len(statusIDs) == 0 { + return nil, db.ErrNoEntries + } + + // Allocate return slice (will be at most len statusIDS) + statuses := make([]*gtsmodel.Status, 0, len(statusIDs)) + + for _, id := range statusIDs { + // Fetch from status from database by ID + status, err := a.status.GetStatusByID(ctx, id) + if err != nil { + logrus.Errorf("statusesFromIDs: error getting status %q: %v", id, err) + continue + } + + // Append to return slice + statuses = append(statuses, status) + } + + return statuses, nil +} |