defmodule Mix.Tasks.ExOauth2Provider.Install do
@shortdoc "Installs ExOauth2Provider"
@moduledoc """
Generates migrations, schema module files, and updates config.
mix ex_oauth2_provider.install
mix ex_oauth2_provider.install --no-schemas
## Arguments
* `--context-app` - context app to use for path and module names
* `--no-migration` - don't create migration file
* `--no-schemas` - don't create schema module files
"""
use Mix.Task
alias ExOauth2Provider.Config, as: ProviderConfig
alias Mix.{Ecto, ExOauth2Provider, ExOauth2Provider.Config}
alias Mix.Tasks.ExOauth2Provider.Gen.{Migration, Schemas}
@switches [context_app: :string, migration: :boolean, schemas: :boolean]
@default_opts [migration: true, schemas: true]
@mix_task "ex_oauth2_provider.install"
@impl true
def run(args) do
ExOauth2Provider.no_umbrella!(@mix_task)
args
|> ExOauth2Provider.parse_options(@switches, @default_opts)
|> parse()
|> run_migration(args)
|> run_schemas(args)
|> print_config_instructions(args)
end
defp parse({config, _parsed, _invalid}), do: config
defp run_migration(%{migration: true} = config, args) do
Migration.run(args)
config
end
defp run_migration(config, _args), do: config
defp run_schemas(%{schemas: true} = config, args) do
Schemas.run(args)
config
end
defp run_schemas(config, _args), do: config
defp print_config_instructions(config, args) do
[repo | _repos] = Ecto.parse_repo(args)
context_app = Map.get(config, :context_app) || ExOauth2Provider.otp_app()
resource_owner = resource_owner(ProviderConfig.app_base(context_app))
content = Config.gen(context_app, repo: inspect(repo), resource_owner: resource_owner)
Mix.shell.info(
"""
ExOauth2Provider has been installed! Please append the following to `config/config.ex`:
#{content}
""")
config
end
defp resource_owner(base), do: inspect Module.concat([base, "Users", "User"])
end