fix: OpenAPI :description belongs at Response level, not Media Type

also, support singular :example in addition to :examples
This commit is contained in:
Joel Kaasinen 2024-09-16 12:45:50 +03:00
parent 5a811421db
commit 610586f0d3
2 changed files with 14 additions and 14 deletions

View file

@ -50,8 +50,8 @@
["/pizza" ["/pizza"
{:get {:summary "Fetch a pizza | Multiple content-types, multiple examples" {:get {:summary "Fetch a pizza | Multiple content-types, multiple examples"
:responses {200 {:content {"application/json" {:description "Fetch a pizza as json" :responses {200 {:description "Fetch a pizza as json or EDN"
:schema [:map :content {"application/json" {:schema [:map
[:color :keyword] [:color :keyword]
[:pineapple :boolean]] [:pineapple :boolean]]
:examples {:white {:description "White pizza with pineapple" :examples {:white {:description "White pizza with pineapple"
@ -60,8 +60,7 @@
:red {:description "Red pizza" :red {:description "Red pizza"
:value {:color :red :value {:color :red
:pineapple false}}}} :pineapple false}}}}
"application/edn" {:description "Fetch a pizza as edn" "application/edn" {:schema [:map
:schema [:map
[:color :keyword] [:color :keyword]
[:pineapple :boolean]] [:pineapple :boolean]]
:examples {:red {:description "Red pizza with pineapple" :examples {:red {:description "Red pizza with pineapple"
@ -71,20 +70,19 @@
:body {:color :red :body {:color :red
:pineapple true}})} :pineapple true}})}
:post {:summary "Create a pizza | Multiple content-types, multiple examples" :post {:summary "Create a pizza | Multiple content-types, multiple examples"
:request {:content {"application/json" {:description "Create a pizza using json" :request {:description "Create a pizza using json or EDN"
:schema [:map :content {"application/json" {:schema [:map
[:color :keyword] [:color :keyword]
[:pineapple :boolean]] [:pineapple :boolean]]
:examples {:purple {:value {:color :purple :examples {:purple {:value {:color :purple
:pineapple false}}}} :pineapple false}}}}
"application/edn" {:description "Create a pizza using EDN" "application/edn" {:schema [:map
:schema [:map
[:color :keyword] [:color :keyword]
[:pineapple :boolean]] [:pineapple :boolean]]
:examples {:purple {:value (pr-str {:color :purple :examples {:purple {:value (pr-str {:color :purple
:pineapple false})}}}}} :pineapple false})}}}}}
:responses {200 {:content {:default {:description "Success" :responses {200 {:description "Success"
:schema [:map [:success :boolean]] :content {:default {:schema [:map [:success :boolean]]
:example {:success true}}}}} :example {:success true}}}}}
:handler (fn [_request] :handler (fn [_request]
{:status 200 {:status 200
@ -114,9 +112,11 @@
:email "heidi@alps.ch"}]})}}] :email "heidi@alps.ch"}]})}}]
["/account" ["/account"
{:get {:summary "Fetch an account | Recursive schemas using malli registry" {:get {:summary "Fetch an account | Recursive schemas using malli registry, link to external docs"
:parameters {:query #'AccountId} :parameters {:query #'AccountId}
:responses {200 {:content {:default {:schema #'Account}}}} :responses {200 {:content {:default {:schema #'Account}}}}
:openapi {:externalDocs {:description "The reitit repository"
:url "https://github.com/metosin/reitit"}}
:handler (fn [_request] :handler (fn [_request]
{:status 200 {:status 200
:body {:bank "MiniBank" :body {:bank "MiniBank"

View file

@ -83,7 +83,7 @@
->content (fn [data schema] ->content (fn [data schema]
(merge (merge
{:schema schema} {:schema schema}
(select-keys data [:description :examples]) (select-keys data [:example :examples])
(:openapi data))) (:openapi data)))
->schema-object (fn [model opts] ->schema-object (fn [model opts]
(let [result (coercion/-get-model-apidocs (let [result (coercion/-get-model-apidocs
@ -112,7 +112,7 @@
(select-keys schema [:description]))) (select-keys schema [:description])))
(into []))}) (into []))})
(when body (when body
;; body uses a single schema to describe every :requestBody ;; :body uses a single schema to describe every :requestBody
;; the schema-object transformer should be able to transform into distinct content-types ;; the schema-object transformer should be able to transform into distinct content-types
{:requestBody {:content (into {} {:requestBody {:content (into {}
(map (fn [content-type] (map (fn [content-type]
@ -123,7 +123,7 @@
request-content-types)}}) request-content-types)}})
(when request (when request
;; request allow to different :requestBody per content-type ;; :request allows different :requestBody per content-type
{:requestBody {:requestBody
(merge (merge
(select-keys request [:description]) (select-keys request [:description])