defmodule Mix.Tasks.Pow.Phoenix.Install do @shortdoc "Prints instructions for setting up Pow with Phoenix" @moduledoc """ Prints instructions fo setting up Pow with Phoenix. mix pow.phoenix.install -r MyApp.Repo mix pow.phoenix.install -r MyApp.Repo --context-app :my_app mix pow.phoenix.install -r MyApp.Repo --templates --extension PowResetPassword Templates are only generated when `--templates` argument is provided. See `Mix.Tasks.Pow.Phoenix.Gen.Templates` and `Mix.Tasks.Pow.Extension.Phoenix.Gen.Templates` for more. ## Arguments * `--context-app` - app to use for path and module names * `--templates` - generate templates and views * `--extension` - extensions to generate templates for """ use Mix.Task alias Pow.Config alias Mix.{Pow, Pow.Phoenix} alias Mix.Tasks.Pow.Extension.Phoenix.Gen.Templates, as: PhoenixExtensionTemplatesTask alias Mix.Tasks.Pow.Phoenix.Gen.Templates, as: PhoenixTemplatesTask @switches [context_app: :string, templates: :boolean, extension: :keep] @default_opts [templates: false] @mix_task "pow.phoenix.install" @impl true def run(args), do: run(args, Pow.schema_options_from_args()) @doc false def run(args, schema_opts) do Pow.no_umbrella!(@mix_task) Pow.ensure_phoenix!(@mix_task, args) args |> Pow.parse_options(@switches, @default_opts) |> parse_structure() |> maybe_run_gen_templates(args) |> maybe_run_extensions_gen_templates(args) |> print_shell_instructions(schema_opts) end defp parse_structure({config, _parsed, _invalid}) do Map.put(config, :structure, Phoenix.parse_structure(config)) end defp maybe_run_gen_templates(%{templates: true} = config, args) do PhoenixTemplatesTask.run(args) config end defp maybe_run_gen_templates(config, _args), do: config defp maybe_run_extensions_gen_templates(%{templates: true, extension: extensions} = config, args) when extensions != [] do PhoenixExtensionTemplatesTask.run(args) config end defp maybe_run_extensions_gen_templates(config, _args), do: config defp print_shell_instructions(%{structure: %{context_base: context_base, web_module: web_base, web_prefix: web_prefix, web_app: web_app}}, %{schema_name: schema_name}) do case config_set?(web_app) do true -> :ok false -> Mix.shell().info( """ Pow has been installed in your phoenix app! There are three files you'll need to configure first before you can use Pow. First, append this to `config/config.exs`: config #{inspect(web_app)}, :pow, user: #{inspect(context_base)}.#{schema_name}, repo: #{inspect(context_base)}.Repo Next, add `Pow.Plug.Session` plug to `#{web_prefix}/endpoint.ex` after `plug Plug.Session`: defmodule #{inspect(web_base)}.Endpoint do use Phoenix.Endpoint, otp_app: #{inspect(web_app)} # ... plug Plug.Session, @session_options plug Pow.Plug.Session, otp_app: #{inspect(web_app)} plug #{inspect(web_base)}.Router end Last, update `#{web_prefix}/router.ex` with the Pow routes: defmodule #{inspect(web_base)}.Router do use #{inspect(web_base)}, :router use Pow.Phoenix.Router # ... pipelines scope "/" do pipe_through :browser pow_routes() end # ... routes end """) end end defp config_set?(web_app) do user = Config.get([otp_app: web_app], :user) repo = Config.get([otp_app: web_app], :repo) not is_nil(user) && not is_nil(repo) end end