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

View file

@ -168,10 +168,10 @@
;; 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}])))
@ -194,13 +194,12 @@
(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}])))
@ -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,12 +83,15 @@
: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
@ -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