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