diff of 903f29d4a55070cad1b3b143b6178b9ebfec3a27

903f29d4a55070cad1b3b143b6178b9ebfec3a27
diff --git a/aggressive-murja.asd b/aggressive-murja.asd
index 4756fd5..0b2d47f 100644
--- a/aggressive-murja.asd
+++ b/aggressive-murja.asd
@@ -119,4 +119,6 @@
 		    (eval (read-from-string "(fiveam:run! 'murja.tests:main-suite)"))))
 
 ;; (ql:quickload "aggressive-murja")
+;; (asdf:test-system :aggressive-murja)
+
 ;; (cl-user::run)
diff --git a/src/model/post.lisp b/src/model/post.lisp
index 0e16e4e..8f3a7c0 100644
--- a/src/model/post.lisp
+++ b/src/model/post.lisp
@@ -2,7 +2,7 @@
   (:use :cl)
   (:export :RSS-Post :rss-link :Post :get-page :get-post :post-id :post-title :article :creator :tags :created-at :post-hidden? :post-unlisted? :next-post-id :previous-post-id :previouslies
 	   :id :title :creator :created-at :content :admin-get-all-titles
-	   :title :month :year :id :tags :hidden :unlisted)
+	   :title :month :year :id :tags :hidden :unlisted :get-tagged)
   (:import-from :com.inuoe.jzon :parse))
 
 (in-package :murja.model.post)
@@ -183,4 +183,25 @@ OFFSET $1"
 	      :null)
 	  (:dao Post)))))
 
+(defparameter *tagged-query*
+  "
+SELECT * FROM
+(SELECT p.*,
+ LAG(p.id, 1, -1) OVER (ORDER BY created_at) as previous,
+ LEAD(p.id, 1, -1) OVER (ORDER BY created_at) as next,
+ JSON_AGG(TO_JSONB (pl.*) - 'referencee_id') as previouslies 
+ FROM blog.Post p
+ LEFT JOIN blog.Previously_Link_Titles pl ON (p.id = pl.referencee_id AND 
+                                              EXISTS (SELECT * FROM blog.Post pp WHERE pp.id = pl.id AND NOT pp.hidden AND NOT pp.unlisted))
+ WHERE p.tags ? $1 AND (NOT p.hidden OR (p.hidden AND $2))
+      	     	      and ((NOT p.unlisted) OR $2)
+ GROUP BY p.id
+)
+")
+
+
+(defun get-tagged (tag &key allow-hidden?)
+  (let ((p (postmodern:query *tagged-query* tag allow-hidden? (:dao Post))))
+    (map 'list #'fix-post p)))
+
 ;;(get-post 1) 
diff --git a/src/model/user.lisp b/src/model/user.lisp
index 43479d7..be68806 100644
--- a/src/model/user.lisp
+++ b/src/model/user.lisp
@@ -1,7 +1,7 @@
 (defpackage murja.model.user
   (:use :cl)
   (:local-nicknames (:json :com.inuoe.jzon))
-  (:export :get-user :User :user-id :user-username :user-password :user-nickname :user-img-location :abilities))
+  (:export :get-user :User :user-id :user-username :register-user :user-password :user-nickname :user-img-location :abilities))
 
 (in-package :murja.model.user)
 
@@ -79,3 +79,12 @@ GROUP BY
 
 ;; (get-user 1)
 
+
+
+(defun register-user (username nickname img-location password)
+  "Inserts the new user into db and returns its id" 
+  (caar (postmodern:query "INSERT INTO blog.Users (username, nickname, img_location, password) VALUES ($1, $2, $3, $4) returning id"
+			  username
+			  nickname
+			  img-location
+			  (lisp-fixup:sha-512 password))))
diff --git a/test/rss-tests.lisp b/test/rss-tests.lisp
index d86230d..8dd1480 100644
--- a/test/rss-tests.lisp
+++ b/test/rss-tests.lisp
@@ -1,6 +1,6 @@
 (defpackage murja.tests.rss 
   (:use :cl :fiveam)
-  (:import-from :murja.users.user-db :register-user)
+  (:import-from :murja.model.user :register-user)
   (:import-from :murja.rss.reader-db :update-feeds)
   (:import-from :easy-routes :defroute)
   (:import-from :halisql :*system-name*)
@@ -58,7 +58,8 @@
 	     (feed-names (mapcar
 			  (lisp-fixup:partial #'format nil "rss-~d")
 			  (lisp-fixup:range2 1 3)))
-	     (owner (caar (postmodern:query "SELECT ID FROM blog.Users"))))
+	     (owner (caar (postmodern:query "SELECT ID FROM blog.Users")))
+	     (murja.rss.reader-db:*last-updated* nil))
 	 (is (not (equalp nil owner)))
 
 	 ;; insert the test feeds (update) shall poll
diff --git a/test/session-tests.lisp b/test/session-tests.lisp
index e8d578c..f74f210 100644
--- a/test/session-tests.lisp
+++ b/test/session-tests.lisp
@@ -1,7 +1,7 @@
 (defpackage murja.tests.session
   (:use :cl :fiveam)
   (:import-from :binding-arrows :->>)
-  (:import-from :murja.users.user-db :register-user)
+  (:import-from :murja.model.user :register-user)
   (:import-from :halisql :*system-name*)
   (:import-from :murja.tests :url :prepare-db-and-server :drakma->string :url :main-suite :prepare-db-and-server))
 
@@ -44,58 +44,62 @@ ON CONFLICT DO NOTHING")
   (is (equalp nil
 	      (postmodern:query "SELECT * FROM blog.serialized_session")))
 
+  ;; TODO rewrite this by bombing /login and / routes for example
+  ;; the deprecated /api/login/session endpoint doesn't exist anymore
+
   ;; does session-route return 401 as expected with an uninitialized session?
-  (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url)))
-    (is (equalp 401 status)))
-
-  ;; how does it handle rubbish session-key cookies?
-  (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
-							  :additional-headers `(("Cookie" . "murja-session=ihme_roskaa; murja-username=testuser")
-										("x-murja-now" . "Fri, 27 Dec 2024 09:48:46 EST")))
-    (is (equalp 401 status)))
-
-  ;; how about innocent looking keys that parse as cookies? 
-  (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
-							  :additional-headers `(("Cookie" . ,(format nil "murja-session=~a; murja-username=testuser" (uuid:make-v4-uuid)))))
-    (is (equalp 401 status)))
-
-  ;; how does it handle rubbish usernames?
-  (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
-							  :additional-headers `(("Cookie" . "murja-session=ihme_roskaa; murja-username=user_that_never_existed")))
-    (is (equalp 401 status)))
-
-  ;; let's log in
-  (multiple-value-bind (body status headers)
-      (drakma:http-request (format nil "~a/api/login/login" (url))
-			   :method :post
-			   :content (format nil "{\"username\": \"~a\", \"password\": \"~a\"}" username passwd))
-    (is (equalp 200 status))
-    (let* ((cookies-str (cdr (assoc :set-cookie headers)))
-	   (cookies (cookies->hash cookies-str))
-	   (hunchentoot-session (gethash "hunchentoot-session" cookies))
-	   (murja-session (gethash "murja-session" cookies))
-	   (murja-username (gethash "murja-username" cookies)))
-
-      ;; you could probably integration-test a lot by seeing what that body contains
-
-      ;; valid hunchentoot-session overrides rubbish cookies
-      (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
-							  :additional-headers `(("Cookie" . ,(format nil "hunchentoot-session=~a;murja-session=~a; murja-username=~a" hunchentoot-session murja-session "NON_EXISTANT_DUDE"))))
-	(is (equalp 200 status)))
-
-      ;; valid cookies repopulate the session 
-      (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
-							      :additional-headers `(("Cookie" . ,(format nil "murja-session=~a; murja-username=~a" murja-session murja-username))))
-	(is (equalp 200 status)))
-
-
-      ;; let's timejump 4 months and see if the session expires correctly
-
-      (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
-							      :additional-headers `(("Cookie" . ,(format nil "murja-session=~a; murja-username=~a" murja-session murja-username))
-										    ("x-murja-now" . ,(let ((lisp-fixup:*rfc822* t))
-													(lisp-fixup:fix-timestamp (caar (postmodern:query "SELECT now() + '4 months'")))))))
-	(is (equalp 401 status))))))
+  ;; (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url)))
+  ;;   (is (equalp 401 status)))
+
+  ;; ;; how does it handle rubbish session-key cookies?
+  ;; (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
+  ;; 							  :additional-headers `(("Cookie" . "murja-session=ihme_roskaa; murja-username=testuser")
+  ;; 										("x-murja-now" . "Fri, 27 Dec 2024 09:48:46 EST")))
+  ;;   (is (equalp 401 status)))
+
+  ;; ;; how about innocent looking keys that parse as cookies? 
+  ;; (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
+  ;; 							  :additional-headers `(("Cookie" . ,(format nil "murja-session=~a; murja-username=testuser" (uuid:make-v4-uuid)))))
+  ;;   (is (equalp 401 status)))
+
+  ;; ;; how does it handle rubbish usernames?
+  ;; (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
+  ;; 							  :additional-headers `(("Cookie" . "murja-session=ihme_roskaa; murja-username=user_that_never_existed")))
+  ;;   (is (equalp 401 status)))
+
+  ;; ;; let's log in
+  ;; (multiple-value-bind (body status headers)
+  ;;     (drakma:http-request (format nil "~a/api/login/login" (url))
+  ;; 			   :method :post
+  ;; 			   :content (format nil "{\"username\": \"~a\", \"password\": \"~a\"}" username passwd))
+  ;;   (is (equalp 200 status))
+  ;;   (let* ((cookies-str (cdr (assoc :set-cookie headers)))
+  ;; 	   (cookies (cookies->hash cookies-str))
+  ;; 	   (hunchentoot-session (gethash "hunchentoot-session" cookies))
+  ;; 	   (murja-session (gethash "murja-session" cookies))
+  ;; 	   (murja-username (gethash "murja-username" cookies)))
+
+  ;;     ;; you could probably integration-test a lot by seeing what that body contains
+
+  ;;     ;; valid hunchentoot-session overrides rubbish cookies
+  ;;     (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
+  ;; 							  :additional-headers `(("Cookie" . ,(format nil "hunchentoot-session=~a;murja-session=~a; murja-username=~a" hunchentoot-session murja-session "NON_EXISTANT_DUDE"))))
+  ;; 	(is (equalp 200 status)))
+
+  ;;     ;; valid cookies repopulate the session 
+  ;;     (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
+  ;; 							      :additional-headers `(("Cookie" . ,(format nil "murja-session=~a; murja-username=~a" murja-session murja-username))))
+  ;; 	(is (equalp 200 status)))
+
+
+  ;;     ;; let's timejump 4 months and see if the session expires correctly
+
+  ;;     (multiple-value-bind (body status) (drakma:http-request (format nil "~a/api/login/session" (url))
+  ;; 							      :additional-headers `(("Cookie" . ,(format nil "murja-session=~a; murja-username=~a" murja-session murja-username))
+  ;; 										    ("x-murja-now" . ,(let ((lisp-fixup:*rfc822* t))
+  ;; 													(lisp-fixup:fix-timestamp (caar (postmodern:query "SELECT now() + '4 months'")))))))
+  ;; 	(is (equalp 401 status)))))
+  )
 
 ;; (setf fiveam:*run-test-when-defined* t)
 
diff --git a/test/tests.lisp b/test/tests.lisp
index 66eb3e0..e51e5d2 100644
--- a/test/tests.lisp
+++ b/test/tests.lisp
@@ -1,6 +1,6 @@
 (defpackage murja.tests
   (:use :cl :fiveam)
-  (:import-from :murja.users.user-db :register-user)
+  (:import-from :murja.model.user :register-user)
   (:import-from :murja.tests.literal :literal)
   (:export :prepare-db-and-server :drakma->string :url :main-suite :prepare-db-and-server))
 
@@ -126,9 +126,9 @@
 	 (let ((titles (murja.posts.post-db:get-titles-by-year :allow-hidden? nil))
 	       (first-page (murja.posts.post-db:get-page 1 555 :allow-hidden? nil))
 	       (count-of-posts (caar (postmodern:query "SELECT COUNT(*) FROM blog.Post")))
-	       (hidden-post (murja.posts.post-db:get-post hidden-post-id :allow-hidden? nil))
-	       (unlisted-post (murja.posts.post-db:get-post unlisted-post-id :allow-hidden? nil))
-	       (test-hidden-tagged-posts (murja.posts.post-db:get-tagged "test-hidden" :allow-hidden? nil)))
+	       (hidden-post (murja.model.post:get-post hidden-post-id :allow-hidden? nil))
+	       (unlisted-post (murja.model.post:get-post unlisted-post-id :allow-hidden? nil))
+	       (test-hidden-tagged-posts (murja.model.post:get-tagged "test-hidden" :allow-hidden? nil)))
 
 	   (is (null hidden-post))
 	   (is (null test-hidden-tagged-posts))