repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

commit
a34af95
parent
eea5880
author
Eric Bower
date
2025-08-02 13:20:11 -0400 EDT
refactor(prose): only display 1 post per user in feed
4 files changed,  +27, -24
M pkg/apps/prose/api.go
+2, -2
 1@@ -548,7 +548,7 @@ func readHandler(w http.ResponseWriter, r *http.Request) {
 2 	var pager *db.Paginate[*db.Post]
 3 	var err error
 4 	if tag == "" {
 5-		pager, err = dbpool.FindAllPosts(&db.Pager{Num: 30, Page: page}, cfg.Space)
 6+		pager, err = dbpool.FindPostsForFeed(&db.Pager{Num: 30, Page: page}, cfg.Space)
 7 	} else {
 8 		pager, err = dbpool.FindPostsByTag(&db.Pager{Num: 30, Page: page}, tag, cfg.Space)
 9 	}
10@@ -762,7 +762,7 @@ func rssHandler(w http.ResponseWriter, r *http.Request) {
11 	logger := shared.GetLogger(r)
12 	cfg := shared.GetCfg(r)
13 
14-	pager, err := dbpool.FindAllPosts(&db.Pager{Num: 25, Page: 0}, cfg.Space)
15+	pager, err := dbpool.FindPostsForFeed(&db.Pager{Num: 25, Page: 0}, cfg.Space)
16 	if err != nil {
17 		logger.Error("find all posts", "err", err.Error())
18 		http.Error(w, err.Error(), http.StatusInternalServerError)
M pkg/db/db.go
+1, -1
1@@ -413,7 +413,7 @@ type DB interface {
2 	FindUpdatedPostsForUser(userID string, space string) ([]*Post, error)
3 	FindPostWithFilename(filename string, userID string, space string) (*Post, error)
4 	FindPostWithSlug(slug string, userID string, space string) (*Post, error)
5-	FindAllPosts(pager *Pager, space string) (*Paginate[*Post], error)
6+	FindPostsForFeed(pager *Pager, space string) (*Paginate[*Post], error)
7 	FindAllUpdatedPosts(pager *Pager, space string) (*Paginate[*Post], error)
8 	InsertPost(post *Post) (*Post, error)
9 	UpdatePost(post *Post) (*Post, error)
M pkg/db/postgres/storage.go
+23, -20
 1@@ -183,25 +183,28 @@ const (
 2 	// add some users to deny list since they are robogenerating a bunch of posts
 3 	// per day and are creating a lot of noise.
 4 	sqlSelectPostsByRank = `
 5-	SELECT
 6-		posts.id,
 7-		user_id,
 8-		filename,
 9-		slug,
10-		title,
11-		text,
12-		description,
13-		publish_at,
14-		app_users.name as username,
15-		posts.updated_at,
16-		posts.mime_type
17-	FROM posts
18-	LEFT JOIN app_users ON app_users.id = posts.user_id
19-	WHERE
20-		hidden = FALSE AND
21-		publish_at::date <= CURRENT_DATE AND
22-		cur_space = $3 AND
23-		app_users.name NOT IN ('algiegray', 'mrrccc')
24+	SELECT *
25+	FROM (
26+	    SELECT DISTINCT ON (posts.user_id)
27+	        posts.id,
28+	        posts.user_id,
29+	        posts.filename,
30+	        posts.slug,
31+	        posts.title,
32+	        posts.text,
33+	        posts.description,
34+	        posts.publish_at,
35+	        app_users.name AS username,
36+	        posts.updated_at,
37+	        posts.mime_type
38+	    FROM posts
39+	    LEFT JOIN app_users ON app_users.id = posts.user_id
40+	    WHERE
41+	        hidden = FALSE
42+	        AND publish_at::date <= CURRENT_DATE
43+	        AND cur_space = $3
44+	    ORDER BY posts.user_id, publish_at DESC
45+	) AS latest_posts
46 	ORDER BY publish_at DESC
47 	LIMIT $1 OFFSET $2`
48 
49@@ -757,7 +760,7 @@ func (me *PsqlDB) postPager(rs *sql.Rows, pageNum int, space string, tag string)
50 	return pager, nil
51 }
52 
53-func (me *PsqlDB) FindAllPosts(page *db.Pager, space string) (*db.Paginate[*db.Post], error) {
54+func (me *PsqlDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[*db.Post], error) {
55 	rs, err := me.Db.Query(sqlSelectPostsByRank, page.Num, page.Num*page.Page, space)
56 	if err != nil {
57 		return nil, err
M pkg/db/stub/stub.go
+1, -1
1@@ -105,7 +105,7 @@ func (me *StubDB) FindPost(postID string) (*db.Post, error) {
2 	return nil, errNotImpl
3 }
4 
5-func (me *StubDB) FindAllPosts(page *db.Pager, space string) (*db.Paginate[*db.Post], error) {
6+func (me *StubDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[*db.Post], error) {
7 	return &db.Paginate[*db.Post]{}, errNotImpl
8 }
9