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