aboutsummaryrefslogtreecommitdiffstats
path: root/internal/store/posts.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/store/posts.go')
-rw-r--r--internal/store/posts.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/internal/store/posts.go b/internal/store/posts.go
index 706d132..1bffd51 100644
--- a/internal/store/posts.go
+++ b/internal/store/posts.go
@@ -75,6 +75,21 @@ func (bs *BlogStore) PublishedPosts(ctx context.Context, pageID int64, limit, of
return posts, total, err
}
+// SearchPublishedPosts returns a page of the published posts, from every page
+// of the blog, whose title or Markdown body matches the case-insensitive
+// regular expression; the caller builds it from the reader's words. Title and
+// body are searched as one text so a query can span them.
+func (bs *BlogStore) SearchPublishedPosts(ctx context.Context, pattern string, limit, offset int) ([]Post, int, error) {
+ posts, err := bs.collectPosts(ctx, `SELECT `+postCols+` FROM posts p JOIN pages g ON g.id=p.page_id
+ WHERE p.published AND (p.title || E'\n' || p.body_md) ~* $1 ORDER BY p.created_at DESC, p.id DESC LIMIT $2 OFFSET $3`, pattern, limit, offset)
+ if err != nil {
+ return nil, 0, err
+ }
+ var total int
+ err = bs.db.QueryRow(ctx, `SELECT count(*) FROM posts WHERE published AND (title || E'\n' || body_md) ~* $1`, pattern).Scan(&total)
+ return posts, total, err
+}
+
// PostRef is the light-weight row the archive module lists.
type PostRef struct {
Title string