From a68e98805224b92053dfbe599864bc9fdf0e0c58 Mon Sep 17 00:00:00 2001
From: Case Nelson <case@metabase.com>
Date: Tue, 11 Oct 2022 12:09:46 -0600
Subject: [PATCH] [Apps] Scaffold implicit actions (#25815)

When scaffolding, we should be automatically adding the
insert,update,delete implicit actions.

* Add order by on test

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
---
 src/metabase/api/app.clj       |  6 +++++-
 test/metabase/api/app_test.clj | 25 +++++++++++++++++++++----
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/metabase/api/app.clj b/src/metabase/api/app.clj
index 2a1c09ca840..5435a71d644 100644
--- a/src/metabase/api/app.clj
+++ b/src/metabase/api/app.clj
@@ -8,7 +8,7 @@
     [metabase.api.collection :as api.collection]
     [metabase.api.common :as api]
     [metabase.mbql.schema :as mbql.s]
-    [metabase.models :refer [App Collection Dashboard Table]]
+    [metabase.models :refer [App Collection Dashboard ModelAction Table]]
     [metabase.models.app.graph :as app.graph]
     [metabase.models.collection :as collection]
     [metabase.models.dashboard :as dashboard]
@@ -108,6 +108,10 @@
                                                                       (cond-> ;; card
                                                                         (not (:dataset card))
                                                                         (update-in [:dataset_query :query :source_table] #(str "card__" %)))))]
+                                  (when (:dataset card)
+                                    (db/insert-many! ModelAction [{:card_id (:id card) :slug "insert" :requires_pk false}
+                                                                  {:card_id (:id card) :slug "update" :requires_pk true}
+                                                                  {:card_id (:id card) :slug "delete" :requires_pk true}]))
                                   (assoc accum (into ["scaffold-target-id"] scaffold-target) (:id card))))
                               {}
                               cards)]
diff --git a/test/metabase/api/app_test.clj b/test/metabase/api/app_test.clj
index 10b3db9d3c9..6fc2f373e7b 100644
--- a/test/metabase/api/app_test.clj
+++ b/test/metabase/api/app_test.clj
@@ -2,7 +2,12 @@
   (:require
     [clojure.test :refer [deftest is testing]]
     [medley.core :as m]
-    [metabase.models :refer [App Card Collection Dashboard Permissions]]
+    [metabase.models :refer [App
+                             Card
+                             Collection
+                             Dashboard
+                             ModelAction
+                             Permissions]]
     [metabase.models.collection.graph :as graph]
     [metabase.models.permissions :as perms]
     [metabase.models.permissions-group :as perms-group]
@@ -150,9 +155,9 @@
     (testing "Golden path"
       (mt/with-temporary-setting-values [all-users-app-permission :read]
         (let [app (mt/user-http-request
-                   :crowberto :post 200 "app/scaffold"
-                   {:table-ids [(data/id :venues)]
-                    :app-name "My test app"})
+                    :crowberto :post 200 "app/scaffold"
+                    {:table-ids [(data/id :venues)]
+                     :app-name "My test app"})
               pages (m/index-by :name (hydrate (db/select Dashboard :collection_id (:collection_id app)) :ordered_cards))
               list-page (get pages "Venues List")
               detail-page (get pages "Venues Detail")]
@@ -166,6 +171,18 @@
                                                                     :targetId (:id detail-page)}}}
                                          {}]}
                         list-page))
+          (testing "Implicit actions are created"
+            (is (partial=
+                  [{:slug "insert"}
+                   {:slug "update"}
+                   {:slug "delete"}]
+                  (db/select ModelAction {:where [:= :model_action.card_id
+                                                  {:select [:id]
+                                                   :from [Card]
+                                                   :where [:and
+                                                           [:= :collection_id (:collection_id app)]
+                                                           [:= :dataset true]]}]
+                                          :order-by [:id]}))))
           (is (partial= {:groups {(:id (perms-group/all-users)) {(:collection_id app) :read}}}
                         (graph/graph))
               "''All Users'' should have the default permission on the app collection"))))
-- 
GitLab