-
Notifications
You must be signed in to change notification settings - Fork 35
/
flash.cljs
42 lines (39 loc) · 1.5 KB
/
flash.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
(ns macchiato.middleware.flash
"Middleware that adds session-based flash store that persists only to the
next request in the same session.")
(defn flash-request
"Adds :flash key to request from :_flash in session."
[request]
(let [session (:session request)
flash (:_flash session)
session (dissoc session :_flash)]
(assoc request :session session, :flash flash)))
(defn flash-response
"If response has a :flash key, saves it in :_flash of session for next
request."
[response request]
(let [{:keys [session flash]} request]
(if response
(let [session (if (contains? response :session)
(response :session)
session)
session (if-let [flash (response :flash)]
(assoc (response :session session) :_flash flash)
session)]
(if (or flash (response :flash) (contains? response :session))
(assoc response :session session)
response)))))
(defn
^{:macchiato/middleware
{:id :wrap-flash
:required [:wrap-session]}}
wrap-flash
"If a :flash key is set on the response by the handler, a :flash key with
the same value will be set on the next request that shares the same session.
This is useful for small messages that persist across redirects."
[handler]
(fn [request respond raise]
(let [request (flash-request request)]
(handler request
(fn [response] (respond (flash-response response request)))
raise))))