aboutsummaryrefslogtreecommitdiffstats
path: root/internal/store/files.go
diff options
context:
space:
mode:
authorgrm <grm@eyesin.space>2026-09-18 14:32:22 +0300
committergrm <grm@eyesin.space>2026-09-18 14:32:22 +0300
commit0fc470a8d588cac1a51cc4b3e1a2237dc56041c9 (patch)
treef4cde97479977d46046bc18953a1d0ecc3686165 /internal/store/files.go
parenta2b2574538c30278f4edd8e6b2704a176a7750a2 (diff)
downloadblogspace-0fc470a8d588cac1a51cc4b3e1a2237dc56041c9.tar.gz
blogspace-0fc470a8d588cac1a51cc4b3e1a2237dc56041c9.tar.bz2
blogspace-0fc470a8d588cac1a51cc4b3e1a2237dc56041c9.zip
Special pages: a gallery page of the blog's images
A page's kind says what it shows between its intro and outro: posts, as before, or something special. The first special kind is a gallery — every image in the files library as a masonry wall (CSS columns, no script), newest first, each linked to its full-size file. The page form lists the library's images with a Hide tick per picture; exclusions are stored (page_hidden_files) rather than inclusions so a new upload shows up without editing the page, and the design's own pictures — logo, favicon, header and background image — are never shown. Special pages keep the page chrome (menu, announcements, home, ordering) but hold no posts: the post forms skip them and a forced page id is refused. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sd8UPWrvyYCLj97JexNw3A
Diffstat (limited to 'internal/store/files.go')
-rw-r--r--internal/store/files.go22
1 files changed, 22 insertions, 0 deletions
diff --git a/internal/store/files.go b/internal/store/files.go
index 287b4d7..a4a4fb3 100644
--- a/internal/store/files.go
+++ b/internal/store/files.go
@@ -79,6 +79,28 @@ func (bs *BlogStore) ListFiles(ctx context.Context, kind, q string, limit, offse
return out, total, rows.Err()
}
+// GalleryImages lists the images a gallery page shows, newest first: every
+// library image but the page's hidden ones and except (the theme's logo and
+// favicon, which the caller knows).
+func (bs *BlogStore) GalleryImages(ctx context.Context, pageID int64, except []uuid.UUID) ([]File, error) {
+ rows, err := bs.db.Query(ctx, `SELECT `+fileCols+` FROM files WHERE kind = 'image' AND id <> ALL($2)
+ AND NOT EXISTS (SELECT 1 FROM page_hidden_files h WHERE h.page_id=$1 AND h.file_id=files.id)
+ ORDER BY created_at DESC, id DESC`, pageID, except)
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+ var out []File
+ for rows.Next() {
+ f, err := scanFile(rows)
+ if err != nil {
+ return nil, err
+ }
+ out = append(out, *f)
+ }
+ return out, rows.Err()
+}
+
// FileMeta loads a file without its bytes.
func (bs *BlogStore) FileMeta(ctx context.Context, id uuid.UUID) (*File, error) {
return scanFile(bs.db.QueryRow(ctx, `SELECT `+fileCols+` FROM files WHERE id=$1`, id))