analytics/lib/workers/send_trial_notifications.ex
Uku Taht e71de6dc1f
Invitations (#1122)
* Invite existing user to a site

* Add invitation flow for non-existing users

* Accept and reject invitations

* Use invitation flow for existing users

* Locking mechanism for sites

* Authorization for site settings

* Show usage based on site ownership

* Add ability to remove members from a site

* Do not show settings link to viewer roles

* Ability to remove invitations

* Remove `Plausible.Sites.count_for/1`

* Fix tests

* Do not show the trial banner after the trial

* Correct trial emails

* Transfer ownership

* Send invitation email to existing user

* Add invitation email flows

* Add plug for role-based authorization

* Rename AuthorizeStatsPlug -> AuthorizeSiteAccess

* Add email flow for ownership transfer

* Fix URLs in emails

* Fix small copy issues

* Make 'People' its own section in site settings

* Notify user via email if their access has been removed

* Check site lock status when invitation is accepted

* Check lock status when user subscribes

* Make sure only admins and owners can create shared links

* Changelog

* Add LockSites to daily cron

* Clean invitations after 48 hours

* Add notices about expiry

* Add invitation expired page

* Add doc link
2021-06-16 15:00:07 +03:00

83 lines
1.8 KiB
Elixir

defmodule Plausible.Workers.SendTrialNotifications do
use Plausible.Repo
use Oban.Worker,
queue: :trial_notification_emails,
max_attempts: 1
require Logger
@impl Oban.Worker
def perform(_job) do
users =
Repo.all(
from u in Plausible.Auth.User,
left_join: s in Plausible.Billing.Subscription,
on: s.user_id == u.id,
where: is_nil(s.id),
order_by: u.inserted_at
)
for user <- users do
case Timex.diff(user.trial_expiry_date, Timex.today(), :days) do
7 ->
if Plausible.Auth.has_active_sites?(user, [:owner]) do
send_one_week_reminder(user)
end
1 ->
if Plausible.Auth.has_active_sites?(user, [:owner]) do
send_tomorrow_reminder(user)
end
0 ->
if Plausible.Auth.has_active_sites?(user, [:owner]) do
send_today_reminder(user)
end
-1 ->
if Plausible.Auth.has_active_sites?(user, [:owner]) do
send_over_reminder(user)
end
_ ->
nil
end
end
:ok
end
defp send_one_week_reminder(user) do
PlausibleWeb.Email.trial_one_week_reminder(user)
|> send_email()
end
defp send_tomorrow_reminder(user) do
usage = Plausible.Billing.usage_breakdown(user)
PlausibleWeb.Email.trial_upgrade_email(user, "tomorrow", usage)
|> send_email()
end
defp send_today_reminder(user) do
usage = Plausible.Billing.usage_breakdown(user)
PlausibleWeb.Email.trial_upgrade_email(user, "today", usage)
|> send_email()
end
defp send_over_reminder(user) do
PlausibleWeb.Email.trial_over_email(user)
|> send_email()
end
defp send_email(email) do
try do
Plausible.Mailer.send_email(email)
rescue
_ -> nil
end
end
end