diff --git a/src/metabase/api/card.clj b/src/metabase/api/card.clj index 242f34358762ebe7d779a091925b1641da5d2963..d98c9c63e50e11b5377420491616f05df4313b22 100644 --- a/src/metabase/api/card.clj +++ b/src/metabase/api/card.clj @@ -258,6 +258,7 @@ ;;; ------------------------------------------------------------ Running a Query ------------------------------------------------------------ (defn- run-query-for-card [card-id parameters] + {:pre [(u/maybe? sequential? parameters)]} (let [card (read-check Card card-id) query (assoc (:dataset_query card) :parameters parameters @@ -276,5 +277,12 @@ [card-id :as {{:keys [parameters]} :body}] (dataset-api/as-csv (run-query-for-card card-id parameters))) +(defendpoint GET "/:card-id/json" + "Fetch the results of a Card as JSON." + [card-id] + (let [{{:keys [columns rows]} :data} (run-query-for-card card-id nil)] + (for [row rows] + (zipmap columns row)))) + (define-routes) diff --git a/test/metabase/api/card_test.clj b/test/metabase/api/card_test.clj index 6e8aee1b02ef7ec256044ba9e069aff4368e9876..596e5b1729326d1d455f065758fc84ae31add59d 100644 --- a/test/metabase/api/card_test.clj +++ b/test/metabase/api/card_test.clj @@ -340,3 +340,13 @@ (do-with-temp-native-card (fn [database-id card] ((user->client :rasta) :post 403 (format "card/%d/query/csv" (u/get-id card)))))) + + +;;; Tests for GET /api/card/:id/json +;; endpoint should return an array of maps, one for each row +(expect + [{(keyword "COUNT(*)") 75}] + (do-with-temp-native-card + (fn [database-id card] + (perms/grant-native-read-permissions! (perms-group/all-users) database-id) + ((user->client :rasta) :get 200 (format "card/%d/json" (u/get-id card))))))