Native query snippet (/api/native-query-snippet) endpoints. | (ns metabase.api.native-query-snippet (:require [clojure.data :as data] [metabase.api.common :as api] [metabase.api.macros :as api.macros] [metabase.models.interface :as mi] [metabase.models.native-query-snippet :as native-query-snippet] [metabase.util :as u] [metabase.util.i18n :refer [tru]] [metabase.util.malli :as mu] [metabase.util.malli.schema :as ms] [toucan2.core :as t2])) |
(set! *warn-on-reflection* true) | |
(mu/defn- hydrated-native-query-snippet :- [:maybe (ms/InstanceOf :model/NativeQuerySnippet)]
[id :- ms/PositiveInt]
(-> (api/read-check (t2/select-one :model/NativeQuerySnippet :id id))
(t2/hydrate :creator))) | |
(api.macros/defendpoint :get "/"
"Fetch all snippets"
[_route-params
{:keys [archived]} :- [:map
[:archived {:default false} [:maybe ms/BooleanValue]]]]
(let [snippets (t2/select :model/NativeQuerySnippet
:archived archived
{:order-by [[:%lower.name :asc]]})]
(t2/hydrate (filter mi/can-read? snippets) :creator))) | |
(api.macros/defendpoint :get "/:id"
"Fetch native query snippet with ID."
[{:keys [id]} :- [:map
[:id ms/PositiveInt]]]
(hydrated-native-query-snippet id)) | |
(defn- check-snippet-name-is-unique [snippet-name]
(when (t2/exists? :model/NativeQuerySnippet :name snippet-name)
(throw (ex-info (tru "A snippet with that name already exists. Please pick a different name.")
{:status-code 400})))) | |
(api.macros/defendpoint :post "/"
"Create a new `NativeQuerySnippet`."
[_route-params
_query-params
{:keys [content description name collection_id]} :- [:map
[:content :string]
[:description {:optional true} [:maybe :string]]
[:name native-query-snippet/NativeQuerySnippetName]
[:collection_id {:optional true} [:maybe ms/PositiveInt]]]]
(check-snippet-name-is-unique name)
(let [snippet {:content content
:creator_id api/*current-user-id*
:description description
:name name
:collection_id collection_id}]
(api/create-check :model/NativeQuerySnippet snippet)
(api/check-500 (first (t2/insert-returning-instances! :model/NativeQuerySnippet snippet))))) | |
Check whether current user has write permissions, then update NativeQuerySnippet with values in | (defn- check-perms-and-update-snippet!
[id body]
(let [snippet (t2/select-one :model/NativeQuerySnippet :id id)
body-fields (u/select-keys-when body
:present #{:description :collection_id}
:non-nil #{:archived :content :name})
[changes] (data/diff body-fields snippet)]
(when (seq changes)
(api/update-check snippet changes)
(when-let [new-name (:name changes)]
(check-snippet-name-is-unique new-name))
(t2/update! :model/NativeQuerySnippet id changes))
(hydrated-native-query-snippet id))) |
(api.macros/defendpoint :put "/:id"
"Update an existing `NativeQuerySnippet`."
[{:keys [id]} :- [:map
[:id ms/PositiveInt]]
_query-params
body :- [:map
[:archived {:optional true} [:maybe :boolean]]
[:content {:optional true} [:maybe :string]]
[:description {:optional true} [:maybe :string]]
[:name {:optional true} [:maybe native-query-snippet/NativeQuerySnippetName]]
[:collection_id {:optional true} [:maybe ms/PositiveInt]]]]
(check-perms-and-update-snippet! id body)) | |