/api/channel endpoints. Currently only used for http channels. | (ns ^{:added "0.51.0"} metabase.channel.api.channel (:require [metabase.api.common :as api] [metabase.api.common.validation :as validation] [metabase.api.macros :as api.macros] [metabase.channel.core :as channel] [metabase.events :as events] [metabase.models.interface :as mi] [metabase.util :as u] [metabase.util.i18n :refer [deferred-tru]] [metabase.util.malli :as mu] [metabase.util.malli.schema :as ms] [toucan2.core :as t2])) |
Remove the details field if the current user does not have write permissions for the channel. | (defn- remove-details-if-needed [channel] (if (mi/can-write? channel) channel (dissoc channel :details))) |
(api.macros/defendpoint :get "/" "Get all channels" [_route-params _query-params {:keys [include_inactive]} :- [:map [:include_inactive {:optional true} [:maybe {:default false} :boolean]]]] (map remove-details-if-needed (if include_inactive (t2/select :model/Channel) (t2/select :model/Channel :active true)))) | |
(def ^:private ChannelType (mu/with-api-error-message [:fn {:decode/string keyword} #(= "channel" (namespace (keyword %)))] (deferred-tru "Must be a namespaced channel. E.g: channel/http"))) | |
(api.macros/defendpoint :post "/" "Create a channel" [_route-params _query-params {channel-name :name, :as body} :- [:map [:name ms/NonBlankString] [:description {:optional true} [:maybe ms/NonBlankString]] [:type ChannelType] [:details :map] [:active {:optional true} [:maybe {:default true} :boolean]]]] (validation/check-has-application-permission :setting) (when (t2/exists? :model/Channel :name channel-name) (throw (ex-info "Channel with that name already exists" {:status-code 409 :errors {:name "Channel with that name already exists"}}))) (u/prog1 (t2/insert-returning-instance! :model/Channel body) (events/publish-event! :event/channel-create {:object <> :user-id api/*current-user-id*}))) | |
(api.macros/defendpoint :get "/:id" "Get a channel" [{:keys [id]} :- [:map [:id ms/PositiveInt]]] (-> (t2/select-one :model/Channel id) api/check-404 remove-details-if-needed)) | |
(api.macros/defendpoint :put "/:id" "Update a channel" [{:keys [id]} :- [:map [:id ms/PositiveInt]] _query-params body :- [:map [:name {:optional true} [:maybe ms/NonBlankString]] [:description {:optional true} [:maybe ms/NonBlankString]] [:type {:optional true} [:maybe ChannelType]] [:details {:optional true} [:maybe :map]] [:active {:optional true} [:maybe :boolean]]]] (validation/check-has-application-permission :setting) (let [channel-before-update (api/check-404 (t2/select-one :model/Channel id))] (t2/update! :model/Channel id body) (u/prog1 (t2/select-one :model/Channel id) (events/publish-event! :event/channel-update {:object <> :user-id api/*current-user-id* :previous-object channel-before-update})))) | |
Test if a channel can be connected, throw an exception if it fails. | (defn- test-channel-connection! [type details] (try (let [result (channel/can-connect? type details)] (if-not (true? result) {:status 400 :body {:message "Unable to connect channel" :data {:connection-result result}}} {:ok true})) (catch Exception e {:status 400 :body {:message (ex-message e) :data (ex-data e)}}))) |
(api.macros/defendpoint :post "/test" "Test a channel connection" [_route-params _query-params {:keys [type details]} :- [:map [:type ChannelType] [:details :map]]] (test-channel-connection! type details)) | |