|
6 | 6 | [reitit.ring :as ring]
|
7 | 7 | [muuntaja.core :as m]
|
8 | 8 | [reitit.ring.middleware.muuntaja :as muuntaja]
|
| 9 | + [reitit.ring.middleware.parameters] |
| 10 | + |
9 | 11 | [reitit.coercion.malli]
|
10 | 12 | [reitit.coercion :as coercion]
|
11 | 13 | [clojure.tools.logging :as log]
|
|
33 | 35 |
|
34 | 36 | ;; Datascript
|
35 | 37 | [datascript.core :as d]
|
36 |
| - [datascript.db :as db])) |
| 38 | + [datascript.db :as db] |
| 39 | + |
| 40 | + ;; core.async |
| 41 | + [clojure.core.async :as async] |
| 42 | + ;;Sente |
| 43 | + [taoensso.sente :as sente] |
| 44 | + ;; TODO [ring.middleware.anti-forgery :refer [wrap-anti-forgery]] ; <--- Recommended |
| 45 | + [ring.middleware.keyword-params] |
| 46 | + [ring.middleware.params] |
| 47 | + [ring.middleware.session] |
| 48 | + [taoensso.sente.server-adapters.aleph :refer [get-sch-adapter]] |
| 49 | + )) |
| 50 | + |
| 51 | +;; Sente stuff |
| 52 | +(defonce sente-state |
| 53 | + (let [{:keys [ch-recv send-fn connected-uids |
| 54 | + ajax-post-fn ajax-get-or-ws-handshake-fn]} |
| 55 | + (sente/make-channel-socket-server! (get-sch-adapter) {:csrf-token-fn nil})] |
| 56 | + {:ring-ajax-post ajax-post-fn |
| 57 | + :ring-ajax-get-or-ws-handshake ajax-get-or-ws-handshake-fn |
| 58 | + :ch-chsk ch-recv ; ChannelSocket's receive channel |
| 59 | + :chsk-send! send-fn ; ChannelSocket's send API fn |
| 60 | + :connected-uids connected-uids} ; Watchable, read-only atom |
| 61 | + )) |
| 62 | + |
| 63 | +(def ring-ajax-post (:ring-ajax-post sente-state)) |
| 64 | +(def ring-ajax-get-or-ws-handshake (:ring-ajax-get-or-ws-handshake sente-state)) |
| 65 | +(def ch-chsk (:ch-chsk sente-state)) ; ChannelSocket's receive channel |
| 66 | +(def chsk-send! (:chsk-send! sente-state)) ; ChannelSocket's send API fn |
| 67 | +(def connected-uids (:connected-uids sente-state)) ; Watchable, read-only atom |
| 68 | + |
| 69 | +(defmulti event-msg-handler |
| 70 | + "Multimethod to handle Sente `event-msg`s" |
| 71 | + :id) |
| 72 | + |
| 73 | +(defmethod event-msg-handler :dafault |
| 74 | + [{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}] |
| 75 | + (log/info "Unmathed msg handler for event:" event) |
| 76 | + (when ?reply-fn |
| 77 | + (?reply-fn {:umatched-event-as-echoed-from-server event}))) |
| 78 | + |
| 79 | +(defmethod event-msg-handler :article/save! |
| 80 | + [{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}] |
| 81 | + (log/info "Saving article" event) |
| 82 | + (when ?reply-fn |
| 83 | + (?reply-fn {:saving event}))) |
| 84 | + |
| 85 | + |
| 86 | +(comment |
| 87 | + ;;to zwraca stop-fn więc umieścić w komponencie integranta! |
| 88 | + ;; i na halt-key wywołać (stop-fn) |
| 89 | + (def sente-router-not-yet-ig |
| 90 | + (sente/start-server-chsk-router! ch-chsk event-msg-handler)) |
| 91 | + |
| 92 | + ;; żeby zatrzymać handler |
| 93 | + (sente-router-not-yet-ig) |
| 94 | + |
| 95 | + |
| 96 | + ) |
| 97 | + |
| 98 | + |
37 | 99 |
|
38 |
| -;; ==== Config ==== |
39 | 100 |
|
| 101 | + |
| 102 | +;; ==== Config ==== |
40 | 103 | (def config {:app/handler {:keys-to-wrap
|
41 | 104 | {:model (ig/ref :model/article-sql)}}
|
42 | 105 |
|
|
70 | 133 | (defn get-app-handler [{:keys [keys-to-wrap]}]
|
71 | 134 | (ring/ring-handler
|
72 | 135 | (ring/router
|
73 |
| - ["/api" |
74 |
| - ["/articles" |
75 |
| - {:get get-articles-handler}] |
76 |
| - ["/article" |
77 |
| - {:post update-article-handler}] |
78 |
| - ["/article/:article-id" |
79 |
| - {:get get-article-handler}] |
80 |
| - ["/ping" |
81 |
| - {:get {:handler (fn [req] |
82 |
| - {:status 200 |
83 |
| - :body {:message "pong" |
84 |
| - :request (pr-str req)}})}}] |
85 |
| - ["/status" |
86 |
| - {:get {:handler (fn [req] |
87 |
| - {:status 200 |
88 |
| - :body {:message "status" |
89 |
| - :model (pr-str (:model req))}})}}]] |
| 136 | + [ |
| 137 | + ["/api" |
| 138 | + ["/articles" |
| 139 | + {:get get-articles-handler}] |
| 140 | + ["/article" |
| 141 | + {:post update-article-handler}] |
| 142 | + ["/article/:article-id" |
| 143 | + {:get get-article-handler}] |
| 144 | + ["/ping" |
| 145 | + {:get {:handler (fn [req] |
| 146 | + {:status 200 |
| 147 | + :body {:message "pong" |
| 148 | + :request (pr-str req)}})}}] |
| 149 | + ["/status" |
| 150 | + {:get {:handler (fn [req] |
| 151 | + {:status 200 |
| 152 | + :body {:message "status" |
| 153 | + :model (pr-str (:model req))}})}}]] |
| 154 | + ;; Sente |
| 155 | + ["/chsk" {:get {:handler ring-ajax-get-or-ws-handshake} |
| 156 | + :post {:handler ring-ajax-post}}]] |
90 | 157 | ;; router data affecting all routes
|
91 | 158 | {:data {:muuntaja m/instance
|
92 |
| - :middleware [muuntaja/format-middleware |
| 159 | + :middleware [ |
| 160 | + ring.middleware.session/wrap-session |
| 161 | + reitit.ring.middleware.parameters/parameters-middleware |
| 162 | + ring.middleware.keyword-params/wrap-keyword-params |
| 163 | + |
| 164 | + muuntaja/format-middleware |
93 | 165 | muuntaja/format-response-middleware
|
94 |
| - (wrap-keys keys-to-wrap)]}}) |
| 166 | + (wrap-keys keys-to-wrap) |
| 167 | + ]}}) |
95 | 168 | (ring/routes
|
96 | 169 | (ring/create-resource-handler {:path "/"})
|
97 | 170 | (ring/create-default-handler))))
|
|
0 commit comments