Bulk endpoints for Cards | (ns metabase.api.cards (:require [metabase.api.card :as api.card] [metabase.api.macros :as api.macros] [metabase.models.interface :as mi] [metabase.util.malli :as mu] [metabase.util.malli.schema :as ms] [toucan2.core :as t2])) |
Get dashboards that a card with id | (mu/defn get-dashboards [card-id :- ms/PositiveInt] (let [card (t2/select-one :model/Card :id card-id)] (:in_dashboards (t2/hydrate card :in_dashboards)))) |
(defn- present-dashboard [dashboard] (-> (cond (not (mi/can-read? dashboard)) {:error :unreadable-dashboard} (not (mi/can-write? dashboard)) (merge dashboard {:error :unwritable-dashboard}) :else dashboard) (select-keys [:id :name :error]))) | |
(api.macros/defendpoint :post "/dashboards" "Get the dashboards that multiple cards appear in. The response is a sequence of maps, each of which has a `card_id` and `dashboards`. `dashboard` may include an `:error` key, either `:unreadable-dashboard` or `:unwritable-dashboard`. In the case of an `unreadable-dashboard` the dashboard details (name, ID) will NOT be present." [_route-params _query-params {:keys [card_ids]} :- [:map [:card_ids [:sequential ms/PositiveInt]]]] (->> card_ids (mapv (fn [card-id] {:card_id card-id :dashboards (map present-dashboard (get-dashboards card-id))})))) | |
(api.macros/defendpoint :post "/move" "Moves a number of Cards to a single collection or dashboard. For now, just either succeed or fail as a batch - we can think more about error handling later down the road." [_route-params _query-params {:keys [card_ids], :as body} :- [:map [:card_ids [:sequential ms/PositiveInt]] [:collection_id {:optional true} [:maybe ms/PositiveInt]] [:dashboard_id {:optional true} [:maybe ms/PositiveInt]]]] (t2/with-transaction [_conn] (doseq [card-id card_ids] (api.card/update-card! card-id (select-keys body [:collection_id :dashboard_id]) true))) {:status :success}) | |