7be470f5f5279dca7f3ebeed7399eca38c567670
[akkoma] / lib / pleroma / digest_email_worker.ex
1 defmodule Pleroma.DigestEmailWorker do
2 import Ecto.Query
3 require Logger
4
5 # alias Pleroma.User
6
7 def run do
8 Logger.warn("Running digester")
9 config = Application.get_env(:pleroma, :email_notifications)[:digest]
10 negative_interval = -Map.fetch!(config, :interval)
11 inactivity_threshold = Map.fetch!(config, :inactivity_threshold)
12 inactive_users_query = Pleroma.User.list_inactive_users_query(inactivity_threshold)
13
14 now = NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
15
16 from(u in inactive_users_query,
17 where: fragment(~s(? #> '{"email_notifications","digest"}' @> 'true'), u.info),
18 where: u.last_digest_emailed_at < datetime_add(^now, ^negative_interval, "day"),
19 select: u
20 )
21 |> Pleroma.Repo.all()
22 |> run(:pre)
23 end
24
25 defp run(v, :pre) do
26 Logger.warn("Running for #{length(v)} users")
27 run(v)
28 end
29
30 defp run([]), do: :ok
31
32 defp run([user | users]) do
33 with %Swoosh.Email{} = email <- Pleroma.Emails.UserEmail.digest_email(user) do
34 Logger.warn("Sending to #{user.nickname}")
35 Pleroma.Emails.Mailer.deliver_async(email)
36 else
37 _ ->
38 Logger.warn("Skipping #{user.nickname}")
39 end
40
41 Pleroma.User.touch_last_digest_emailed_at(user)
42
43 run(users)
44 end
45 end