diff options
Diffstat (limited to 'internal/store/posts.go')
| -rw-r--r-- | internal/store/posts.go | 15 |
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 |
