|
1 | 1 | (ns compojure.api.api
|
2 | 2 | (:require [compojure.api.core :as c]
|
3 | 3 | [compojure.api.swagger :as swagger]
|
4 |
| - [compojure.api.middleware :as middleware] |
| 4 | + [compojure.api.middleware :as mw] |
| 5 | + [compojure.api.request :as request] |
5 | 6 | [compojure.api.routes :as routes]
|
6 | 7 | [compojure.api.common :as common]
|
7 |
| - [compojure.api.coerce :as coerce] |
| 8 | + [compojure.api.request :as request] |
8 | 9 | [ring.swagger.common :as rsc]
|
9 | 10 | [ring.swagger.middleware :as rsm]))
|
10 | 11 |
|
11 | 12 | (def api-defaults
|
12 | 13 | (merge
|
13 |
| - middleware/api-middleware-defaults |
| 14 | + mw/api-middleware-defaults |
14 | 15 | {:api {:invalid-routes-fn routes/log-invalid-child-routes
|
15 | 16 | :disable-api-middleware? false}
|
16 | 17 | :swagger {:ui nil, :spec nil}}))
|
|
23 | 24 | options map as the first parameter:
|
24 | 25 |
|
25 | 26 | (api
|
26 |
| - {:formats [:json-kw :edn :transit-msgpack :transit-json] |
27 |
| - :exceptions {:handlers {:compojure.api.exception/default my-logging-handler}} |
| 27 | + {:exceptions {:handlers {:compojure.api.exception/default my-logging-handler}} |
28 | 28 | :api {:invalid-routes-fn (constantly nil)}
|
29 | 29 | :swagger {:spec \"/swagger.json\"
|
30 | 30 | :ui \"/api-docs\"
|
|
47 | 47 |
|
48 | 48 | ### api-middleware options
|
49 | 49 |
|
| 50 | + See `compojure.api.middleware/api-middleware` for more available options. |
| 51 | +
|
50 | 52 | " (:doc (meta #'compojure.api.middleware/api-middleware)))}
|
51 | 53 | api
|
52 | 54 | [& body]
|
53 | 55 | (let [[options handlers] (common/extract-parameters body false)
|
| 56 | + _ (assert (not (contains? options :format)) |
| 57 | + (str "ERROR: Option [:format] is not used with 2.* version.\n" |
| 58 | + "Compojure-api uses now Muuntaja insted of ring-middleware-format,\n" |
| 59 | + "the new formatting options for it should be under [:formats]. See\n" |
| 60 | + "[[api-middleware]] documentation for more details.\n")) |
| 61 | + _ (when (and (not (:formatter options)) |
| 62 | + (not (contains? options :formats)) |
| 63 | + (not (System/getProperty "compojure.api.middleware.global-default-formatter"))) |
| 64 | + (throw (ex-info (str "ERROR: Please set `:formatter :muuntaja` in the options map of `api`.\n" |
| 65 | + "e.g., (api {:formatter :muuntaja} routes...)\n" |
| 66 | + "To prepare for backwards compatibility with compojure-api 1.x, the formatting library must be\n" |
| 67 | + "explicitly chosen if not configured by `:format` (ring-middleware-format) or \n" |
| 68 | + "`:formats` (muuntaja). Once 2.x is stable, the default will be `:formatter :ring-middleware-format`.\n" |
| 69 | + "To globally override the formatter, use -Dcompojure.api.middleware.global-default-formatter=:muuntaja") |
| 70 | + {}))) |
54 | 71 | options (rsc/deep-merge api-defaults options)
|
55 | 72 | handler (apply c/routes (concat [(swagger/swagger-routes (:swagger options))] handlers))
|
56 |
| - routes (routes/get-routes handler (:api options)) |
| 73 | + partial-api-route (routes/map->Route |
| 74 | + {:childs [handler] |
| 75 | + :info {:coercion (:coercion options)}}) |
| 76 | + routes (routes/get-routes partial-api-route (:api options)) |
57 | 77 | paths (-> routes routes/ring-swagger-paths swagger/transform-operations)
|
58 | 78 | lookup (routes/route-lookup-table routes)
|
59 | 79 | swagger-data (get-in options [:swagger :data])
|
60 | 80 | enable-api-middleware? (not (get-in options [:api :disable-api-middleware?]))
|
61 |
| - api-handler (cond-> handler |
62 |
| - swagger-data (rsm/wrap-swagger-data swagger-data) |
63 |
| - enable-api-middleware? (middleware/api-middleware |
64 |
| - (dissoc options :api :swagger)) |
65 |
| - true (middleware/wrap-options |
66 |
| - {:paths paths |
67 |
| - :coercer (coerce/memoized-coercer) |
68 |
| - :lookup lookup}))] |
69 |
| - (routes/create nil nil {} [handler] api-handler))) |
| 81 | + api-middleware-options (dissoc (mw/api-middleware-options (assoc (dissoc options :api :swagger) ::via-api true)) |
| 82 | + ::mw/api-middleware-defaults) |
| 83 | + api-handler (-> handler |
| 84 | + (cond-> swagger-data (rsm/wrap-swagger-data swagger-data)) |
| 85 | + (cond-> enable-api-middleware? (mw/api-middleware |
| 86 | + api-middleware-options)) |
| 87 | + (mw/wrap-inject-data |
| 88 | + {::request/paths paths |
| 89 | + ::request/lookup lookup}))] |
| 90 | + (assoc partial-api-route :handler api-handler))) |
70 | 91 |
|
71 | 92 | (defmacro
|
72 |
| - ^{:doc (str |
73 |
| - "Defines an api. |
| 93 | + ^{:superseded-by "api" |
| 94 | + :deprecated "2.0.0" |
| 95 | + :doc (str |
| 96 | + "Deprecated: please use (def name (api ...body..)) |
| 97 | + |
| 98 | + Defines an api. |
74 | 99 |
|
75 | 100 | API middleware options:
|
76 | 101 |
|
|
0 commit comments