fix responses & request

This commit is contained in:
Tommi Reiman 2023-08-18 16:47:20 +03:00
parent 81dfe45b72
commit d8e9819e0a
4 changed files with 38 additions and 30 deletions

View file

@ -101,6 +101,10 @@
(request-coercion-failed! result coercion value in request serialize-failed-result) (request-coercion-failed! result coercion value in request serialize-failed-result)
result))))))))) result)))))))))
(defn get-default-schema [request-or-response]
(or (-> request-or-response :content :default :schema)
(:body request-or-response)))
(defn content-request-coercer [coercion {:keys [content body]} {::keys [extract-request-format serialize-failed-result] (defn content-request-coercer [coercion {:keys [content body]} {::keys [extract-request-format serialize-failed-result]
:or {extract-request-format extract-request-format-default}}] :or {extract-request-format extract-request-format-default}}]
(when coercion (when coercion
@ -129,10 +133,10 @@
:or {extract-response-format extract-response-format-default}}] :or {extract-response-format extract-response-format-default}}]
(if coercion (if coercion
(let [format->coercer (some->> (concat (when body (let [format->coercer (some->> (concat (when body
[[:default (-response-coercer coercion body)]]) [[:default (-response-coercer coercion body)]])
(for [[format {:keys [schema]}] content, :when schema] (for [[format {:keys [schema]}] content, :when schema]
[format (-response-coercer coercion schema)])) [format (-response-coercer coercion schema)]))
(filter second) (seq) (into (array-map)))] (filter second) (seq) (into (array-map)))]
(when format->coercer (when format->coercer
(fn [request response] (fn [request response]
(let [format (extract-response-format request response) (let [format (extract-response-format request response)

View file

@ -168,12 +168,12 @@
;; request allow to different :requestBody per content-type ;; request allow to different :requestBody per content-type
{:requestBody {:requestBody
{:content (merge {:content (merge
(when (:body request) (when-let [default (coercion/get-default-schema request)]
(into {} (into {}
(map (fn [content-type] (map (fn [content-type]
(let [schema (->schema-object (:body request) {:in :requestBody (let [schema (->schema-object default {:in :requestBody
:type :schema :type :schema
:content-type content-type})] :content-type content-type})]
[content-type {:schema schema}]))) [content-type {:schema schema}])))
content-types)) content-types))
(into {} (into {}
@ -194,15 +194,14 @@
(when responses (when responses
{:responses {:responses
(into {} (into {}
(map (fn [[status {:keys [body content] (map (fn [[status {:keys [content], :as response}]]
:as response}]]
(let [content (merge (let [content (merge
(when body (when-let [default (coercion/get-default-schema response)]
(into {} (into {}
(map (fn [content-type] (map (fn [content-type]
(let [schema (->schema-object body {:in :responses (let [schema (->schema-object default {:in :responses
:type :schema :type :schema
:content-type content-type})] :content-type content-type})]
[content-type {:schema schema}]))) [content-type {:schema schema}])))
content-types)) content-types))
(when content (when content
@ -215,8 +214,8 @@
content)))] content)))]
[status (merge (select-keys response [:description]) [status (merge (select-keys response [:description])
(when content (when content
{:content content}))]))) {:content content}))]))
responses)})))) responses))}))))
(defn create (defn create
([] ([]

View file

@ -70,7 +70,7 @@
(when request (when request
{:requestBody (openapi/openapi-spec {:requestBody (openapi/openapi-spec
{::openapi/content (merge {::openapi/content (merge
(when-let [default (:body request)] (when-let [default (coercion/get-default-schema request)]
(zipmap content-types (repeat default))) (zipmap content-types (repeat default)))
(->> (for [[content-type {:keys [schema]}] (:content request)] (->> (for [[content-type {:keys [schema]}] (:content request)]
[content-type schema]) [content-type schema])
@ -83,15 +83,16 @@
{:responses {:responses
(into (into
(empty responses) (empty responses)
(for [[k {:keys [body content] :as response}] responses] (for [[k {:keys [content] :as response}] responses
:let [default (coercion/get-default-schema response)]]
[k (merge [k (merge
(select-keys response [:description]) (select-keys response [:description])
(when (or body content) (when (or content default)
(openapi/openapi-spec (openapi/openapi-spec
{::openapi/content (merge {::openapi/content (merge
(when body (when default
(zipmap content-types (repeat body))) (zipmap content-types (repeat default)))
(->> (for [[content-type {:keys [schema]}] (:content response)] (->> (for [[content-type {:keys [schema]}] content]
[content-type schema]) [content-type schema])
(into {})))})))]))})) (into {})))})))]))}))

View file

@ -83,13 +83,16 @@
:string {:default string-transformer} :string {:default string-transformer}
:response {:default no-op-transformer}}}) :response {:default no-op-transformer}}})
(defn get-request-default-body [request]
(or (-> request :content :default :schema) (:body request)))
(defn create [{:keys [transformers coerce-response?] :as opts}] (defn create [{:keys [transformers coerce-response?] :as opts}]
^{:type ::coercion/coercion} ^{:type ::coercion/coercion}
(reify coercion/Coercion (reify coercion/Coercion
(-get-name [_] :spec) (-get-name [_] :spec)
(-get-options [_] opts) (-get-options [_] opts)
(-get-apidocs [this specification {:keys [request parameters responses content-types] (-get-apidocs [_ specification {:keys [request parameters responses content-types]
:or {content-types ["application/json"]}}] :or {content-types ["application/json"]}}]
(case specification (case specification
:swagger (swagger/swagger-spec :swagger (swagger/swagger-spec
(merge (merge
@ -111,7 +114,7 @@
(when request (when request
{:requestBody (openapi/openapi-spec {:requestBody (openapi/openapi-spec
{::openapi/content (merge {::openapi/content (merge
(when-let [default (:body request)] (when-let [default (coercion/get-default-schema request)]
(zipmap content-types (repeat default))) (zipmap content-types (repeat default)))
(->> (for [[content-type {:keys [schema]}] (:content request)] (->> (for [[content-type {:keys [schema]}] (:content request)]
[content-type schema]) [content-type schema])
@ -124,15 +127,16 @@
{:responses {:responses
(into (into
(empty responses) (empty responses)
(for [[k {:keys [body content] :as response}] responses] (for [[k {:keys [content] :as response}] responses
:let [default (coercion/get-default-schema response)]]
[k (merge [k (merge
(select-keys response [:description]) (select-keys response [:description])
(when (or body content) (when (or content default)
(openapi/openapi-spec (openapi/openapi-spec
{::openapi/content (merge {::openapi/content (merge
(when body (when default
(zipmap content-types (repeat (:body response)))) (zipmap content-types (repeat default)))
(->> (for [[content-type {:keys [schema]}] (:content response)] (->> (for [[content-type {:keys [schema]}] content]
[content-type schema]) [content-type schema])
(into {})))})))]))})) (into {})))})))]))}))
(throw (throw