lib/mix/tasks/create_admin.ex

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