| defmodule PlausibleWeb.FirstLaunchPlug do | |
| @moduledoc """ | |
| Redirects first-launch users to registration page. | |
| """ | |
| defmodule Test do | |
| @moduledoc """ | |
| Test helper for setup blocks allowing to skip the plug processing | |
| """ | |
| @spec skip(map()) :: {:ok, map()} | |
| def skip(context) do | |
| conn = Plug.Conn.put_private(context.conn, PlausibleWeb.FirstLaunchPlug, :skip) | |
| {:ok, Map.put(context, :conn, conn)} | |
| end | |
| end | |
| @behaviour Plug | |
| alias Plausible.Release | |
| @impl true | |
| def init(opts) do | |
| _path = Keyword.fetch!(opts, :redirect_to) | |
| end | |
| @impl true | |
| def call(%Plug.Conn{private: %{__MODULE__ => :skip}} = conn, _), do: conn | |
| def call(%Plug.Conn{request_path: path} = conn, path), do: conn | |
| def call(conn, redirect_to) do | |
| if Release.should_be_first_launch?() do | |
| conn | |
| |> Phoenix.Controller.redirect(to: redirect_to) | |
| |> Plug.Conn.halt() | |
| else | |
| conn | |
| end | |
| end | |
| end | |