summaryrefslogtreecommitdiff
path: root/internal/db/pg/timeline.go
diff options
context:
space:
mode:
authorLibravatar Tobi Smethurst <31960611+tsmethurst@users.noreply.github.com>2021-08-15 18:43:08 +0200
committerLibravatar GitHub <noreply@github.com>2021-08-15 18:43:08 +0200
commitff406be68f0fe6fc0b2dae9a091ce164ac039b3f (patch)
tree622473ad500239f890b116f8bd30164b92a7dfc5 /internal/db/pg/timeline.go
parentDon't run tests+lint on merge to main (#139) (diff)
downloadgotosocial-ff406be68f0fe6fc0b2dae9a091ce164ac039b3f.tar.xz
Timeline loop fix (#140)
* uwu we made a fucky wucky * uwu we made a fucky wucky * work on timeline fixes a little * fiddle with tests some more * bleep bloop more tests * more tests * update drone yml * update some sturf * make the timeline code a bit lazier * go fmt * fix drone.yml
Diffstat (limited to 'internal/db/pg/timeline.go')
-rw-r--r--internal/db/pg/timeline.go19
1 files changed, 17 insertions, 2 deletions
diff --git a/internal/db/pg/timeline.go b/internal/db/pg/timeline.go
index 95acd4f38..585ca3067 100644
--- a/internal/db/pg/timeline.go
+++ b/internal/db/pg/timeline.go
@@ -28,31 +28,46 @@ import (
func (ps *postgresService) GetHomeTimelineForAccount(accountID string, maxID string, sinceID string, minID string, limit int, local bool) ([]*gtsmodel.Status, error) {
statuses := []*gtsmodel.Status{}
-
q := ps.conn.Model(&statuses)
q = q.ColumnExpr("status.*").
+ // Find out who accountID follows.
Join("LEFT JOIN follows AS f ON f.target_account_id = status.account_id").
- Where("f.account_id = ?", accountID).
+ // Use a WhereGroup here to specify that we want EITHER statuses posted by accounts that accountID follows,
+ // OR statuses posted by accountID itself (since a user should be able to see their own statuses).
+ //
+ // This is equivalent to something like WHERE ... AND (... OR ...)
+ // See: https://pg.uptrace.dev/queries/#select
+ WhereGroup(func(q *pg.Query) (*pg.Query, error) {
+ q = q.WhereOr("f.account_id = ?", accountID).
+ WhereOr("status.account_id = ?", accountID)
+ return q, nil
+ }).
+ // Sort by highest ID (newest) to lowest ID (oldest)
Order("status.id DESC")
if maxID != "" {
+ // return only statuses LOWER (ie., older) than maxID
q = q.Where("status.id < ?", maxID)
}
if sinceID != "" {
+ // return only statuses HIGHER (ie., newer) than sinceID
q = q.Where("status.id > ?", sinceID)
}
if minID != "" {
+ // return only statuses HIGHER (ie., newer) than minID
q = q.Where("status.id > ?", minID)
}
if local {
+ // return only statuses posted by local account havers
q = q.Where("status.local = ?", local)
}
if limit > 0 {
+ // limit amount of statuses returned
q = q.Limit(limit)
}