forked from mirrors/akkoma
moved DigestEmail to Oban Periodic jobs
This commit is contained in:
parent
c5766a8100
commit
a4f834a687
9 changed files with 71 additions and 89 deletions
|
@ -51,20 +51,6 @@ config :pleroma, Pleroma.Repo,
|
||||||
telemetry_event: [Pleroma.Repo.Instrumenter],
|
telemetry_event: [Pleroma.Repo.Instrumenter],
|
||||||
migration_lock: nil
|
migration_lock: nil
|
||||||
|
|
||||||
scheduled_jobs =
|
|
||||||
with digest_config <- Application.get_env(:pleroma, :email_notifications)[:digest],
|
|
||||||
true <- digest_config[:active] do
|
|
||||||
[{digest_config[:schedule], {Pleroma.Daemons.DigestEmailDaemon, :perform, []}}]
|
|
||||||
else
|
|
||||||
_ -> []
|
|
||||||
end
|
|
||||||
|
|
||||||
config :pleroma, Pleroma.Scheduler,
|
|
||||||
global: true,
|
|
||||||
overlap: true,
|
|
||||||
timezone: :utc,
|
|
||||||
jobs: scheduled_jobs
|
|
||||||
|
|
||||||
config :pleroma, Pleroma.Captcha,
|
config :pleroma, Pleroma.Captcha,
|
||||||
enabled: false,
|
enabled: false,
|
||||||
seconds_valid: 60,
|
seconds_valid: 60,
|
||||||
|
@ -510,7 +496,8 @@ config :pleroma, Oban,
|
||||||
{"0 0 * * *", Pleroma.Workers.Cron.ClearOauthTokenWorker},
|
{"0 0 * * *", Pleroma.Workers.Cron.ClearOauthTokenWorker},
|
||||||
{"0 * * * *", Pleroma.Workers.Cron.StatsWorker},
|
{"0 * * * *", Pleroma.Workers.Cron.StatsWorker},
|
||||||
{"* * * * *", Pleroma.Workers.Cron.ScheduledActivityWorker},
|
{"* * * * *", Pleroma.Workers.Cron.ScheduledActivityWorker},
|
||||||
{"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker}
|
{"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker},
|
||||||
|
{"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker}
|
||||||
]
|
]
|
||||||
|
|
||||||
config :pleroma, :workers,
|
config :pleroma, :workers,
|
||||||
|
@ -592,7 +579,6 @@ config :pleroma, Pleroma.ScheduledActivity,
|
||||||
config :pleroma, :email_notifications,
|
config :pleroma, :email_notifications,
|
||||||
digest: %{
|
digest: %{
|
||||||
active: false,
|
active: false,
|
||||||
schedule: "0 0 * * 0",
|
|
||||||
interval: 7,
|
interval: 7,
|
||||||
inactivity_threshold: 7
|
inactivity_threshold: 7
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,8 +68,6 @@ config :pleroma, Oban,
|
||||||
queues: false,
|
queues: false,
|
||||||
prune: :disabled
|
prune: :disabled
|
||||||
|
|
||||||
config :pleroma, Pleroma.Scheduler, jobs: []
|
|
||||||
|
|
||||||
config :pleroma, Pleroma.ScheduledActivity,
|
config :pleroma, Pleroma.ScheduledActivity,
|
||||||
daily_user_limit: 2,
|
daily_user_limit: 2,
|
||||||
total_user_limit: 3,
|
total_user_limit: 3,
|
||||||
|
|
|
@ -31,7 +31,6 @@ defmodule Pleroma.Application do
|
||||||
children =
|
children =
|
||||||
[
|
[
|
||||||
Pleroma.Repo,
|
Pleroma.Repo,
|
||||||
Pleroma.Scheduler,
|
|
||||||
Pleroma.Config.TransferTask,
|
Pleroma.Config.TransferTask,
|
||||||
Pleroma.Emoji,
|
Pleroma.Emoji,
|
||||||
Pleroma.Captcha,
|
Pleroma.Captcha,
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
# Pleroma: A lightweight social networking server
|
|
||||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
defmodule Pleroma.Daemons.DigestEmailDaemon do
|
|
||||||
alias Pleroma.Repo
|
|
||||||
alias Pleroma.Workers.DigestEmailsWorker
|
|
||||||
|
|
||||||
import Ecto.Query
|
|
||||||
|
|
||||||
def perform do
|
|
||||||
config = Pleroma.Config.get([:email_notifications, :digest])
|
|
||||||
negative_interval = -Map.fetch!(config, :interval)
|
|
||||||
inactivity_threshold = Map.fetch!(config, :inactivity_threshold)
|
|
||||||
inactive_users_query = Pleroma.User.list_inactive_users_query(inactivity_threshold)
|
|
||||||
|
|
||||||
now = NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
|
|
||||||
|
|
||||||
from(u in inactive_users_query,
|
|
||||||
where: fragment(~s(? ->'digest' @> 'true'), u.email_notifications),
|
|
||||||
where: u.last_digest_emailed_at < datetime_add(^now, ^negative_interval, "day"),
|
|
||||||
select: u
|
|
||||||
)
|
|
||||||
|> Repo.all()
|
|
||||||
|> Enum.each(fn user ->
|
|
||||||
DigestEmailsWorker.enqueue("digest_email", %{"user_id" => user.id})
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
@doc """
|
|
||||||
Send digest email to the given user.
|
|
||||||
Updates `last_digest_emailed_at` field for the user and returns the updated user.
|
|
||||||
"""
|
|
||||||
@spec perform(Pleroma.User.t()) :: Pleroma.User.t()
|
|
||||||
def perform(user) do
|
|
||||||
with %Swoosh.Email{} = email <- Pleroma.Emails.UserEmail.digest_email(user) do
|
|
||||||
Pleroma.Emails.Mailer.deliver_async(email)
|
|
||||||
end
|
|
||||||
|
|
||||||
Pleroma.User.touch_last_digest_emailed_at(user)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,7 +0,0 @@
|
||||||
# Pleroma: A lightweight social networking server
|
|
||||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
defmodule Pleroma.Scheduler do
|
|
||||||
use Quantum.Scheduler, otp_app: :pleroma
|
|
||||||
end
|
|
58
lib/pleroma/workers/cron/digest_emails_worker.ex
Normal file
58
lib/pleroma/workers/cron/digest_emails_worker.ex
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Workers.Cron.DigestEmailsWorker do
|
||||||
|
@moduledoc """
|
||||||
|
The worker to send digest emails.
|
||||||
|
"""
|
||||||
|
|
||||||
|
use Oban.Worker, queue: "digest_emails"
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
|
alias Pleroma.Emails
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
@impl Oban.Worker
|
||||||
|
def perform(_opts, _job) do
|
||||||
|
config = Config.get([:email_notifications, :digest])
|
||||||
|
|
||||||
|
if config[:active] do
|
||||||
|
negative_interval = -Map.fetch!(config, :interval)
|
||||||
|
inactivity_threshold = Map.fetch!(config, :inactivity_threshold)
|
||||||
|
inactive_users_query = User.list_inactive_users_query(inactivity_threshold)
|
||||||
|
|
||||||
|
now = NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
|
||||||
|
|
||||||
|
from(u in inactive_users_query,
|
||||||
|
where: fragment(~s(? ->'digest' @> 'true'), u.email_notifications),
|
||||||
|
where: u.last_digest_emailed_at < datetime_add(^now, ^negative_interval, "day"),
|
||||||
|
select: u
|
||||||
|
)
|
||||||
|
|> Repo.all()
|
||||||
|
|> send_emails
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_emails(users) do
|
||||||
|
Enum.each(users, &send_email/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Send digest email to the given user.
|
||||||
|
Updates `last_digest_emailed_at` field for the user and returns the updated user.
|
||||||
|
"""
|
||||||
|
@spec send_email(User.t()) :: User.t()
|
||||||
|
def send_email(user) do
|
||||||
|
with %Swoosh.Email{} = email <- Emails.UserEmail.digest_email(user) do
|
||||||
|
Emails.Mailer.deliver_async(email)
|
||||||
|
end
|
||||||
|
|
||||||
|
User.touch_last_digest_emailed_at(user)
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,16 +0,0 @@
|
||||||
# Pleroma: A lightweight social networking server
|
|
||||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
defmodule Pleroma.Workers.DigestEmailsWorker do
|
|
||||||
alias Pleroma.User
|
|
||||||
|
|
||||||
use Pleroma.Workers.WorkerHelper, queue: "digest_emails"
|
|
||||||
|
|
||||||
@impl Oban.Worker
|
|
||||||
def perform(%{"op" => "digest_email", "user_id" => user_id}, _job) do
|
|
||||||
user_id
|
|
||||||
|> User.get_cached_by_id()
|
|
||||||
|> Pleroma.Daemons.DigestEmailDaemon.perform()
|
|
||||||
end
|
|
||||||
end
|
|
1
mix.exs
1
mix.exs
|
@ -101,7 +101,6 @@ defmodule Pleroma.Mixfile do
|
||||||
{:phoenix_pubsub, "~> 1.1"},
|
{:phoenix_pubsub, "~> 1.1"},
|
||||||
{:phoenix_ecto, "~> 4.0"},
|
{:phoenix_ecto, "~> 4.0"},
|
||||||
{:ecto_sql, "~> 3.2"},
|
{:ecto_sql, "~> 3.2"},
|
||||||
{:postgrex, ">= 0.13.5"},
|
|
||||||
{:oban, "~> 0.11.1"},
|
{:oban, "~> 0.11.1"},
|
||||||
{:quantum, "~> 2.3"},
|
{:quantum, "~> 2.3"},
|
||||||
{:gettext, "~> 0.15"},
|
{:gettext, "~> 0.15"},
|
||||||
|
|
|
@ -2,16 +2,24 @@
|
||||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
defmodule Pleroma.DigestEmailDaemonTest do
|
defmodule Pleroma.Workers.Cron.DigestEmailsWorkerTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
alias Pleroma.Daemons.DigestEmailDaemon
|
|
||||||
alias Pleroma.Tests.ObanHelpers
|
alias Pleroma.Tests.ObanHelpers
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
|
clear_config([:email_notifications, :digest])
|
||||||
|
|
||||||
test "it sends digest emails" do
|
test "it sends digest emails" do
|
||||||
|
Pleroma.Config.put([:email_notifications, :digest], %{
|
||||||
|
active: true,
|
||||||
|
inactivity_threshold: 7,
|
||||||
|
interval: 7
|
||||||
|
})
|
||||||
|
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
date =
|
date =
|
||||||
|
@ -23,8 +31,7 @@ defmodule Pleroma.DigestEmailDaemonTest do
|
||||||
{:ok, _} = User.switch_email_notifications(user2, "digest", true)
|
{:ok, _} = User.switch_email_notifications(user2, "digest", true)
|
||||||
CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"})
|
CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"})
|
||||||
|
|
||||||
DigestEmailDaemon.perform()
|
Pleroma.Workers.Cron.DigestEmailsWorker.perform(:opts, :pid)
|
||||||
ObanHelpers.perform_all()
|
|
||||||
# Performing job(s) enqueued at previous step
|
# Performing job(s) enqueued at previous step
|
||||||
ObanHelpers.perform_all()
|
ObanHelpers.perform_all()
|
||||||
|
|
Loading…
Reference in a new issue