defmodule Mix.Tasks.Legendary.CreateAdmin do @moduledoc """ Mix task to create an admin user from the command line. """ use Mix.Task alias Legendary.Auth.User alias Legendary.Core.Repo alias Ecto.Changeset @shortdoc "Create an admin user." def run(args) do Application.ensure_all_started(:core) {switches, _, _} = OptionParser.parse(args, strict: [email: :string, password: :string]) email = Keyword.get_lazy(switches, :email, fn -> ExPrompt.string_required("Email: ") end) password = Keyword.get_lazy(switches, :password, fn -> ExPrompt.password("Password: ") end) params = %{ email: email, password: password, roles: ["admin"], } %User{} |> User.changeset(params) |> maybe_confirm_email() |> Repo.insert!() end defp maybe_confirm_email(changeset) do field_list = User.__schema__(:fields) case Enum.any?(field_list, &(&1 == :email_confirmed_at)) do true -> changeset |> Changeset.cast(%{email_confirmed_at: DateTime.utc_now()}, [:email_confirmed_at]) false -> changeset end end end