mirror of
https://github.com/metosin/reitit.git
synced 2025-12-18 17:01:11 +00:00
Support composable transformations of mw/interceptor chain
* fixes #167
This commit is contained in:
parent
18a9cdb802
commit
ffc36fce36
5 changed files with 40 additions and 19 deletions
|
|
@ -1,5 +1,9 @@
|
||||||
## UNRELEASED
|
## UNRELEASED
|
||||||
|
|
||||||
|
## `reitit-core`
|
||||||
|
|
||||||
|
* Added support for composing middleware & interceptor transformations, fixes [#167](https://github.com/metosin/reitit/issues/167).
|
||||||
|
|
||||||
## `reitit-spec`
|
## `reitit-spec`
|
||||||
|
|
||||||
* Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like [expound](https://github.com/bhb/expound) to be used:
|
* Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like [expound](https://github.com/bhb/expound) to be used:
|
||||||
|
|
|
||||||
|
|
@ -110,11 +110,12 @@
|
||||||
([interceptors data]
|
([interceptors data]
|
||||||
(chain interceptors data nil))
|
(chain interceptors data nil))
|
||||||
([interceptors data {:keys [::transform] :or {transform identity} :as opts}]
|
([interceptors data {:keys [::transform] :or {transform identity} :as opts}]
|
||||||
(->> interceptors
|
(let [transform (if (vector? transform) (apply comp (reverse transform)) transform)]
|
||||||
(keep #(into-interceptor % data opts))
|
(->> interceptors
|
||||||
(transform)
|
(keep #(into-interceptor % data opts))
|
||||||
(keep #(into-interceptor % data opts))
|
(transform)
|
||||||
(into []))))
|
(keep #(into-interceptor % data opts))
|
||||||
|
(into [])))))
|
||||||
|
|
||||||
(defn compile-result
|
(defn compile-result
|
||||||
([route opts]
|
([route opts]
|
||||||
|
|
|
||||||
|
|
@ -84,12 +84,13 @@
|
||||||
|
|
||||||
(defn- expand-and-transform
|
(defn- expand-and-transform
|
||||||
[middleware data {:keys [::transform] :or {transform identity} :as opts}]
|
[middleware data {:keys [::transform] :or {transform identity} :as opts}]
|
||||||
(->> middleware
|
(let [transform (if (vector? transform) (apply comp (reverse transform)) transform)]
|
||||||
(keep #(into-middleware % data opts))
|
(->> middleware
|
||||||
(into [])
|
(keep #(into-middleware % data opts))
|
||||||
(transform)
|
(into [])
|
||||||
(keep #(into-middleware % data opts))
|
(transform)
|
||||||
(into [])))
|
(keep #(into-middleware % data opts))
|
||||||
|
(into []))))
|
||||||
|
|
||||||
(defn- compile-handler [middleware handler]
|
(defn- compile-handler [middleware handler]
|
||||||
((apply comp identity (keep :wrap middleware)) handler))
|
((apply comp identity (keep :wrap middleware)) handler))
|
||||||
|
|
|
||||||
|
|
@ -222,19 +222,29 @@
|
||||||
(enter ::kerran)
|
(enter ::kerran)
|
||||||
(enter ::avaruus)]
|
(enter ::avaruus)]
|
||||||
:handler handler}]
|
:handler handler}]
|
||||||
options)))]
|
options)))
|
||||||
|
inject-debug (fn [interceptors]
|
||||||
|
(concat
|
||||||
|
(interleave (butlast interceptors) (repeat debug-i))
|
||||||
|
[(last interceptors)]))
|
||||||
|
sort-interceptors (fn [interceptors]
|
||||||
|
(concat
|
||||||
|
(sort-by :name (butlast interceptors))
|
||||||
|
[(last interceptors)]))]
|
||||||
|
|
||||||
(testing "by default, all interceptors are applied in order"
|
(testing "by default, all interceptors are applied in order"
|
||||||
(let [app (create nil)]
|
(let [app (create nil)]
|
||||||
(is (= [::olipa ::kerran ::avaruus :ok] (app "/ping")))))
|
(is (= [::olipa ::kerran ::avaruus :ok] (app "/ping")))))
|
||||||
|
|
||||||
(testing "interceptors can be re-ordered"
|
(testing "interceptors can be re-ordered"
|
||||||
(let [app (create {::interceptor/transform (fn [interceptors]
|
(let [app (create {::interceptor/transform sort-interceptors})]
|
||||||
(concat
|
|
||||||
(sort-by :name (butlast interceptors))
|
|
||||||
[(last interceptors)]))})]
|
|
||||||
(is (= [::avaruus ::kerran ::olipa :ok] (app "/ping")))))
|
(is (= [::avaruus ::kerran ::olipa :ok] (app "/ping")))))
|
||||||
|
|
||||||
(testing "adding debug interceptor between interceptors"
|
(testing "adding debug interceptor between interceptors"
|
||||||
(let [app (create {::interceptor/transform #(interleave % (repeat debug-i))})]
|
(let [app (create {::interceptor/transform inject-debug})]
|
||||||
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))))
|
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))
|
||||||
|
|
||||||
|
(testing "vector of transformations"
|
||||||
|
(let [app (create {::interceptor/transform [inject-debug
|
||||||
|
sort-interceptors]})]
|
||||||
|
(is (= [::avaruus ::debug ::debug ::debug ::kerran ::olipa :ok] (app "/ping")))))))
|
||||||
|
|
|
||||||
|
|
@ -254,4 +254,9 @@
|
||||||
|
|
||||||
(testing "adding debug middleware between middleware"
|
(testing "adding debug middleware between middleware"
|
||||||
(let [app (create {::middleware/transform #(interleave % (repeat debug-mw))})]
|
(let [app (create {::middleware/transform #(interleave % (repeat debug-mw))})]
|
||||||
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))))
|
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))
|
||||||
|
|
||||||
|
(testing "vector of transformations"
|
||||||
|
(let [app (create {::middleware/transform [#(interleave % (repeat debug-mw))
|
||||||
|
(partial sort-by :name)]})]
|
||||||
|
(is (= [::avaruus ::debug ::debug ::debug ::kerran ::olipa :ok] (app "/ping")))))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue