refactor to use utils

This commit is contained in:
Adam Jeniski 2025-09-17 12:46:18 -09:00
parent 09af95c459
commit 905640b0e1

View File

@ -12,6 +12,27 @@
[starfederation.datastar.clojure.api :as d*] [starfederation.datastar.clojure.api :as d*]
[starfederation.datastar.clojure.expressions :refer [->expr]])) [starfederation.datastar.clojure.expressions :refer [->expr]]))
;; utils
(defmacro fn-sse [[req sse :as _bindings]
& body]
`(fn [~req respond# _#]
(respond#
(->sse-response
~req
{on-open (fn [~sse]
(d*/with-open-sse ~sse
~@body))}))))
(defmacro defn-sse [var-name
[req sse :as _bindings]
& body]
`(defn ~var-name [~req respond# _#]
(respond#
(->sse-response
~req
{on-open (fn [~sse]
(d*/with-open-sse ~sse
~@body))}))))
(comment (comment
(do (do
(defonce printer (bound-fn* pprint/pprint)) (defonce printer (bound-fn* pprint/pprint))
@ -19,6 +40,7 @@
(remove-tap printer)) (remove-tap printer))
;; app
(defn render-page [content] (defn render-page [content]
(str (str
(h/html (h/html
@ -34,8 +56,7 @@
[:body content]]))) [:body content]])))
(defn todos-fragment [] (defn todos-fragment []
;; todo: make functional. sloppy sloppy (let [todos (db/get-all-todos)] ;; todo: make functional. sloppy sloppy
(let [todos (db/get-all-todos)]
(h/html (h/html
[:div {:id "todos"} [:div {:id "todos"}
[:div {:data-computed-show-toggle-display "($showComplete ? 'hide' : 'show') + ' done'"}] [:div {:data-computed-show-toggle-display "($showComplete ? 'hide' : 'show') + ' done'"}]
@ -90,28 +111,7 @@
#:d*.elements{:selector "#todos" #:d*.elements{:selector "#todos"
:patch-mode "replace"})) :patch-mode "replace"}))
(defmacro fn-sse [[req sse :as _bindings] (defn-sse create-todo-handler [req sse]
& body]
`(fn [~req respond# _#]
(respond#
(->sse-response
~req
{on-open (fn [~sse]
(d*/with-open-sse ~sse
~@body))}))))
(defmacro defn-sse [var-name
[req sse :as _bindings]
& body]
`(defn ~var-name [~req respond# _#]
(respond#
(->sse-response
~req
{on-open (fn [~sse]
(d*/with-open-sse ~sse
~@body))}))))
(defn-sse create-todo [req sse]
(let [title (-> req :body :title)] (let [title (-> req :body :title)]
(when title (when title
(db/add-todo! title)) (db/add-todo! title))
@ -126,43 +126,27 @@
render-page render-page
respond))) respond)))
(wrap-json-body (-> (context "/sse/todo" []
(context "/sse/todo" []
(GET "/" [] (GET "/" []
(fn-sse [_req sse] (fn-sse [_req sse]
(refresh-todos! sse))) (refresh-todos! sse)))
(POST "/create-todo" [] create-todo) (POST "/create-todo" [] create-todo-handler)
(context ["/:id", :id #"[0-9]+"] [id] (context ["/:id", :id #"[0-9]+"] [id]
(let-routes [id (read-string id)] (let-routes [id (read-string id)]
(PATCH "/set" [] (PATCH "/set" []
(fn [req respond _] (fn-sse [_req sse]
(db/set-todo-done! id true) (db/set-todo-done! id true)
(respond (refresh-todos! sse)))
(->sse-response req
{on-open (fn [sse]
(d*/with-open-sse sse
(refresh-todos! sse)))}))))
(PATCH "/unset" [] (PATCH "/unset" []
(fn [req respond _] (fn-sse [_req sse]
(db/set-todo-done! id false) (db/set-todo-done! id false)
(respond (refresh-todos! sse)))
(->sse-response
req
{on-open (fn [sse]
(d*/with-open-sse sse
(refresh-todos! sse)))}))))
(DELETE "/" [] (DELETE "/" []
(fn-sse [_req sse]
(db/delete-todo! id) (db/delete-todo! id)
(fn [req respond _] (refresh-todos! sse))))))
(respond (wrap-json-body {:keywords? true}))
(->sse-response
req
{on-open
(fn [sse]
(d*/with-open-sse sse
(refresh-todos! sse)))})))))))
{:keywords? true})
(route/not-found (str (h/html [:h2 "Not Found"])))) (route/not-found (str (h/html [:h2 "Not Found"]))))
(def app #'approutes) (def app #'approutes)