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)
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]
:or {extract-request-format extract-request-format-default}}]
(when coercion

View file

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

View file

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

View file

@ -83,12 +83,15 @@
:string {:default string-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}]
^{:type ::coercion/coercion}
(reify coercion/Coercion
(-get-name [_] :spec)
(-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"]}}]
(case specification
:swagger (swagger/swagger-spec
@ -111,7 +114,7 @@
(when request
{:requestBody (openapi/openapi-spec
{::openapi/content (merge
(when-let [default (:body request)]
(when-let [default (coercion/get-default-schema request)]
(zipmap content-types (repeat default)))
(->> (for [[content-type {:keys [schema]}] (:content request)]
[content-type schema])
@ -124,15 +127,16 @@
{:responses
(into
(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
(select-keys response [:description])
(when (or body content)
(when (or content default)
(openapi/openapi-spec
{::openapi/content (merge
(when body
(zipmap content-types (repeat (:body response))))
(->> (for [[content-type {:keys [schema]}] (:content response)]
(when default
(zipmap content-types (repeat default)))
(->> (for [[content-type {:keys [schema]}] content]
[content-type schema])
(into {})))})))]))}))
(throw