summaryrefslogtreecommitdiff
path: root/internal/db
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2022-07-13 09:57:47 +0200
committerLibravatar GitHub <noreply@github.com>2022-07-13 09:57:47 +0200
commit6418307c64da236a0268f4496f793d982e128ad0 (patch)
tree9c781c812697412936d671e0e42272dce8cf2d78 /internal/db
parent[chore] improved router logging, recovery and error handling (#705) (diff)
downloadgotosocial-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.go5
-rw-r--r--internal/db/bundb/account.go62
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
+}