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