Core functionality for notifications.

(ns metabase.notification.core
  (:require
   [metabase.notification.payload.core :as notification.payload]
   [metabase.notification.seed :as notification.seed]
   [metabase.notification.send :as notification.send]
   [metabase.util :as u]
   [metabase.util.log :as log]
   [metabase.util.malli :as mu]
   [potemkin :as p]))

------------------------------------------------------------------------------------------------;; Public APIs ;; ------------------------------------------------------------------------------------------------;;

(p/import-vars
 [notification.payload
  notification-payload]
 [notification.seed
  seed-notification!])
(def ^:private Options
  [:map
   [:notification/sync? :boolean]])

The default options for sending a notification.

(def ^:dynamic *default-options*
  {:notification/sync? false})

The function to send a notification. Defaults to notification.send/send-notification-async!.

(mu/defn send-notification!
  [notification & {:keys [] :as options} :- [:maybe Options]]
  (let [options      (merge *default-options* options)
        notification (with-meta notification {:notification/triggered-at-ns (u/start-timer)})]
    (log/debugf "Sending notification: %s %s" (:id notification) (if (:notification/sync? options) "synchronously" "asynchronously"))
    (if (:notification/sync? options)
      (notification.send/send-notification-sync! notification)
      (notification.send/send-notification-async! notification))))