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
@ -129,10 +133,10 @@
:or {extract-response-format extract-response-format-default}}]
(if coercion
(let [format->coercer (some->> (concat (when body
[[:default (-response-coercer coercion body)]])
(for [[format {:keys [schema]}] content, :when schema]
[format (-response-coercer coercion schema)]))
(filter second) (seq) (into (array-map)))]
[[:default (-response-coercer coercion body)]])
(for [[format {:keys [schema]}] content, :when schema]
[format (-response-coercer coercion schema)]))
(filter second) (seq) (into (array-map)))]
(when format->coercer
(fn [request response]
(let [format (extract-response-format request response)

View file

@ -168,12 +168,12 @@
;; 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
:type :schema
:content-type content-type})]
(let [schema (->schema-object default {:in :requestBody
:type :schema
:content-type content-type})]
[content-type {:schema schema}])))
content-types))
(into {}
@ -194,15 +194,14 @@
(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
:type :schema
:content-type content-type})]
(let [schema (->schema-object default {:in :responses
:type :schema
:content-type content-type})]
[content-type {:schema schema}])))
content-types))
(when content
@ -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,13 +83,16 @@
: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]
:or {content-types ["application/json"]}}]
(-get-apidocs [_ specification {:keys [request parameters responses content-types]
:or {content-types ["application/json"]}}]
(case specification
:swagger (swagger/swagger-spec
(merge
@ -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