2016-11-20 20:04:52 +01:00
|
|
|
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
;;
|
2019-11-18 11:52:57 +01:00
|
|
|
;; Copyright (c) 2016-2019 Andrey Antukh <niwi@niwi.nz>
|
2016-11-20 20:04:52 +01:00
|
|
|
|
|
|
|
(ns uxbox.emails
|
|
|
|
"Main api for send emails."
|
2019-11-18 11:52:57 +01:00
|
|
|
(:require
|
|
|
|
[clojure.spec.alpha :as s]
|
|
|
|
[promesa.core :as p]
|
|
|
|
[uxbox.config :as cfg]
|
2020-01-11 20:25:50 +01:00
|
|
|
[uxbox.common.exceptions :as ex]
|
|
|
|
[uxbox.common.spec :as us]
|
2019-11-18 11:52:57 +01:00
|
|
|
[uxbox.db :as db]
|
|
|
|
[uxbox.media :as media]
|
|
|
|
[uxbox.util.emails :as emails]
|
2020-01-11 20:25:50 +01:00
|
|
|
[uxbox.util.blob :as blob]))
|
2016-11-20 20:04:52 +01:00
|
|
|
|
2019-11-26 14:17:10 +01:00
|
|
|
;; --- Defaults
|
|
|
|
|
2019-11-18 11:52:57 +01:00
|
|
|
(def default-context
|
|
|
|
{:static media/resolve-asset
|
|
|
|
:comment (constantly nil)})
|
2016-11-20 20:04:52 +01:00
|
|
|
|
2019-11-26 14:17:10 +01:00
|
|
|
;; --- Register Email
|
|
|
|
|
2019-11-26 13:34:37 +01:00
|
|
|
(s/def ::name ::us/string)
|
|
|
|
(s/def ::register
|
|
|
|
(s/keys :req-un [::name]))
|
|
|
|
|
2019-11-18 11:52:57 +01:00
|
|
|
(def register
|
|
|
|
"A new profile registration welcome email."
|
2019-11-26 13:34:37 +01:00
|
|
|
(emails/build ::register default-context))
|
2019-11-18 11:52:57 +01:00
|
|
|
|
2019-11-26 14:17:10 +01:00
|
|
|
;; --- Public API
|
|
|
|
|
2019-11-22 18:08:27 +01:00
|
|
|
(defn render
|
|
|
|
[email context]
|
|
|
|
(let [defaults {:from (:email-from cfg/config)
|
|
|
|
:reply-to (:email-reply-to cfg/config)}]
|
2019-11-25 12:34:35 +01:00
|
|
|
(email (merge defaults context))))
|
2019-11-18 11:52:57 +01:00
|
|
|
|
|
|
|
(defn send!
|
|
|
|
"Schedule the email for sending."
|
|
|
|
[email context]
|
2020-01-11 20:25:50 +01:00
|
|
|
(us/assert fn? email)
|
|
|
|
(us/assert map? context)
|
2019-11-18 11:52:57 +01:00
|
|
|
(let [defaults {:from (:email-from cfg/config)
|
|
|
|
:reply-to (:email-reply-to cfg/config)}
|
2019-11-25 12:34:35 +01:00
|
|
|
data (->> (merge defaults context)
|
|
|
|
(email)
|
2019-11-18 11:52:57 +01:00
|
|
|
(blob/encode))
|
2019-11-22 18:08:27 +01:00
|
|
|
priority (case (:priority context :high) :low 1 :high 10)
|
2019-11-18 11:52:57 +01:00
|
|
|
sql "insert into email_queue (data, priority)
|
|
|
|
values ($1, $2) returning *"]
|
|
|
|
(-> (db/query-one db/pool [sql data priority])
|
|
|
|
(p/then' (constantly nil)))))
|