src/view/admin/new-post.lisp
(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)) ()
(murja.model.settings:with-cache
(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)))))))))