diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 75167027..f3b58053 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -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) diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index 30290fba..91a155fa 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -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 ([] diff --git a/modules/reitit-schema/src/reitit/coercion/schema.cljc b/modules/reitit-schema/src/reitit/coercion/schema.cljc index a6beeae7..0ffa4e2b 100644 --- a/modules/reitit-schema/src/reitit/coercion/schema.cljc +++ b/modules/reitit-schema/src/reitit/coercion/schema.cljc @@ -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 {})))})))]))})) diff --git a/modules/reitit-spec/src/reitit/coercion/spec.cljc b/modules/reitit-spec/src/reitit/coercion/spec.cljc index ca7b724d..8043a78a 100644 --- a/modules/reitit-spec/src/reitit/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/coercion/spec.cljc @@ -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