diff of 6818450efa43c75fcd2ff0f4d9c2f213ba39e99f
6818450efa43c75fcd2ff0f4d9c2f213ba39e99f
diff --git a/resources/sql/post-fns.sql b/resources/sql/post-fns.sql
index 8a42efd..dfb0db9 100644
--- a/resources/sql/post-fns.sql
+++ b/resources/sql/post-fns.sql
@@ -40,12 +40,27 @@ WHERE p.ID > :post-id AND NOT p.tags ?? 'hidden'
ORDER BY p.ID ASC
LIMIT 1;
--- name: get-by-id*
-SELECT p.ID, p.Title, p.created_at, p.Content, p.tags, u.Username, u.Nickname, u.Img_location, COUNT(c.ID) AS "amount-of-comments"
+-- name: get-by-id*
+-- returns: :array-hash
+SELECT p.ID,
+ p.Title,
+ p.created_at,
+ p.Content,
+ p.tags,
+ '[]'::json as "Comments",
+ json_build_object('username',
+ u.Username,
+ 'nickname',
+ u.Nickname,
+ 'img_location',
+ u.Img_location) as "creator",
+ null as "prev-post-id",
+ '[]'::json as "versions",
+ null as "version",
+ null as "next-post-id"
FROM blog.Post p
JOIN blog.Users u ON u.ID = p.creator_id
-LEFT JOIN blog.Comment c ON c.parent_post_id = p.ID
-WHERE p.ID = :post-id AND (NOT p.tags ?? 'hidden' OR (p.tags ?? 'hidden' AND :show-hidden))
+WHERE p.ID = $1 AND (NOT p.tags ? 'hidden' OR (p.tags ? 'hidden' AND $2))
GROUP BY p.ID, u.ID;
-- name: get-versioned-by-id*
@@ -99,17 +114,6 @@ update blog.post
set tags = :new-tags
where id = :post-id;
--- name: insert-post :<! :1
-insert into blog.post (title, content, creator_id, tags)
-values (:title, :content, :creator-id, :tags) returning id;
-
--- name: update-post @execute :1
-update blog.post
-set title = :title,
- content = :content,
- tags = :tags
-where id = :id;
-
-- name: delete-post @execute
delete blog.post
where id = :id
diff --git a/src/posts/post-db.lisp b/src/posts/post-db.lisp
index b4698b8..7592b09 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-page :get-titles-by-year :insert-post :update-post))
+ (:export :get-page :get-titles-by-year :insert-post :update-post :get-post))
(in-package :murja.posts.post-db)
@@ -19,14 +19,22 @@
(coerce
(get-titles-by-year* allow-hidden?) 'list)))
+(defun fix-post (post)
+ (dolist (key (list "creator" "tags"))
+ (setf (gethash key post)
+ (parse (gethash key post))))
+
+ (setf (gethash "created_at" post)
+ (fix-timestamp (gethash "created_at" post)))
+ post)
+
(defun get-page (page page-size &key allow-hidden?)
- (mapcar (lambda (post)
- (dolist (key (list "creator" "tags"))
- (setf (gethash key post)
- (parse (gethash key post))))
-
- (setf (gethash "created_at" post)
- (fix-timestamp (gethash "created_at" post)))
- post)
- (coerce
- (get-page* page page-size allow-hidden?) 'list)))
+ (let ((resulting-page (coerce
+ (get-page* page page-size allow-hidden?) 'list)))
+ (mapcar #'fix-post
+ resulting-page)))
+
+(defun get-post (id &key allow-hidden?)
+ (let ((post (aref (get-by-id* id allow-hidden?) 0)))
+ (fix-post post)))
+
diff --git a/src/routes/post-routes.lisp b/src/routes/post-routes.lisp
index b2dea06..1818b99 100644
--- a/src/routes/post-routes.lisp
+++ b/src/routes/post-routes.lisp
@@ -4,7 +4,7 @@
(:import-from :com.inuoe.jzon :stringify :parse)
(:import-from :murja.middleware.db :@transaction)
(:import-from :murja.middleware.auth :@authenticated :*user* :@can?)
- (:import-from :murja.posts.post-db :get-page :get-titles-by-year)
+ (:import-from :murja.posts.post-db :get-post :get-page :get-titles-by-year)
(:import-from :murja.middleware.json :@json)
(:import-from :easy-routes :defroute))
@@ -13,7 +13,7 @@
(defroute title-routes ("/api/posts/titles" :method :get
:decorators (@json @transaction)) ()
- (let ((titles (get-titles-by-year)))
+ (let ((titles (or (get-titles-by-year) #())))
(stringify titles)))
(defroute manager-title-routes ("/api/posts/all-titles" :method :get
@@ -36,6 +36,15 @@
(com.inuoe.jzon:stringify result)))
+(defroute hidden-post ("/api/posts/post/:id/allow-hidden/:hidden" :method :get
+ :decorators (@json
+ @transaction
+ @authenticated
+ (@can? "edit-post"))) ()
+
+ (let* ((show-hidden? (string= hidden "true"))
+ (post (get-post id :allow-hidden? show-hidden?)))
+ (stringify post)))
;; routes that write to the db
(defroute post-creation-route ("/api/posts/post" :method :post
@@ -43,16 +52,36 @@
@transaction
@authenticated
(@can? "create-post"))) ()
- (let* ((request-body (parse (hunchentoot:raw-post-data :force-text t)))
- (content (gethash "content" request-body))
- (title (gethash "title" request-body))
- (tags (stringify
- (remove-if (partial #'string= "")
- (coerce
- (gethash "tags" request-body) 'list))))
-
- (creator-id (gethash "id" *user*)))
- (assert creator-id)
- (murja.posts.post-db:insert-post title content creator-id tags)
- ""))
-
+ (log:info "inserting post")
+ (let* ((request-body (parse (hunchentoot:raw-post-data :force-text t)))
+ (content (gethash "content" request-body))
+ (title (gethash "title" request-body))
+ (tags (stringify
+ (or (remove-if (partial #'string= "")
+ (coerce
+ (gethash "tags" request-body) 'list))
+ #())))
+
+ (creator-id (gethash "id" *user*)))
+ (assert creator-id)
+ (murja.posts.post-db:insert-post title content creator-id tags)
+ ""))
+
+(defroute post-update-route ("/api/posts/post" :method :put
+ :decorators (@json
+ @transaction
+ @authenticated
+ (@can? "edit-post"))) ()
+ (let* ((request-body (parse (hunchentoot:raw-post-data :force-text t)))
+ (content (gethash "content" request-body))
+ (title (gethash "title" request-body))
+ (tags (stringify
+ (or (remove-if (partial #'string= "")
+ (coerce
+ (gethash "tags" request-body) 'list))
+ #())))
+ (post-id (gethash "id" request-body)))
+ (log:info "updating post ~d" post-id)
+
+ (murja.posts.post-db:update-post title content tags post-id)
+ ""))
diff --git a/src/routes/root-routes.lisp b/src/routes/root-routes.lisp
index 2adad0a..74a8885 100644
--- a/src/routes/root-routes.lisp
+++ b/src/routes/root-routes.lisp
@@ -91,10 +91,10 @@
(defroute root-blg ("/blog/" :method :get) ()
*root*)
-(defroute root-blg ("/blog/new_post" :method :get) ()
+(defroute root-blg-new ("/blog/new_post" :method :get) ()
*root*)
-(defroute root-blg ("/blog/new_post/" :method :get) ()
+(defroute root-blg-newer ("/blog/new_post/" :method :get) ()
*root*)
(defroute mediamgr ("/blog/mediamanager" :method :get) ()
diff --git a/src/users/user-db.lisp b/src/users/user-db.lisp
index f2b67ed..b234b4a 100644
--- a/src/users/user-db.lisp
+++ b/src/users/user-db.lisp
@@ -15,7 +15,9 @@
hash)
(defun get-user-by-id (id)
- (jsonize-key (aref (get-user-by-id* id) 0) "permissions"))
+ (let ((result (coerce (get-user-by-id* id) 'list)))
+ (when result
+ (jsonize-key (first result) "permissions"))))
(defun get-session-user-by-id (id)
(jsonize-key (aref (query-user-for-session id) 0) "permissions"))