Merge pull request #174 from nenadalm/async_ring

Support swagger with async ring
This commit is contained in:
Tommi Reiman 2018-11-17 12:23:04 +02:00 committed by GitHub
commit c3af856893
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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))))))