This namespace is responsible for subscribing to events which should update the recent views for a user. | (ns metabase.activity-feed.events.recent-views (:require [metabase.activity-feed.models.recent-views :as recent-views] [metabase.api.common :as api] [metabase.events :as events] [metabase.util :as u] [metabase.util.log :as log] [methodical.core :as m] [steffan-westcott.clj-otel.api.trace.span :as span])) |
(derive ::dashboard-read :metabase/event) (derive :event/dashboard-read ::dashboard-read) | |
(m/defmethod events/publish-event! ::dashboard-read "Handle processing for a single event notification which should update the recent views for a user." [topic {:keys [object-id user-id] :as _event}] (try (let [model-id object-id user-id (or user-id api/*current-user-id*)] (recent-views/update-users-recent-views! user-id :model/Dashboard model-id :view)) (catch Throwable e (log/warnf e "Failed to process recent_views event: %s" topic)))) | |
(derive ::table-read :metabase/event) (derive :event/table-read ::table-read) | |
(m/defmethod events/publish-event! ::table-read "Handle processing for a single table read event." [topic {:keys [object user-id] :as _event}] (span/with-span! {:name (str "recent-views-" (name topic)) :topic topic :user-id user-id} (try (when object (let [model-id (u/id object) user-id (or user-id api/*current-user-id*)] (recent-views/update-users-recent-views! user-id :model/Table model-id :view))) (catch Throwable e (log/warnf e "Failed to process recent_views event: %s" topic))))) | |
(derive ::card-query-event :metabase/event) (derive :event/card-query ::card-query-event) | |
(m/defmethod events/publish-event! ::card-query-event "Handle processing for a single card query event." [topic {:keys [card-id user-id context] :as _event}] (try (let [user-id (or user-id api/*current-user-id*)] ;; we don't want to count pinned card views (when-not (#{:collection :dashboard} context) (recent-views/update-users-recent-views! user-id :model/Card card-id :view))) (catch Throwable e (log/warnf e "Failed to process recent_views event: %s" topic)))) | |
(derive ::legacy-card-event :metabase/event) | |
in practice, updating or creating a card will immediately trigger a card-read | (derive :event/card-read ::legacy-card-event) |
(m/defmethod events/publish-event! ::legacy-card-event "Handle recent-view processing for card reads" [topic {:keys [object-id user-id context]}] ;; Cards can be read indirectly, either through a pinned collection, or in a dashboard. ;; We only want to count direct views of cards, so we skip processing for indirect views here: (when (= context :question) (try (recent-views/update-users-recent-views! (or user-id api/*current-user-id*) :model/Card object-id :view) (catch Throwable e (log/warnf e "Failed to process recent_views event: %s" topic))))) | |
(derive ::collection-touch-event :metabase/event) (derive :event/collection-touch ::collection-touch-event) | |
(m/defmethod events/publish-event! ::collection-touch-event "Handle processing for a single collection touch event." [topic {:keys [collection-id user-id] :as _event}] (try (recent-views/update-users-recent-views! (or user-id api/*current-user-id*) :model/Collection collection-id :view) (catch Throwable e (log/warnf e "Failed to process recent_views event: %s" topic)))) | |