diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 0422b6e03482069f4345d1420268424c8e444e39..7dc70c9d7325c462169782f2ff016cc18688d5be 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -143,7 +143,7 @@ ;; ;; `nil` or an empty set Otherwise this should be a set of namespace symbols. :api-namespaces - {metabase.actions :any + {metabase.actions #{metabase.actions.core} metabase.analytics :any metabase.analyze :any metabase.api :any diff --git a/src/metabase/actions/core.clj b/src/metabase/actions/core.clj new file mode 100644 index 0000000000000000000000000000000000000000..e02a146d9201cecc47c9da280e8ec98f4caf88dc --- /dev/null +++ b/src/metabase/actions/core.clj @@ -0,0 +1,32 @@ +(ns metabase.actions.core + "API namespace for the `metabase.actions` module." + (:require + [metabase.actions :as actions] + [metabase.actions.error :as actions.error] + [metabase.actions.execution :as actions.execution] + [metabase.actions.http-action :as actions.http-action] + [potemkin :as p])) + +(comment + actions/keep-me + actions.error/keep-me + actions.execution/keep-me + actions.http-action/keep-me) + +(p/import-vars + [actions + cached-value + check-actions-enabled! + check-actions-enabled-for-database! + perform-action!*] + [actions.error + incorrect-value-type + violate-foreign-key-constraint + violate-not-null-constraint + violate-unique-constraint] + [actions.execution + execute-action! + execute-dashcard! + fetch-values] + [actions.http-action + apply-json-query]) diff --git a/src/metabase/api/action.clj b/src/metabase/api/action.clj index 87559b645cae9327dbe062ef6a68a903db3137ae..b4d4a8351c30436606486ef25458b94b225c84cb 100644 --- a/src/metabase/api/action.clj +++ b/src/metabase/api/action.clj @@ -3,9 +3,7 @@ (:require [cheshire.core :as json] [compojure.core :as compojure :refer [POST]] - [metabase.actions :as actions] - [metabase.actions.execution :as actions.execution] - [metabase.actions.http-action :as http-action] + [metabase.actions.core :as actions] [metabase.analytics.snowplow :as snowplow] [metabase.api.common :as api] [metabase.api.common.validation :as validation] @@ -25,7 +23,7 @@ [:and string? (mu/with-api-error-message - [:fn #(http-action/apply-json-query {} %)] + [:fn #(actions/apply-json-query {} %)] (deferred-tru "must be a valid json-query, something like ''.item.title''"))]) (def ^:private supported-action-type @@ -207,7 +205,7 @@ (actions/check-actions-enabled! action-id) (-> (action/select-action :id action-id :archived false) api/read-check - (actions.execution/fetch-values (json/parse-string parameters)))) + (actions/fetch-values (json/parse-string parameters)))) (api/defendpoint POST "/:id/execute" "Execute the Action. @@ -220,6 +218,6 @@ (snowplow/track-event! ::snowplow/action-executed api/*current-user-id* {:source :model_detail :type type :action_id id}) - (actions.execution/execute-action! action (update-keys parameters name)))) + (actions/execute-action! action (update-keys parameters name)))) (api/define-routes) diff --git a/src/metabase/api/dashboard.clj b/src/metabase/api/dashboard.clj index bf894e8485d9cfcf0ddb4c4ce1400e55d1776a51..ac54aaa1d8cce8b4cfeb206b57ba9efe9f79d46c 100644 --- a/src/metabase/api/dashboard.clj +++ b/src/metabase/api/dashboard.clj @@ -5,7 +5,7 @@ [clojure.set :as set] [compojure.core :refer [DELETE GET POST PUT]] [medley.core :as m] - [metabase.actions.execution :as actions.execution] + [metabase.actions.core :as actions] [metabase.analytics.snowplow :as snowplow] [metabase.api.common :as api] [metabase.api.common.validation :as validation] @@ -1122,7 +1122,7 @@ dashcard-id ms/PositiveInt parameters ms/JSONString} (api/read-check :model/Dashboard dashboard-id) - (actions.execution/fetch-values + (actions/fetch-values (api/check-404 (action/dashcard->action dashcard-id)) (json/parse-string parameters))) @@ -1137,7 +1137,7 @@ parameters [:maybe [:map-of :string :any]]} (api/read-check :model/Dashboard dashboard-id) ;; Undo middleware string->keyword coercion - (actions.execution/execute-dashcard! dashboard-id dashcard-id parameters)) + (actions/execute-dashcard! dashboard-id dashcard-id parameters)) ;;; ---------------------------------- Running the query associated with a Dashcard ---------------------------------- diff --git a/src/metabase/api/public.clj b/src/metabase/api/public.clj index 280e684797748067e8d36b6ecc26cc7effe2cc13..2015ffdec8963a86fa5dd40ae89853b50ce29767 100644 --- a/src/metabase/api/public.clj +++ b/src/metabase/api/public.clj @@ -4,8 +4,7 @@ [cheshire.core :as json] [compojure.core :refer [GET]] [medley.core :as m] - [metabase.actions :as actions] - [metabase.actions.execution :as actions.execution] + [metabase.actions.core :as actions] [metabase.analytics.snowplow :as snowplow] [metabase.api.card :as api.card] [metabase.api.common :as api] @@ -301,7 +300,7 @@ parameters ms/JSONString} (validation/check-public-sharing-enabled) (api/check-404 (t2/select-one-pk Dashboard :public_uuid uuid :archived false)) - (actions.execution/fetch-values + (actions/fetch-values (api/check-404 (action/dashcard->action dashcard-id)) (json/parse-string parameters))) @@ -334,7 +333,7 @@ ;; you're by definition allowed to run it without a perms check anyway (binding [api/*current-user-permissions-set* (delay #{"/"})] ;; Undo middleware string->keyword coercion - (actions.execution/execute-dashcard! dashboard-id dashcard-id (update-keys parameters name)))))))) + (actions/execute-dashcard! dashboard-id dashcard-id (update-keys parameters name)))))))) (api/defendpoint GET "/oembed" "oEmbed endpoint used to retreive embed code and metadata for a (public) Metabase URL." @@ -654,7 +653,7 @@ :type (:type action) :action_id (:id action)}) ;; Undo middleware string->keyword coercion - (actions.execution/execute-action! action (update-keys parameters name)))))))) + (actions/execute-action! action (update-keys parameters name)))))))) ;;; ----------------------------------------- Route Definitions & Complaints ----------------------------------------- diff --git a/src/metabase/driver/h2/actions.clj b/src/metabase/driver/h2/actions.clj index f7590fbcb592760470fae044edc1a60e8aac2d17..0d838752d1da50016eb54702f12f7131d03a69da 100644 --- a/src/metabase/driver/h2/actions.clj +++ b/src/metabase/driver/h2/actions.clj @@ -3,7 +3,7 @@ (:require [clojure.java.jdbc :as jdbc] [clojure.string :as str] - [metabase.actions.error :as actions.error] + [metabase.actions.core :as actions] [metabase.driver.sql-jdbc.actions :as sql-jdbc.actions] [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn] [metabase.util :as u] @@ -63,7 +63,7 @@ [[] nil nil] (jdbc/reducible-query jdbc-spec sql-args {:identifers identity, :transaction? false}))))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/violate-not-null-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/violate-not-null-constraint] [_driver error-type _database _action-type error-message] (when-let [[_ column] (re-find #"NULL not allowed for column \"([^\"]+)\"" error-message)] @@ -71,7 +71,7 @@ :message (tru "{0} must have values." (str/capitalize column)) :errors {column (tru "You must provide a value.")}})) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/violate-unique-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/violate-unique-constraint] [_driver error-type database _action-type error-message] (when-let [[_match constraint-name table] (re-find #"Unique index or primary key violation: \"[^.]+.(.+?) ON [^.]+.\"\"(.+?)\"\"" error-message)] @@ -83,7 +83,7 @@ {} columns)}))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/violate-foreign-key-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/violate-foreign-key-constraint] [_driver error-type _database action-type error-message] (when-let [[_match column] (re-find #"Referential integrity constraint violation: \"[^\:]+: [^\s]+ FOREIGN KEY\(([^\s]+)\)" error-message)] @@ -102,7 +102,7 @@ {:message (tru "Unable to update the record.") :errors {column (tru "This {0} does not exist." (str/capitalize column))}}))))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/incorrect-value-type] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/incorrect-value-type] [_driver error-type _database _action-type error-message] (when-let [[_ _expected-type _value] (re-find #"Data conversion error converting .*" error-message)] diff --git a/src/metabase/driver/mysql/actions.clj b/src/metabase/driver/mysql/actions.clj index 66319a00dfc15c3c3851a8bd45f3e042c8529484..b10ffe6e1522224d2b2353baba8e64272ac27169 100644 --- a/src/metabase/driver/mysql/actions.clj +++ b/src/metabase/driver/mysql/actions.clj @@ -3,7 +3,7 @@ (:require [clojure.java.jdbc :as jdbc] [clojure.string :as str] - [metabase.actions.error :as actions.error] + [metabase.actions.core :as actions] [metabase.driver.sql-jdbc.actions :as sql-jdbc.actions] [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn] [metabase.driver.sql-jdbc.execute :as sql-jdbc.execute] @@ -48,7 +48,7 @@ [[] nil nil] (jdbc/reducible-query jdbc-spec sql-args {:identifers identity, :transaction? false}))))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/violate-not-null-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/violate-not-null-constraint] [_driver error-type _database _action-type error-message] (or (when-let [[_ column] @@ -62,7 +62,7 @@ :message (tru "{0} must have values." (str/capitalize column)) :errors {column (tru "You must provide a value.")}}))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/violate-unique-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/violate-unique-constraint] [_driver error-type database _action-type error-message] (when-let [[_match constraint] (re-find #"Duplicate entry '.+' for key '(.+)'" error-message)] @@ -75,7 +75,7 @@ {} columns)}))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/violate-foreign-key-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/violate-foreign-key-constraint] [_driver error-type _database action-type error-message] (or (when-let [[_match _ref-table _constraint _fkey-cols column _key-cols] @@ -102,7 +102,7 @@ (tru "Unable to update the record.")) :errors {(remove-backticks column) (tru "This {0} does not exist." (str/capitalize (remove-backticks column)))}})))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/incorrect-value-type] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/incorrect-value-type] [_driver error-type _database _action-type error-message] (when-let [[_ expected-type _value _database _table column _row] (re-find #"Incorrect (.+?) value: '(.+)' for column (?:(.+)\.)??(?:(.+)\.)?(.+) at row (\d+)" error-message)] diff --git a/src/metabase/driver/postgres/actions.clj b/src/metabase/driver/postgres/actions.clj index 4eb99c4db314430934108f850903019f624d7f99..cc915aac6d8eb7b74443119bfac941eb03af2c85 100644 --- a/src/metabase/driver/postgres/actions.clj +++ b/src/metabase/driver/postgres/actions.clj @@ -3,7 +3,7 @@ (:require [clojure.java.jdbc :as jdbc] [clojure.string :as str] - [metabase.actions.error :as actions.error] + [metabase.actions.core :as actions] [metabase.driver.sql-jdbc.actions :as sql-jdbc.actions] [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn] [metabase.util :as u] @@ -23,7 +23,7 @@ (map :column_name) (jdbc/reducible-query jdbc-spec sql-args {:identifers identity, :transaction? false})))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/violate-not-null-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/violate-not-null-constraint] [_driver error-type _database _action-type error-message] (when-let [[_ column] (re-find #"null value in column \"([^\"]+)\".*violates not-null constraint" error-message)] @@ -31,7 +31,7 @@ :message (tru "{0} must have values." (str/capitalize column)) :errors {column (tru "You must provide a value.")}})) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/violate-unique-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/violate-unique-constraint] [_driver error-type database _action-type error-message] (when-let [[_match constraint _value] (re-find #"duplicate key value violates unique constraint \"([^\"]+)\"" error-message)] @@ -43,7 +43,7 @@ {} columns)}))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/violate-foreign-key-constraint] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/violate-foreign-key-constraint] [_driver error-type _database action-type error-message] (or (when-let [[_match _table _constraint _ref-table column _value _ref-table-2] (re-find #"update or delete on table \"([^\"]+)\" violates foreign key constraint \"([^\"]+)\" on table \"([^\"]+)\"\n Detail: Key \((.*?)\)=\((.*?)\) is still referenced from table \"([^\"]+)\"" error-message)] @@ -67,7 +67,7 @@ (tru "Unable to update the record.")) :errors {column (tru "This {0} does not exist." (str/capitalize column))}}))) -(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/incorrect-value-type] +(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/incorrect-value-type] [_driver error-type _database _action-type error-message] (when-let [[_] (re-find #"invalid input syntax for .*" error-message)] {:type error-type diff --git a/src/metabase/driver/sql_jdbc/actions.clj b/src/metabase/driver/sql_jdbc/actions.clj index f5c91df8614219945f226756679853ad7f533d4f..c41060f3ab64901e34b881bd9b9e94841e65a59e 100644 --- a/src/metabase/driver/sql_jdbc/actions.clj +++ b/src/metabase/driver/sql_jdbc/actions.clj @@ -5,7 +5,7 @@ [clojure.string :as str] [flatland.ordered.set :as ordered-set] [medley.core :as m] - [metabase.actions :as actions] + [metabase.actions.core :as actions] [metabase.driver :as driver] [metabase.driver.sql-jdbc.execute :as sql-jdbc.execute] [metabase.driver.sql.query-processor :as sql.qp]