diff --git a/lib/plausible/site/email_settings.ex b/lib/plausible/site/email_settings.ex new file mode 100644 index 000000000..cbbeab73a --- /dev/null +++ b/lib/plausible/site/email_settings.ex @@ -0,0 +1,17 @@ +defmodule Plausible.Site.EmailSettings do + use Ecto.Schema + import Ecto.Changeset + + schema "email_settings" do + belongs_to :site, Plausible.Site + + timestamps() + end + + def changeset(settings, attrs \\ %{}) do + settings + |> cast(attrs, [:site_id]) + |> validate_required([:site_id]) + |> unique_constraint(:site) + end +end diff --git a/lib/plausible_web/controllers/site_controller.ex b/lib/plausible_web/controllers/site_controller.ex index fb9a1cedb..24569e050 100644 --- a/lib/plausible_web/controllers/site_controller.ex +++ b/lib/plausible_web/controllers/site_controller.ex @@ -40,10 +40,17 @@ defmodule PlausibleWeb.SiteController do !google_site["error"] end + weekly_report_enabled = Repo.exists?(from es in "email_settings", where: es.site_id == ^site.id) + changeset = Plausible.Site.changeset(site, %{}) conn |> assign(:skip_plausible_tracking, true) - |> render("settings.html", site: site, google_search_console_verified: google_search_console_verified, changeset: changeset) + |> render("settings.html", + site: site, + weekly_report_enabled: weekly_report_enabled, + google_search_console_verified: google_search_console_verified, + changeset: changeset + ) end def update_settings(conn, %{"website" => website, "site" => site_params}) do @@ -99,6 +106,26 @@ defmodule PlausibleWeb.SiteController do |> redirect(to: "/" <> site.domain <> "/settings") end + def enable_email_report(conn, %{"website" => website}) do + site = Sites.get_for_user!(conn.assigns[:current_user].id, website) + + Plausible.Site.EmailSettings.changeset(%Plausible.Site.EmailSettings{}, %{site_id: site.id}) + |> Repo.insert! + + conn + |> put_flash(:success, "Success! You will receive an email report every Monday going forward") + |> redirect(to: "/" <> site.domain <> "/settings") + end + + def disable_email_report(conn, %{"website" => website}) do + site = Sites.get_for_user!(conn.assigns[:current_user].id, website) + Repo.delete_all(from es in Plausible.Site.EmailSettings, where: es.site_id == ^site.id) + + conn + |> put_flash(:success, "Success! You will not receive weekly email reports going forward") + |> redirect(to: "/" <> site.domain <> "/settings") + end + defp insert_site(user_id, params) do site_changeset = Plausible.Site.changeset(%Plausible.Site{}, params) diff --git a/lib/plausible_web/router.ex b/lib/plausible_web/router.ex index 61dc2edfb..d23159f1f 100644 --- a/lib/plausible_web/router.ex +++ b/lib/plausible_web/router.ex @@ -85,6 +85,8 @@ defmodule PlausibleWeb.Router do post "/sites", SiteController, :create_site post "/sites/:website/make-public", SiteController, :make_public post "/sites/:website/make-private", SiteController, :make_private + post "/sites/:website/email-report/enable", SiteController, :enable_email_report + post "/sites/:website/email-report/disable", SiteController, :disable_email_report get "/:website/snippet", SiteController, :add_snippet get "/:website/settings", SiteController, :settings put "/:website/settings", SiteController, :update_settings diff --git a/lib/plausible_web/templates/site/settings.html.eex b/lib/plausible_web/templates/site/settings.html.eex index 2db8a33fc..9456c31a4 100644 --- a/lib/plausible_web/templates/site/settings.html.eex +++ b/lib/plausible_web/templates/site/settings.html.eex @@ -94,6 +94,31 @@ <% end %> +
+
+

Email reports

+
+ +
+ +
+ <%= if @weekly_report_enabled do %> + <%= button(to: "/sites/#{@site.domain}/email-report/disable", method: :post, class: "border rounded-full border-grey flex items-center cursor-pointer w-8 bg-green justify-end") do %> + + <% end %> + Receive a weekly email report every Monday + <% else %> + <%= button(to: "/sites/#{@site.domain}/email-report/enable", method: :post, class: "border rounded-full border-grey flex items-center cursor-pointer w-8 justify-start") do %> + + <% end %> + Receive a weekly email report every Monday + <% end %> +
+
+ Configured email: <%= @conn.assigns[:current_user].email %> +
+
+ <%= form_for @conn, "/", [class: "bg-white max-w-md mx-auto shadow-md rounded rounded-t-none border-t-2 border-indigo-lightest px-8 pt-6 pb-8 mb-4 mt-16"], fn f -> %>

Javascript snippet

diff --git a/priv/repo/migrations/20190907134114_add_unique_index_to_email_settings.exs b/priv/repo/migrations/20190907134114_add_unique_index_to_email_settings.exs new file mode 100644 index 000000000..f597def79 --- /dev/null +++ b/priv/repo/migrations/20190907134114_add_unique_index_to_email_settings.exs @@ -0,0 +1,7 @@ +defmodule Plausible.Repo.Migrations.AddUniqueIndexToEmailSettings do + use Ecto.Migration + + def change do + create unique_index(:email_settings, :site_id) + end +end