From 29cb7462e64bf91cf2288dd5e71233fa2efce896 Mon Sep 17 00:00:00 2001
From: Uku Taht <uku.taht@gmail.com>
Date: Fri, 29 Oct 2021 10:18:29 +0200
Subject: [PATCH] Add grace period to upgrade

---
 lib/plausible/auth/user.ex                               | 5 +++++
 lib/plausible_web/templates/email/over_limit.html.eex    | 6 ++----
 lib/workers/check_usage.ex                               | 1 +
 priv/repo/migrations/20211028122202_grace_period_end.exs | 9 +++++++++
 test/workers/check_usage_test.exs                        | 4 ++++
 5 files changed, 21 insertions(+), 4 deletions(-)
 create mode 100644 priv/repo/migrations/20211028122202_grace_period_end.exs

diff --git a/lib/plausible/auth/user.ex b/lib/plausible/auth/user.ex
index 5c0fe34c..bfb3eafd 100644
--- a/lib/plausible/auth/user.ex
+++ b/lib/plausible/auth/user.ex
@@ -17,6 +17,7 @@ defmodule Plausible.Auth.User do
     field :name, :string
     field :last_seen, :naive_datetime
     field :trial_expiry_date, :date
+    field :grace_period_end, :date
     field :theme, :string
     field :email_verified, :boolean
 
@@ -79,6 +80,10 @@ defmodule Plausible.Auth.User do
     change(user, trial_expiry_date: Timex.today() |> Timex.shift(days: -1))
   end
 
+  def start_grace_period(user) do
+    change(user, grace_period_end: Timex.today() |> Timex.shift(days: 7))
+  end
+
   defp trial_expiry() do
     if Application.get_env(:plausible, :is_selfhost) do
       Timex.today() |> Timex.shift(years: 100)
diff --git a/lib/plausible_web/templates/email/over_limit.html.eex b/lib/plausible_web/templates/email/over_limit.html.eex
index 4fa5ba50..a05db28a 100644
--- a/lib/plausible_web/templates/email/over_limit.html.eex
+++ b/lib/plausible_web/templates/email/over_limit.html.eex
@@ -2,9 +2,9 @@ Hey <%= user_salutation(@user) %>,
 <br /><br />
 Thanks for being a Plausible Analytics subscriber!
 <br /><br />
-This is a friendly reminder that your traffic has exceeded your subscription tier two months in a row. Congrats on all that traffic!
+This is a notice that your traffic has exceeded your subscription tier two months in a row. Congrats on all that traffic!
 <br /><br />
-We don't enforce any hard limits at the moment, we're still counting your stats and you have access to your dashboard, but we kindly ask you to upgrade your subscription plan to accommodate your new traffic levels.
+In order to keep your stats running, we require you to upgrade your account to accommodate your new traffic levels. If you do not upgrade your account within the next 7 days, we will lock your sites and they won't be accessible.
 <br /><br />
 In the last billing cycle (<%= date_format(@last_cycle.first) %> to <%= date_format(@last_cycle.last) %>), your account has used <%= PlausibleWeb.StatsView.large_number_format(@usage) %> billable pageviews.
 <%= if @usage <= 20_000_000 do %>
@@ -17,8 +17,6 @@ You can upgrade your subscription using our self-serve platform. The new charge
 This is more than our standard plans, so please reply back to this email to get a quote for your volume.
 <% end %>
 <br /><br />
-Were the last two months extraordinary and you don't expect these higher traffic levels to continue? Reply to this email and we'll figure it out.
-<br /><br />
 Have questions or need help with anything? Just reply to this email and we'll gladly help.
 <br /><br />
 Thanks again for using our product and for your support!
diff --git a/lib/workers/check_usage.ex b/lib/workers/check_usage.ex
index 6de1d802..41abcb2b 100644
--- a/lib/workers/check_usage.ex
+++ b/lib/workers/check_usage.ex
@@ -96,6 +96,7 @@ defmodule Plausible.Workers.CheckUsage do
           )
 
         Plausible.Mailer.send_email_safe(template)
+        Plausible.Auth.User.start_grace_period(subscriber) |> Repo.update()
 
       _ ->
         nil
diff --git a/priv/repo/migrations/20211028122202_grace_period_end.exs b/priv/repo/migrations/20211028122202_grace_period_end.exs
new file mode 100644
index 00000000..c0b6a64c
--- /dev/null
+++ b/priv/repo/migrations/20211028122202_grace_period_end.exs
@@ -0,0 +1,9 @@
+defmodule Plausible.Repo.Migrations.GracePeriodEnd do
+  use Ecto.Migration
+
+  def change do
+    alter table(:users) do
+      add :grace_period_end, :date
+    end
+  end
+end
diff --git a/test/workers/check_usage_test.exs b/test/workers/check_usage_test.exs
index 833593da..fa92f466 100644
--- a/test/workers/check_usage_test.exs
+++ b/test/workers/check_usage_test.exs
@@ -24,6 +24,7 @@ defmodule Plausible.Workers.CheckUsageTest do
     CheckUsage.perform(nil)
 
     assert_no_emails_delivered()
+    assert Repo.reload(user).grace_period_end == nil
   end
 
   test "does not send an email if account has been over the limit for one billing month", %{
@@ -45,6 +46,7 @@ defmodule Plausible.Workers.CheckUsageTest do
     CheckUsage.perform(nil, billing_stub)
 
     assert_no_emails_delivered()
+    assert Repo.reload(user).grace_period_end == nil
   end
 
   test "sends an email when an account is over their limit for two consecutive billing months", %{
@@ -69,6 +71,8 @@ defmodule Plausible.Workers.CheckUsageTest do
       to: [user],
       subject: "You have outgrown your Plausible subscription tier"
     )
+
+    assert Repo.reload(user).grace_period_end == Timex.shift(Timex.today(), days: 7)
   end
 
   describe "enterprise customers" do
-- 
GitLab