|
1 | 1 | (ns compojure.api.meta |
2 | 2 | (:require [clojure.walk :refer [keywordize-keys]] |
3 | | - [compojure.api.common :refer :all] |
| 3 | + [compojure.api.common :refer [extract-parameters]] |
4 | 4 | [compojure.api.middleware :as mw] |
5 | 5 | [compojure.api.exception :as ex] |
6 | 6 |
|
7 | 7 | compojure.core |
8 | 8 | #_clout.core |
9 | 9 |
|
10 | | - [plumbing.core :refer :all] |
| 10 | + [plumbing.core :refer [letk]] |
11 | 11 | [plumbing.fnk.impl :as fnk-impl] |
12 | 12 | [ring.swagger.common :as rsc] |
13 | 13 | [ring.swagger.json-schema :as js] |
|
109 | 109 | ;; |
110 | 110 |
|
111 | 111 | (defmethod restructure-param :summary [k v acc] |
112 | | - (update-in acc [:parameters] assoc k v)) |
| 112 | + (update-in acc [:swagger] assoc k v)) |
113 | 113 |
|
114 | 114 | (defmethod restructure-param :description [k v acc] |
115 | | - (update-in acc [:parameters] assoc k v)) |
| 115 | + (update-in acc [:swagger] assoc k v)) |
116 | 116 |
|
117 | 117 | (defmethod restructure-param :operationId [k v acc] |
118 | | - (update-in acc [:parameters] assoc k v)) |
| 118 | + (update-in acc [:swagger] assoc k v)) |
119 | 119 |
|
120 | 120 | (defmethod restructure-param :consumes [k v acc] |
121 | | - (update-in acc [:parameters] assoc k v)) |
| 121 | + (update-in acc [:swagger] assoc k v)) |
122 | 122 |
|
123 | 123 | (defmethod restructure-param :produces [k v acc] |
124 | | - (update-in acc [:parameters] assoc k v)) |
| 124 | + (update-in acc [:swagger] assoc k v)) |
125 | 125 |
|
126 | 126 | ;; |
127 | 127 | ;; Smart restructurings |
|
131 | 131 | ; Example: |
132 | 132 | ; :no-doc true |
133 | 133 | (defmethod restructure-param :no-doc [_ v acc] |
134 | | - (update-in acc [:parameters] assoc :x-no-doc v)) |
| 134 | + (update-in acc [:swagger] assoc :x-no-doc v)) |
135 | 135 |
|
136 | 136 | ; publishes the data as swagger-parameters without any side-effects / coercion. |
137 | 137 | ; Examples: |
|
141 | 141 | ; :paramerers {:query {:q s/Str} |
142 | 142 | ; :body NewUser}}} |
143 | 143 | (defmethod restructure-param :swagger [_ swagger acc] |
144 | | - (update-in acc [:parameters] rsc/deep-merge swagger)) |
| 144 | + (update-in acc [:swagger] rsc/deep-merge swagger)) |
145 | 145 |
|
146 | 146 | ; Route name, used with path-for |
147 | 147 | ; Example: |
148 | 148 | ; :name :user-route |
149 | 149 | (defmethod restructure-param :name [_ v acc] |
150 | | - (update-in acc [:parameters] assoc :x-name v)) |
| 150 | + (update-in acc [:swagger] assoc :x-name v)) |
151 | 151 |
|
152 | 152 | ; Tags for api categorization. Ignores duplicates. |
153 | 153 | ; Examples: |
154 | 154 | ; :tags [:admin] |
155 | 155 | (defmethod restructure-param :tags [_ tags acc] |
156 | | - (update-in acc [:parameters :tags] (comp set into) tags)) |
| 156 | + (update-in acc [:swagger :tags] (comp set into) tags)) |
157 | 157 |
|
158 | 158 | ; Defines a return type and coerces the return value of a body against it. |
159 | 159 | ; Examples: |
|
163 | 163 | (defmethod restructure-param :return [_ schema acc] |
164 | 164 | (let [response (convert-return schema)] |
165 | 165 | (-> acc |
166 | | - (update-in [:parameters :responses] (fnil conj []) response) |
| 166 | + (update-in [:swagger :responses] (fnil conj []) response) |
167 | 167 | (update-in [:responses] (fnil conj []) response)))) |
168 | 168 |
|
169 | 169 | ; value is a map of http-response-code -> Schema. Translates to both swagger |
|
174 | 174 | ; :responses {403 {:schema ErrorEnvelope, :description \"Underflow\"}} |
175 | 175 | (defmethod restructure-param :responses [_ responses acc] |
176 | 176 | (-> acc |
177 | | - (update-in [:parameters :responses] (fnil conj []) responses) |
| 177 | + (update-in [:swagger :responses] (fnil conj []) responses) |
178 | 178 | (update-in [:responses] (fnil conj []) responses))) |
179 | 179 |
|
180 | 180 | ; reads body-params into a enhanced let. First parameter is the let symbol, |
|
184 | 184 | (defmethod restructure-param :body [_ [value schema] acc] |
185 | 185 | (-> acc |
186 | 186 | (update-in [:lets] into [value (src-coerce! schema :body-params :body)]) |
187 | | - (assoc-in [:parameters :parameters :body] schema))) |
| 187 | + (assoc-in [:swagger :parameters :body] schema))) |
188 | 188 |
|
189 | 189 | ; reads query-params into a enhanced let. First parameter is the let symbol, |
190 | 190 | ; second is the Schema to be coerced! against. |
|
193 | 193 | (defmethod restructure-param :query [_ [value schema] acc] |
194 | 194 | (-> acc |
195 | 195 | (update-in [:lets] into [value (src-coerce! schema :query-params :string)]) |
196 | | - (assoc-in [:parameters :parameters :query] schema))) |
| 196 | + (assoc-in [:swagger :parameters :query] schema))) |
197 | 197 |
|
198 | 198 | ; reads header-params into a enhanced let. First parameter is the let symbol, |
199 | 199 | ; second is the Schema to be coerced! against. |
|
202 | 202 | (defmethod restructure-param :headers [_ [value schema] acc] |
203 | 203 | (-> acc |
204 | 204 | (update-in [:lets] into [value (src-coerce! schema :headers :string)]) |
205 | | - (assoc-in [:parameters :parameters :header] schema))) |
| 205 | + (assoc-in [:swagger :parameters :header] schema))) |
206 | 206 |
|
207 | 207 | ; restructures body-params with plumbing letk notation. Example: |
208 | 208 | ; :body-params [id :- Long name :- String] |
209 | 209 | (defmethod restructure-param :body-params [_ body-params acc] |
210 | 210 | (let [schema (strict (fnk-schema body-params))] |
211 | 211 | (-> acc |
212 | 212 | (update-in [:letks] into [body-params (src-coerce! schema :body-params :body)]) |
213 | | - (assoc-in [:parameters :parameters :body] schema)))) |
| 213 | + (assoc-in [:swagger :parameters :body] schema)))) |
214 | 214 |
|
215 | 215 | ; restructures form-params with plumbing letk notation. Example: |
216 | 216 | ; :form-params [id :- Long name :- String] |
217 | 217 | (defmethod restructure-param :form-params [_ form-params acc] |
218 | 218 | (let [schema (strict (fnk-schema form-params))] |
219 | 219 | (-> acc |
220 | 220 | (update-in [:letks] into [form-params (src-coerce! schema :form-params :string)]) |
221 | | - (update-in [:parameters :parameters :formData] st/merge schema) |
222 | | - (assoc-in [:parameters :consumes] ["application/x-www-form-urlencoded"])))) |
| 221 | + (update-in [:swagger :parameters :formData] st/merge schema) |
| 222 | + (assoc-in [:swagger :consumes] ["application/x-www-form-urlencoded"])))) |
223 | 223 |
|
224 | 224 | (defmethod restructure-param :multipart-params [_ params acc] |
225 | 225 | (let [schema (strict (fnk-schema params))] |
226 | 226 | (-> acc |
227 | 227 | (update-in [:letks] into [params (src-coerce! schema :multipart-params :string)]) |
228 | | - (update-in [:parameters :parameters :formData] st/merge schema) |
229 | | - (assoc-in [:parameters :consumes] ["multipart/form-data"])))) |
| 228 | + (update-in [:swagger :parameters :formData] st/merge schema) |
| 229 | + (assoc-in [:swagger :consumes] ["multipart/form-data"])))) |
230 | 230 |
|
231 | 231 | ; restructures header-params with plumbing letk notation. Example: |
232 | 232 | ; :header-params [id :- Long name :- String] |
233 | 233 | (defmethod restructure-param :header-params [_ header-params acc] |
234 | 234 | (let [schema (fnk-schema header-params)] |
235 | 235 | (-> acc |
236 | 236 | (update-in [:letks] into [header-params (src-coerce! schema :headers :string)]) |
237 | | - (assoc-in [:parameters :parameters :header] schema)))) |
| 237 | + (assoc-in [:swagger :parameters :header] schema)))) |
238 | 238 |
|
239 | 239 | ; restructures query-params with plumbing letk notation. Example: |
240 | 240 | ; :query-params [id :- Long name :- String] |
241 | 241 | (defmethod restructure-param :query-params [_ query-params acc] |
242 | 242 | (let [schema (fnk-schema query-params)] |
243 | 243 | (-> acc |
244 | 244 | (update-in [:letks] into [query-params (src-coerce! schema :query-params :string)]) |
245 | | - (assoc-in [:parameters :parameters :query] schema)))) |
| 245 | + (assoc-in [:swagger :parameters :query] schema)))) |
246 | 246 |
|
247 | 247 | ; restructures path-params by plumbing letk notation. Example: |
248 | 248 | ; :path-params [id :- Long name :- String] |
249 | 249 | (defmethod restructure-param :path-params [_ path-params acc] |
250 | 250 | (let [schema (fnk-schema path-params)] |
251 | 251 | (-> acc |
252 | 252 | (update-in [:letks] into [path-params (src-coerce! schema :route-params :string)]) |
253 | | - (assoc-in [:parameters :parameters :path] schema)))) |
| 253 | + (assoc-in [:swagger :parameters :path] schema)))) |
254 | 254 |
|
255 | 255 | ; Applies the given vector of middlewares to the route |
256 | 256 | (defmethod restructure-param :middleware [_ middleware acc] |
|
347 | 347 | (seq responses) (assoc :responses (apply merge responses)))) |
348 | 348 |
|
349 | 349 | (defn restructure [method [path arg & args] {:keys [routes]}] |
350 | | - (let [[parameters body] (extract-parameters args) |
351 | | - [lets letks responses middleware] [[] [] nil []] |
| 350 | + (let [[options body] (extract-parameters args) |
| 351 | + lets [] |
352 | 352 | [path-string lets arg-with-request arg] (destructure-compojure-api-request path lets arg) |
353 | 353 |
|
354 | 354 | {:keys [lets |
355 | 355 | letks |
356 | 356 | responses |
357 | 357 | middleware |
358 | 358 | middlewares |
359 | | - parameters |
| 359 | + swagger |
360 | 360 | body]} (reduce |
361 | 361 | (fn [acc [k v]] |
362 | 362 | (restructure-param k v (update-in acc [:parameters] dissoc k))) |
363 | | - (map-of lets letks responses middleware parameters body) |
364 | | - parameters) |
| 363 | + {:lets lets |
| 364 | + :letks [] |
| 365 | + :responses nil |
| 366 | + :middleware [] |
| 367 | + :swagger {} |
| 368 | + :body body} |
| 369 | + options) |
365 | 370 |
|
366 | 371 | ;; migration helper |
367 | 372 | _ (assert (not middlewares) ":middlewares is deprecated with 1.0.0, use :middleware instead.") |
|
396 | 401 | form))] |
397 | 402 | (if routes |
398 | 403 | `(let [childs# ~(if routes [`(~child-form {})] nil)] |
399 | | - (routes/create ~path-string ~method (merge-parameters ~parameters) childs# ~form)) |
400 | | - `(routes/create ~path-string ~method (merge-parameters ~parameters) nil ~form)))) |
| 404 | + (routes/create ~path-string ~method (merge-parameters ~swagger) childs# ~form)) |
| 405 | + `(routes/create ~path-string ~method (merge-parameters ~swagger) nil ~form)))) |
0 commit comments