summaryrefslogtreecommitdiff
path: root/lib/mix/tasks/silmataivas.user.new.ex
blob: fe10c7f63205d021eebcc259823094d557740343 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
defmodule Mix.Tasks.Silmataivas.User.New do
  use Mix.Task

  @shortdoc "Creates a new user and prints its API token."

  @moduledoc """
  Creates a new user.

      mix silmataivas.user.new
      mix silmataivas.user.new <user_id>
      mix silmataivas.user.new <user_id> <role>

  This task starts the application and creates a user using the Silmataivas.Users context.

  ## Options
    * `<user_id>` - An optional user ID to use. If not provided, a UUID will be generated.
    * `<role>` - An optional role, must be either "user" or "admin". Defaults to "user".
  """

  def run(args) do
    Mix.Task.run("app.start", [])

    {user_id, role} =
      case args do
        [provided_id, provided_role | _] -> {provided_id, provided_role}
        [provided_id | _] -> {provided_id, "user"}
        [] -> {Ecto.UUID.generate(), "user"}
      end

    # Validate role
    unless role in ["user", "admin"] do
      Mix.raise("Invalid role: #{role}. Role must be either \"user\" or \"admin\".")
    end

    user_params = %{user_id: user_id, role: role}

    case Silmataivas.Users.create_user(user_params) do
      {:ok, user} ->
        IO.puts("\n✅ User created successfully!")
        IO.puts("   User ID (API token): #{user.user_id}")
        IO.puts("   Role: #{user.role}")

      {:error, changeset} ->
        IO.puts("\n❌ Failed to create user:")
        IO.inspect(changeset.errors)
    end
  end
end