Commit a34af95
Eric Bower
·
2025-08-02 13:20:11 -0400 EDT
parent eea5880
refactor(prose): only display 1 post per user in feed
4 files changed,
+27,
-24
+2,
-2
| ... | ... | @@ -548,7 +548,7 @@ func readHandler(w http.ResponseWriter, r *http.Request) { | |
| 548 | 548 | var pager *db.Paginate[*db.Post] | |
| 549 | 549 | var err error | |
| 550 | 550 | if tag == "" { | |
| 551 | - | pager, err = dbpool.FindAllPosts(&db.Pager{Num: 30, Page: page}, cfg.Space) | |
| 551 | + | pager, err = dbpool.FindPostsForFeed(&db.Pager{Num: 30, Page: page}, cfg.Space) | |
| 552 | 552 | } else { | |
| 553 | 553 | pager, err = dbpool.FindPostsByTag(&db.Pager{Num: 30, Page: page}, tag, cfg.Space) | |
| 554 | 554 | } |
| ... | ... | @@ -762,7 +762,7 @@ func rssHandler(w http.ResponseWriter, r *http.Request) { | |
| 762 | 762 | logger := shared.GetLogger(r) | |
| 763 | 763 | cfg := shared.GetCfg(r) | |
| 764 | 764 | ||
| 765 | - | pager, err := dbpool.FindAllPosts(&db.Pager{Num: 25, Page: 0}, cfg.Space) | |
| 765 | + | pager, err := dbpool.FindPostsForFeed(&db.Pager{Num: 25, Page: 0}, cfg.Space) | |
| 766 | 766 | if err != nil { | |
| 767 | 767 | logger.Error("find all posts", "err", err.Error()) | |
| 768 | 768 | http.Error(w, err.Error(), http.StatusInternalServerError) |
+1,
-1
| ... | ... | @@ -413,7 +413,7 @@ type DB interface { | |
| 413 | 413 | FindUpdatedPostsForUser(userID string, space string) ([]*Post, error) | |
| 414 | 414 | FindPostWithFilename(filename string, userID string, space string) (*Post, error) | |
| 415 | 415 | FindPostWithSlug(slug string, userID string, space string) (*Post, error) | |
| 416 | - | FindAllPosts(pager *Pager, space string) (*Paginate[*Post], error) | |
| 416 | + | FindPostsForFeed(pager *Pager, space string) (*Paginate[*Post], error) | |
| 417 | 417 | FindAllUpdatedPosts(pager *Pager, space string) (*Paginate[*Post], error) | |
| 418 | 418 | InsertPost(post *Post) (*Post, error) | |
| 419 | 419 | UpdatePost(post *Post) (*Post, error) |
+23,
-20
| ... | ... | @@ -183,25 +183,28 @@ const ( | |
| 183 | 183 | // add some users to deny list since they are robogenerating a bunch of posts | |
| 184 | 184 | // per day and are creating a lot of noise. | |
| 185 | 185 | sqlSelectPostsByRank = ` | |
| 186 | - | SELECT | |
| 187 | - | posts.id, | |
| 188 | - | user_id, | |
| 189 | - | filename, | |
| 190 | - | slug, | |
| 191 | - | title, | |
| 192 | - | text, | |
| 193 | - | description, | |
| 194 | - | publish_at, | |
| 195 | - | app_users.name as username, | |
| 196 | - | posts.updated_at, | |
| 197 | - | posts.mime_type | |
| 198 | - | FROM posts | |
| 199 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 200 | - | WHERE | |
| 201 | - | hidden = FALSE AND | |
| 202 | - | publish_at::date <= CURRENT_DATE AND | |
| 203 | - | cur_space = $3 AND | |
| 204 | - | app_users.name NOT IN ('algiegray', 'mrrccc') | |
| 186 | + | SELECT * | |
| 187 | + | FROM ( | |
| 188 | + | SELECT DISTINCT ON (posts.user_id) | |
| 189 | + | posts.id, | |
| 190 | + | posts.user_id, | |
| 191 | + | posts.filename, | |
| 192 | + | posts.slug, | |
| 193 | + | posts.title, | |
| 194 | + | posts.text, | |
| 195 | + | posts.description, | |
| 196 | + | posts.publish_at, | |
| 197 | + | app_users.name AS username, | |
| 198 | + | posts.updated_at, | |
| 199 | + | posts.mime_type | |
| 200 | + | FROM posts | |
| 201 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 202 | + | WHERE | |
| 203 | + | hidden = FALSE | |
| 204 | + | AND publish_at::date <= CURRENT_DATE | |
| 205 | + | AND cur_space = $3 | |
| 206 | + | ORDER BY posts.user_id, publish_at DESC | |
| 207 | + | ) AS latest_posts | |
| 205 | 208 | ORDER BY publish_at DESC | |
| 206 | 209 | LIMIT $1 OFFSET $2` | |
| 207 | 210 |
| ... | ... | @@ -757,7 +760,7 @@ func (me *PsqlDB) postPager(rs *sql.Rows, pageNum int, space string, tag string) | |
| 757 | 760 | return pager, nil | |
| 758 | 761 | } | |
| 759 | 762 | ||
| 760 | - | func (me *PsqlDB) FindAllPosts(page *db.Pager, space string) (*db.Paginate[*db.Post], error) { | |
| 763 | + | func (me *PsqlDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[*db.Post], error) { | |
| 761 | 764 | rs, err := me.Db.Query(sqlSelectPostsByRank, page.Num, page.Num*page.Page, space) | |
| 762 | 765 | if err != nil { | |
| 763 | 766 | return nil, err |
+1,
-1
| ... | ... | @@ -105,7 +105,7 @@ func (me *StubDB) FindPost(postID string) (*db.Post, error) { | |
| 105 | 105 | return nil, errNotImpl | |
| 106 | 106 | } | |
| 107 | 107 | ||
| 108 | - | func (me *StubDB) FindAllPosts(page *db.Pager, space string) (*db.Paginate[*db.Post], error) { | |
| 108 | + | func (me *StubDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[*db.Post], error) { | |
| 109 | 109 | return &db.Paginate[*db.Post]{}, errNotImpl | |
| 110 | 110 | } | |
| 111 | 111 |