mirror of
https://github.com/metosin/reitit.git
synced 2025-12-17 08:21:11 +00:00
Merge pull request #174 from nenadalm/async_ring
Support swagger with async ring
This commit is contained in:
commit
c3af856893
1 changed files with 29 additions and 23 deletions
|
|
@ -73,32 +73,38 @@
|
||||||
(defn create-swagger-handler []
|
(defn create-swagger-handler []
|
||||||
"Create a ring handler to emit swagger spec. Collects all routes from router which have
|
"Create a ring handler to emit swagger spec. Collects all routes from router which have
|
||||||
an intersecting `[:swagger :id]` and which are not marked with `:no-doc` route data."
|
an intersecting `[:swagger :id]` and which are not marked with `:no-doc` route data."
|
||||||
(fn [{:keys [::r/router ::r/match :request-method]}]
|
(fn create-swagger
|
||||||
(let [{:keys [id] :or {id ::default} :as swagger} (-> match :result request-method :data :swagger)
|
([{:keys [::r/router ::r/match :request-method]}]
|
||||||
->set (fn [x] (if (or (set? x) (sequential? x)) (set x) (conj #{} x)))
|
(let [{:keys [id] :or {id ::default} :as swagger} (-> match :result request-method :data :swagger)
|
||||||
ids (->set id)
|
->set (fn [x] (if (or (set? x) (sequential? x)) (set x) (conj #{} x)))
|
||||||
strip-top-level-keys #(dissoc % :id :info :host :basePath :definitions :securityDefinitions)
|
ids (->set id)
|
||||||
strip-endpoint-keys #(dissoc % :id :parameters :responses :summary :description)
|
strip-top-level-keys #(dissoc % :id :info :host :basePath :definitions :securityDefinitions)
|
||||||
swagger (->> (strip-endpoint-keys swagger)
|
strip-endpoint-keys #(dissoc % :id :parameters :responses :summary :description)
|
||||||
(merge {:swagger "2.0"
|
swagger (->> (strip-endpoint-keys swagger)
|
||||||
:x-id ids}))
|
(merge {:swagger "2.0"
|
||||||
accept-route (fn [route]
|
:x-id ids}))
|
||||||
(-> route second :swagger :id (or ::default) ->set (set/intersection ids) seq))
|
accept-route (fn [route]
|
||||||
transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data
|
(-> route second :swagger :id (or ::default) ->set (set/intersection ids) seq))
|
||||||
middleware :middleware
|
transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data
|
||||||
interceptors :interceptors}]]
|
middleware :middleware
|
||||||
(if (and data (not no-doc))
|
interceptors :interceptors}]]
|
||||||
[method
|
(if (and data (not no-doc))
|
||||||
(meta-merge
|
[method
|
||||||
|
(meta-merge
|
||||||
(apply meta-merge (keep (comp :swagger :data) middleware))
|
(apply meta-merge (keep (comp :swagger :data) middleware))
|
||||||
(apply meta-merge (keep (comp :swagger :data) interceptors))
|
(apply meta-merge (keep (comp :swagger :data) interceptors))
|
||||||
(if coercion
|
(if coercion
|
||||||
(coercion/get-apidocs coercion :swagger data))
|
(coercion/get-apidocs coercion :swagger data))
|
||||||
(select-keys data [:tags :summary :description])
|
(select-keys data [:tags :summary :description])
|
||||||
(strip-top-level-keys swagger))]))
|
(strip-top-level-keys swagger))]))
|
||||||
transform-path (fn [[p _ c]]
|
transform-path (fn [[p _ c]]
|
||||||
(if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))]
|
(if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))]
|
||||||
[(path->template p) endpoint]))]
|
[(path->template p) endpoint]))]
|
||||||
(let [paths (->> router (r/compiled-routes) (filter accept-route) (map transform-path) (into {}))]
|
(let [paths (->> router (r/compiled-routes) (filter accept-route) (map transform-path) (into {}))]
|
||||||
{:status 200
|
{:status 200
|
||||||
:body (meta-merge swagger {:paths paths})}))))
|
:body (meta-merge swagger {:paths paths})})))
|
||||||
|
([req res raise]
|
||||||
|
(try
|
||||||
|
(res (create-swagger req))
|
||||||
|
(catch #?(:clj Exception :cljs :default) e
|
||||||
|
(raise e))))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue