File size: 3,138 Bytes
c27e67a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
defmodule Plausible.Workers.SendSiteSetupEmails do
  @moduledoc """
  Job sending site setup emails.
  """

  use Plausible.Repo
  use Oban.Worker, queue: :site_setup_emails

  @impl Oban.Worker
  def perform(_job) do
    send_create_site_emails()
    send_setup_help_emails()
    send_setup_success_emails()

    :ok
  end

  defp send_create_site_emails() do
    q =
      from u in Plausible.Auth.User,
        as: :user,
        where:
          not exists(
            from tm in Plausible.Teams.Membership,
              where: tm.user_id == parent_as(:user).id,
              select: true
          ),
        where:
          not exists(
            from se in "create_site_emails",
              where: se.user_id == parent_as(:user).id,
              select: true
          ),
        where:
          u.inserted_at > fragment("(now() at time zone 'utc') - '72 hours'::interval") and
            u.inserted_at < fragment("(now() at time zone 'utc') - '48 hours'::interval")

    for user <- Repo.all(q) do
      send_create_site_email(user)
    end
  end

  defp send_setup_help_emails() do
    q =
      from(s in Plausible.Site.regular(),
        left_join: se in "setup_help_emails",
        on: se.site_id == s.id,
        where: is_nil(se.id),
        where: s.inserted_at > fragment("(now() at time zone 'utc') - '72 hours'::interval"),
        preload: [:owners, :team]
      )

    for site <- Repo.all(q) do
      owners = site.owners
      setup_completed = Plausible.Sites.has_stats?(site)
      hours_passed = NaiveDateTime.diff(DateTime.utc_now(), site.inserted_at, :hour)

      if !setup_completed && hours_passed > 47 do
        send_setup_help_email(owners, site)
      end
    end
  end

  defp send_setup_success_emails() do
    q =
      from(s in Plausible.Site.regular(),
        left_join: se in "setup_success_emails",
        on: se.site_id == s.id,
        where: is_nil(se.id),
        inner_join: t in assoc(s, :team),
        where: s.inserted_at > fragment("(now() at time zone 'utc') - '72 hours'::interval"),
        preload: [:owners, team: t]
      )

    for site <- Repo.all(q) do
      if Plausible.Sites.has_stats?(site) do
        send_setup_success_email(site)
      end
    end
  end

  defp send_create_site_email(user) do
    PlausibleWeb.Email.create_site_email(user)
    |> Plausible.Mailer.send()

    Repo.insert_all("create_site_emails", [
      %{
        user_id: user.id,
        timestamp: NaiveDateTime.utc_now()
      }
    ])
  end

  defp send_setup_success_email(site) do
    for owner <- site.owners do
      PlausibleWeb.Email.site_setup_success(owner, site)
      |> Plausible.Mailer.send()
    end

    Repo.insert_all("setup_success_emails", [
      %{
        site_id: site.id,
        timestamp: NaiveDateTime.utc_now()
      }
    ])
  end

  defp send_setup_help_email(users, site) do
    for user <- users do
      PlausibleWeb.Email.site_setup_help(user, site.team, site)
      |> Plausible.Mailer.send()
    end

    Repo.insert_all("setup_help_emails", [
      %{
        site_id: site.id,
        timestamp: NaiveDateTime.utc_now()
      }
    ])
  end
end