diff --git a/lib/real_estate/accounts.ex b/lib/real_estate/accounts.ex index 6c5e3f8..b7d3a59 100644 --- a/lib/real_estate/accounts.ex +++ b/lib/real_estate/accounts.ex @@ -79,6 +79,24 @@ defmodule RealEstate.Accounts do |> Repo.insert() end + @doc """ + Registers an admin. + + ## Examples + + iex> register_admin(%{field: value}) + {:ok, %User{}} + + iex> register_admin(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def register_admin(attrs) do + %User{} + |> User.admin_registration_changeset(attrs) + |> Repo.insert() + end + @doc """ Returns an `%Ecto.Changeset{}` for tracking user changes. diff --git a/lib/real_estate/accounts/user.ex b/lib/real_estate/accounts/user.ex index d53a15a..2a4e286 100644 --- a/lib/real_estate/accounts/user.ex +++ b/lib/real_estate/accounts/user.ex @@ -34,6 +34,15 @@ defmodule RealEstate.Accounts.User do |> validate_password() end + @doc """ + A user changeset for registering admins. + """ + def admin_registration_changeset(user, attrs) do + user + |> registration_changeset(attrs) + |> prepare_changes(&set_admin_role/1) + end + defp validate_email(changeset) do changeset |> validate_required([:email]) @@ -61,6 +70,11 @@ defmodule RealEstate.Accounts.User do |> delete_change(:password) end + defp set_admin_role(changeset) do + changeset + |> put_change(:role, :admin) + end + @doc """ A user changeset for changing the email. diff --git a/test/real_estate/accounts_test.exs b/test/real_estate/accounts_test.exs index 6f683a7..3c37fbc 100644 --- a/test/real_estate/accounts_test.exs +++ b/test/real_estate/accounts_test.exs @@ -83,13 +83,26 @@ defmodule RealEstate.AccountsTest do assert "has already been taken" in errors_on(changeset).email end - test "registers users with a hashed password" do + test "registers users with a hashed password and sets role to :user" do email = unique_user_email() {:ok, user} = Accounts.register_user(%{email: email, password: valid_user_password()}) assert user.email == email assert is_binary(user.hashed_password) assert is_nil(user.confirmed_at) assert is_nil(user.password) + assert user.role == :user + end + end + + describe "register_admin/1" do + test "registers users with a hashed password and sets role to :admin" do + email = unique_user_email() + {:ok, user} = Accounts.register_admin(%{email: email, password: valid_user_password()}) + assert user.email == email + assert is_binary(user.hashed_password) + assert is_nil(user.confirmed_at) + assert is_nil(user.password) + assert user.role == :admin end end