src/view/admin/new-post.lisp

DOWNLOAD
(in-package :murja.view.admin.new-post)

(defun head-script ()
  (with-html
    (:script
     :src "https://cdnjs.cloudflare.com/ajax/libs/ace/1.43.3/ace.min.js"
     :integrity "sha512-BHJlu9vUXVrcxhRwbBdNv3uTsbscp8pp3LJ5z/sw9nBJUegkNlkcZnvODRgynJWhXMCsVUGZlFuzTrr5I2X3sQ=="
     :crossorigin "anonymous"
     ;; :referrerpolicy "no-referrer"
     )))

(defroute blog/new-post ("/new-post"
			 :method :post
			 :decorators (@db
				      @ssr-authenticated)) ()
  (let ((abilities (coerce (murja.model.user:abilities *user*) 'list)))
    (if (member "create-post" abilities :test 'equal)
	(let ((post-id
		;; TODO wrap these stupid sql-wrappers with something that unbinds values automatically
		(caar (insert-post "New post" "New title" (user-id *user*) "[]" t t))))
	  (log:info "A new post with id ~d should now exist~%" post-id)
	  (hunchentoot:redirect (murja.genurl:route->url
				 'murja.view.admin.new-post:blog/post/editor
				 :id  post-id)))
	"no can do")))

(deftab blog/post/editor (:url "/post/editor/:id"
			  :subtab murja.view.admin.post-list:blog/postadmin
			  :require-login t
			  :needed-abilities ("create-post" "delete-post" "edit-post")
			  :inject-to-head (#'head-script)
			  :captured-url-params (id))
  (let ((old-post (get-post (parse-integer id) :allow-hidden? t)))
    (assert old-post)
    (editor old-post)))
			  
(defroute api/save-post ("/api/save-post/:id" :method :post
					      :decorators (@db
							   @ssr-authenticated)) ()
  (let ((abilities (coerce (murja.model.user:abilities *user*) 'list)))
    (when (member "edit-post" abilities :test 'equal)
      (let ((post (get-post (parse-integer id) :allow-hidden? t))
	    (form (lisp-fixup:formdata->hashmap (hunchentoot:raw-post-data :force-text t))))
	
	(setf (article post) (gethash "article" form))
	(setf (post-title post) (gethash "title" form))
	(setf (post-hidden? post) (equalp "on" (gethash "hidden" form)))
	(setf (post-unlisted? post) (equalp "on" (gethash "unlisted" form)))
	(setf (tags post) (gethash "tags" form))

	;; if this app was running on a host with more than 1 user, this log would be kind of bad
	;; but as it's only me and I have previously lost posts due to programming errors in editor,
	;; let's keep these logs for now
	(log:info "Form: ~a~%" (alexandria:hash-table-plist form))

	(log:info "Post: ~a~%" post)

	(postmodern:update-dao post)

	(dolist (link (coerce (json:parse (gethash "previouslies" form)) 'list))
	  (let ((id (gethash "id" link)))
	    (murja.posts.post-db:link-previously (post-id post) id)))

	(if (post-hidden? post)
	    (hunchentoot:redirect (murja.genurl:route->url
				   'murja.view.blog-root:root))
	    (hunchentoot:redirect (murja.genurl:route->url
				   'murja.view.single-post:blog/post/id
				   :id (post-id post))))))))