(ns metabase.api.routes (:require [compojure.route :as route] [metabase.actions.api] [metabase.activity-feed.api] [metabase.api.api-key] [metabase.api.cache] [metabase.api.card] [metabase.api.cards] [metabase.api.collection] [metabase.api.dashboard] [metabase.api.database] [metabase.api.dataset] [metabase.api.docs] [metabase.api.embed] [metabase.api.field] [metabase.api.geojson] [metabase.api.macros :as api.macros] [metabase.api.native-query-snippet] [metabase.api.notification] [metabase.api.notification.unsubscribe] [metabase.api.open-api :as open-api] [metabase.api.premium-features] [metabase.api.preview-embed] [metabase.api.routes.common :as routes.common :refer [+static-apikey]] [metabase.api.setting] [metabase.api.slack] [metabase.api.table] [metabase.api.task] [metabase.api.testing] [metabase.api.user] [metabase.api.util] [metabase.api.util.handlers :as handlers] [metabase.bookmarks.api] [metabase.channel.api] [metabase.cloud-migration.api] [metabase.config :as config] [metabase.indexed-entities.api] [metabase.login-history.api] [metabase.model-persistence.api] [metabase.permissions.api] [metabase.public-sharing.api] [metabase.pulse.api] [metabase.revisions.api] [metabase.search.api] [metabase.segments.api] [metabase.session.api] [metabase.setup.api] [metabase.sso.api] [metabase.sync.api] [metabase.tiles.api] [metabase.timeline.api] [metabase.user-key-value.api] [metabase.util.i18n :refer [deferred-tru]] [metabase.xrays.api])) | |
(comment metabase.actions.api/keep-me metabase.activity-feed.api/keep-me metabase.api.api-key/keep-me metabase.api.cache/keep-me metabase.api.card/keep-me metabase.api.cards/keep-me metabase.api.collection/keep-me metabase.api.dashboard/keep-me metabase.api.database/keep-me metabase.api.dataset/keep-me metabase.api.embed/keep-me metabase.api.field/keep-me metabase.api.geojson/keep-me metabase.api.native-query-snippet/keep-me metabase.api.preview-embed/keep-me metabase.api.setting/keep-me metabase.api.slack/keep-me metabase.api.table/keep-me metabase.api.task/keep-me metabase.api.testing/keep-me metabase.api.user/keep-me metabase.api.util/keep-me metabase.bookmarks.api/keep-me metabase.cloud-migration.api/keep-me metabase.indexed-entities.api/keep-me metabase.login-history.api/keep-me metabase.model-persistence.api/keep-me metabase.permissions.api/keep-me metabase.public-sharing.api/keep-me metabase.revisions.api/keep-me metabase.segments.api/keep-me metabase.setup.api/keep-me metabase.tiles.api/keep-me metabase.user-key-value.api/keep-me) | |
Always 'falls thru' to the next handler. | (def ^:private ^{:arglists '([request respond raise])} pass-thru-handler (open-api/handler-with-open-api-spec (fn [_request respond _raise] (respond nil)) ;; no OpenAPI spec for this handler. (fn [_prefix] nil))) |
Always returns a 404. | (def ^:private ^{:arglists '([request respond raise])} not-found-handler (open-api/handler-with-open-api-spec (route/not-found (constantly {:status 404, :body (deferred-tru "API endpoint does not exist.")})) ;; no OpenAPI spec for this handler. (fn [_prefix] nil))) |
(def ^:private enable-testing-routes? (or (not config/is-prod?) (config/config-bool :mb-enable-test-endpoints))) | |
(defn- ->handler [x] (cond-> x (simple-symbol? x) api.macros/ns-handler)) | |
(defn- +auth [handler] (routes.common/+auth (->handler handler))) (defn- +message-only-exceptions [handler] (routes.common/+message-only-exceptions (->handler handler))) (defn- +public-exceptions [handler] (routes.common/+public-exceptions (->handler handler))) | |
(declare routes) | |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! !!
!! DO NOT ADD | |
(def ^:private ^{:arglists '([request respond raise])} notification-routes (handlers/routes (handlers/route-map-handler {"/unsubscribe" 'metabase.api.notification.unsubscribe}) (+auth 'metabase.api.notification))) | |
↓↓↓ KEEP THIS SORTED OR ELSE! ↓↓↓ | (def ^:private route-map {"/action" (+auth 'metabase.actions.api) "/activity" (+auth 'metabase.activity-feed.api) "/alert" (+auth metabase.pulse.api/alert-routes) "/api-key" (+auth 'metabase.api.api-key) "/automagic-dashboards" (+auth metabase.xrays.api/automagic-dashboards-routes) "/bookmark" (+auth 'metabase.bookmarks.api) "/cache" (+auth 'metabase.api.cache) "/card" (+auth 'metabase.api.card) "/cards" (+auth 'metabase.api.cards) "/channel" (+auth metabase.channel.api/channel-routes) "/cloud-migration" (+auth 'metabase.cloud-migration.api) "/collection" (+auth 'metabase.api.collection) "/dashboard" (+auth 'metabase.api.dashboard) "/database" (+auth 'metabase.api.database) "/dataset" 'metabase.api.dataset "/docs" (metabase.api.docs/make-routes #'routes) "/email" metabase.channel.api/email-routes "/embed" (+message-only-exceptions 'metabase.api.embed) "/field" (+auth 'metabase.api.field) "/geojson" 'metabase.api.geojson "/google" (+auth metabase.sso.api/google-auth-routes) "/ldap" (+auth metabase.sso.api/ldap-routes) "/login-history" (+auth 'metabase.login-history.api) "/model-index" (+auth 'metabase.indexed-entities.api) "/native-query-snippet" (+auth 'metabase.api.native-query-snippet) "/notification" notification-routes "/notify" (+static-apikey metabase.sync.api/notify-routes) "/permissions" (+auth 'metabase.permissions.api) "/persist" (+auth 'metabase.model-persistence.api) "/premium-features" (+auth metabase.api.premium-features/routes) "/preview_embed" (+auth 'metabase.api.preview-embed) "/public" (+public-exceptions 'metabase.public-sharing.api) "/pulse" metabase.pulse.api/pulse-routes "/revision" (+auth 'metabase.revisions.api) "/search" (+auth metabase.search.api/routes) "/segment" (+auth 'metabase.segments.api) "/session" metabase.session.api/routes "/setting" (+auth 'metabase.api.setting) "/setup" 'metabase.setup.api "/slack" (+auth 'metabase.api.slack) "/table" (+auth 'metabase.api.table) "/task" (+auth 'metabase.api.task) "/testing" (if enable-testing-routes? 'metabase.api.testing pass-thru-handler) "/tiles" (+auth 'metabase.tiles.api) "/timeline" (+auth metabase.timeline.api/timeline-routes) "/timeline-event" (+auth metabase.timeline.api/timeline-event-routes) "/user" (+auth 'metabase.api.user) "/user-key-value" (+auth 'metabase.user-key-value.api) "/util" 'metabase.api.util}) |
↑↑↑ KEEP THIS SORTED OR ELSE ↑↑↑ | |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! !!
!! DO NOT ADD | |
Ring routes for API endpoints. | (def ^{:arglists '([request respond raise])} routes ;; EE routes defined in [[metabase-enterprise.api.routes/routes]] always get the first chance to handle a request, if ;; they exist. If they don't exist, this handler returns `nil` which means we will try the next handler. (handlers/routes (if (and config/ee-available? (not *compile-files*)) (requiring-resolve 'metabase-enterprise.api.routes/routes) pass-thru-handler) (handlers/route-map-handler route-map) not-found-handler)) |