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*)