From 263800c10c573df866626380986edf895a0313de Mon Sep 17 00:00:00 2001
From: John Swanson <john.swanson@metabase.com>
Date: Fri, 10 Nov 2023 08:48:26 -0800
Subject: [PATCH] Skip `:event/{card,dashboard}-update` on pin/unpin (#35066)

When a card or dashboard is pinned, the entity itself is not changing, so let's not send the `:event/card-update` or
`:event/dashboard-update` events in these cases.
---
 src/metabase/api/card.clj      | 5 ++++-
 src/metabase/api/dashboard.clj | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/metabase/api/card.clj b/src/metabase/api/card.clj
index f08c958f891..f2321d912a0 100644
--- a/src/metabase/api/card.clj
+++ b/src/metabase/api/card.clj
@@ -757,7 +757,10 @@ saved later when it is ready."
 
   (let [card (t2/select-one Card :id id)]
     (delete-alerts-if-needed! card-before-update card)
-    (events/publish-event! :event/card-update {:object card :user-id api/*current-user-id*})
+    ;; skip publishing the event if it's just a change in its collection position
+    (when-not (= #{:collection_position}
+                 (set (keys card-updates)))
+      (events/publish-event! :event/card-update {:object card :user-id api/*current-user-id*}))
     ;; include same information returned by GET /api/card/:id since frontend replaces the Card it currently
     ;; has with returned one -- See #4142
     (-> card
diff --git a/src/metabase/api/dashboard.clj b/src/metabase/api/dashboard.clj
index 21d4c6928c2..33ad8abb906 100644
--- a/src/metabase/api/dashboard.clj
+++ b/src/metabase/api/dashboard.clj
@@ -607,7 +607,10 @@
                       (select-keys dashcards-changes-stats [:created-dashcards :deleted-dashcards]))))))
        true))
     (let [dashboard (t2/select-one :model/Dashboard id)]
-      (events/publish-event! :event/dashboard-update {:object dashboard :user-id api/*current-user-id*})
+      ;; skip publishing the event if it's just a change in its collection position
+      (when-not (= #{:collection_position}
+                   (set (keys dash-updates)))
+        (events/publish-event! :event/dashboard-update {:object dashboard :user-id api/*current-user-id*}))
       (track-dashcard-and-tab-events! dashboard @changes-stats)
       (-> (t2/hydrate dashboard [:collection :is_personal] [:dashcards :series] :tabs)
           (assoc :last-edit-info (last-edit/edit-information-for-user @api/*current-user*))))))
-- 
GitLab