diff of dc106c20781007cf70b1602923f54f70312361e1
dc106c20781007cf70b1602923f54f70312361e1
diff --git a/playwright-tests/tests/basic-tests.spec.ts b/playwright-tests/tests/basic-tests.spec.ts
index 623c106..500e8aa 100644
--- a/playwright-tests/tests/basic-tests.spec.ts
+++ b/playwright-tests/tests/basic-tests.spec.ts
@@ -258,5 +258,12 @@ test('basic testing', async ({ page, browser }) => {
await page.getByText('Select all').click();
await page.getByText('Remove selected').click();
await expect(page.locator('details > img')).toHaveCount(0);
-});;
+ // Test tag based fetching
+ await page.goto('http://localhost:3010/blog/tags/newer-test-tag');
+ await expect(page.locator('.post')).toHaveCount(3);
+
+ await page.goto('http://localhost:3010/blog/tags/test-tag');
+ await expect(page.locator('.post')).toHaveCount(1);
+
+});
diff --git a/resources/sql/post-fns.sql b/resources/sql/post-fns.sql
index cf33748..5d1df04 100644
--- a/resources/sql/post-fns.sql
+++ b/resources/sql/post-fns.sql
@@ -154,11 +154,14 @@ WHERE p.tags ?? 'landing-page' AND NOT p.tags ?? 'hidden';
-- name: get-tagged*
-SELECT p.ID, p.Title, p.created_at, p.Content, p.tags, u.Username, u.Nickname, u.Img_location, 0 AS "amount-of-comments"
+-- returns: :array-hash
+SELECT p.ID, p.Title, p.Content, p.created_at, p.tags, 0 AS "amount-of-comments", json_build_object('username', u.Username, 'nickname', u.Nickname, 'img_location', u.Img_location) as "creator", json_agg(DISTINCT version) as "versions"
FROM blog.Post p
JOIN blog.Users u ON u.ID = p.creator_id
-WHERE p.tags @> :tags AND (NOT p.tags ?? 'hidden' OR (p.tags ?? 'hidden' AND :show-hidden))
- and ((NOT p.tags ?? 'unlisted') OR :show-hidden);
+LEFT JOIN blog.Post_History ph ON ph.id = p.id
+WHERE p.tags ? $1 AND (NOT p.tags ? 'hidden' OR (p.tags ? 'hidden' AND $2))
+ and ((NOT p.tags ? 'unlisted') OR $2)
+GROUP BY p.ID, u.ID;
-- name: insert-post
-- (:title, :content, :creator-id, :tags) ==
diff --git a/src/posts/post-db.lisp b/src/posts/post-db.lisp
index 28b1bc9..42d8cf7 100644
--- a/src/posts/post-db.lisp
+++ b/src/posts/post-db.lisp
@@ -3,7 +3,7 @@
(:import-from :com.inuoe.jzon :parse)
(:import-from :halisql :defqueries)
(:import-from :lisp-fixup :fix-timestamp)
- (:export :get-post-version :get-page :get-titles-by-year :insert-post :update-post :get-post))
+ (:export :get-tagged :get-post-version :get-page :get-titles-by-year :insert-post :update-post :get-post))
(in-package :murja.posts.post-db)
@@ -45,3 +45,10 @@
(let ((post (first (coerce (get-versioned-by-id* id version) 'list))))
(when post
(fix-post post ))))
+
+(defun get-tagged (tag &key allow-hidden?)
+ (let ((posts (coerce (get-tagged* tag allow-hidden?) 'list)))
+ (log:info "Tag ~a returns posts ~a~%" tag (mapcar #'alexandria:hash-table-alist posts))
+ (when posts
+ (mapcar #'fix-post
+ posts))))
diff --git a/src/routes/post-routes.lisp b/src/routes/post-routes.lisp
index e4579d1..2b8a6bb 100644
--- a/src/routes/post-routes.lisp
+++ b/src/routes/post-routes.lisp
@@ -63,7 +63,13 @@
(let* ((post (get-post id)))
(log:info "returning unhidden post { ~{~a~%~} }~%" (alexandria:hash-table-alist post))
(stringify post)))
-
+
+(defroute tagged-posts-route ("/api/posts/tagged/:tag" :method :get
+ :decorators (@json
+ @transaction)) ()
+ (when (and (not (string= tag "hidden"))
+ (not (string= tag "unlisted")))
+ (stringify (murja.posts.post-db:get-tagged tag :allow-hidden? nil))))
;; routes that write to the db
(defroute post-creation-route ("/api/posts/post" :method :post
diff --git a/src/routes/root-routes.lisp b/src/routes/root-routes.lisp
index 3317e61..098e2b3 100644
--- a/src/routes/root-routes.lisp
+++ b/src/routes/root-routes.lisp
@@ -109,3 +109,6 @@
(defroute edit ("/blog/post/edit/:id" :method :get) ()
*root*)
+
+(defroute root-blg-2 ("/blog/tags/:tag" :method :get) ()
+ *root*)