summaryrefslogtreecommitdiff
path: root/lib/pleroma/workers/cron/new_users_digest_worker.ex
blob: 267fe28378b58397546f24cfa1f3cd325aa89389 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Workers.Cron.NewUsersDigestWorker do
  alias Pleroma.Activity
  alias Pleroma.Repo
  alias Pleroma.User

  import Ecto.Query

  use Pleroma.Workers.WorkerHelper, queue: "new_users_digest"

  @impl Oban.Worker
  def perform(_job) do
    if Pleroma.Config.get([Pleroma.Emails.NewUsersDigestEmail, :enabled]) do
      today = NaiveDateTime.utc_now() |> Timex.beginning_of_day()

      a_day_ago =
        today
        |> Timex.shift(days: -1)
        |> Timex.beginning_of_day()

      users_and_statuses =
        %{
          local: true,
          order_by: :inserted_at
        }
        |> User.Query.build()
        |> where([u], u.inserted_at >= ^a_day_ago and u.inserted_at < ^today)
        |> Repo.all()
        |> Enum.map(fn user ->
          latest_status =
            Activity
            |> Activity.Queries.by_actor(user.ap_id)
            |> Activity.Queries.by_type("Create")
            |> Activity.with_preloaded_object()
            |> order_by(desc: :inserted_at)
            |> limit(1)
            |> Repo.one()

          total_statuses =
            Activity
            |> Activity.Queries.by_actor(user.ap_id)
            |> Activity.Queries.by_type("Create")
            |> Repo.aggregate(:count, :id)

          {user, total_statuses, latest_status}
        end)

      if users_and_statuses != [] do
        %{is_admin: true}
        |> User.Query.build()
        |> where([u], not is_nil(u.email))
        |> Repo.all()
        |> Enum.map(&Pleroma.Emails.NewUsersDigestEmail.new_users(&1, users_and_statuses))
        |> Enum.each(&Pleroma.Emails.Mailer.deliver/1)
      end
    end

    :ok
  end
end