Skip to content
Snippets Groups Projects
Commit 0feb39ce authored by Allen Gilliland's avatar Allen Gilliland
Browse files

list for :user-login events and update the User :last-login attribute to keep it accurate.

parent bcc79073
No related branches found
No related tags found
No related merge requests found
(ns metabase.events.last-login
(:require [clojure.core.async :as async]
[clojure.tools.logging :as log]
[metabase.config :as config]
[metabase.db :as db]
[metabase.events :as events]
[metabase.models.user :refer [User]]
[metabase.util :as u]))
(def last-login-topics
"The `Set` of event topics which are subscribed to for use in last login tracking."
#{:user-login})
(def ^:private last-login-channel
"Channel for receiving event notifications we want to subscribe to for last login events."
(async/chan))
;;; ## ---------------------------------------- EVENT PROCESSING ----------------------------------------
(defn process-last-login-event
"Handle processing for a single event notification received on the last-login-channel"
[last-login-event]
;; try/catch here to prevent individual topic processing exceptions from bubbling up. better to handle them here.
(try
(when-let [{topic :topic object :item} last-login-event]
(log/info object)
;; just make a simple attempt to set the `:last_login` for the given user to now
(when-let [user-id (:user_id object)]
(db/upd User user-id :last_login (u/new-sql-timestamp))))
(catch Throwable e
(log/warn (format "Failed to process sync-database event. %s" (:topic last-login-event)) e))))
;;; ## ---------------------------------------- LIFECYLE ----------------------------------------
;; this is what actually kicks off our listener for events
(when (config/is-dev?)
(log/info "Starting last-login events listener")
(events/start-event-listener last-login-topics last-login-channel process-last-login-event))
(ns metabase.events.last-login-test
(:require [expectations :refer :all]
[metabase.db :as db]
[metabase.events.last-login :refer :all]
(metabase.models [user :refer [User]])
[metabase.test.data :refer :all]
[metabase.test.util :refer [expect-eval-actual-first with-temp random-name]]
[metabase.test-setup :refer :all]))
(defn- create-test-user []
(let [rand-name (random-name)]
(db/ins User
:email (str rand-name "@metabase.com")
:first_name rand-name
:last_name rand-name
:password rand-name)))
;; `:user-login` event
(expect-let [{user-id :id last-login :last_login} (create-test-user)]
{:orig-last-login nil
:upd-last-login false}
(do
(process-last-login-event {:topic :user-login
:item {:user_id user-id
:session_id "doesntmatter"}})
(let [user (db/sel :one User :id user-id)]
{:orig-last-login last-login
:upd-last-login (nil? (:last_login user))})))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment