# Script to make a user an admin with all permissions # Usage: mix run apps/da_product_app/priv/repo/make_admin.exs # # Example: mix run apps/da_product_app/priv/repo/make_admin.exs user@example.com import Ecto.Query, warn: false alias DaProductApp.Repo alias DaProductApp.Users.{User, Permission, UserPermission} # Get email from command line arguments or prompt email = case System.argv() do [email | _] -> email [] -> IO.puts("\n=== Make User Admin ===\n") IO.puts("Enter the email address of the user to make admin:") IO.gets("> ") |> String.trim() end # Find the user user = Repo.get_by(User, email: email) if is_nil(user) do IO.puts("\n❌ Error: User with email '#{email}' not found.") IO.puts("\nExisting users:") Repo.all(from u in User, select: {u.id, u.email, u.name, u.role}) |> Enum.each(fn {id, email, name, role} -> IO.puts(" - ID: #{id}, Email: #{email}, Name: #{name || "N/A"}, Role: #{role}") end) System.halt(1) end IO.puts("\n✓ Found user: #{user.email} (#{user.name || "No name"})") IO.puts(" Current role: #{user.role}") # Update user to superuser role IO.puts("\n➜ Updating user role to :superuser...") user |> Ecto.Changeset.change(role: :superuser) |> Repo.update!() IO.puts("✓ User role updated to :superuser") # Get all permissions all_permissions = Repo.all(Permission) IO.puts("\n➜ Granting all #{length(all_permissions)} permissions...") # Get existing user permissions existing_permission_ids = Repo.all( from up in UserPermission, where: up.user_id == ^user.id, select: up.permission_id ) |> MapSet.new() # Prepare permission grants now = DateTime.utc_now() |> DateTime.truncate(:second) new_permissions = all_permissions |> Enum.reject(fn p -> MapSet.member?(existing_permission_ids, p.id) end) |> Enum.map(fn permission -> %{ user_id: user.id, permission_id: permission.id, inserted_at: now, updated_at: now } end) # Insert new permissions if length(new_permissions) > 0 do {inserted_count, _} = Repo.insert_all(UserPermission, new_permissions) IO.puts("✓ Granted #{inserted_count} new permissions") else IO.puts("✓ User already has all permissions") end # Display summary total_permissions = Repo.all( from up in UserPermission, where: up.user_id == ^user.id, select: count(up.id) ) |> List.first() IO.puts("\n" <> String.duplicate("=", 60)) IO.puts("✓ SUCCESS: User is now an admin") IO.puts(String.duplicate("=", 60)) IO.puts("\nUser Details:") IO.puts(" Email: #{user.email}") IO.puts(" Name: #{user.name || "N/A"}") IO.puts(" Role: superuser") IO.puts(" Total Permissions: #{total_permissions}/#{length(all_permissions)}") IO.puts("\nYou can now login with this user to manage other users and permissions.") IO.puts("")