From 9349af64a0cdb72f49e40c70e99fc4cd68bdc4ff Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Fri, 28 Sep 2018 14:44:41 -0400 Subject: [PATCH] We are treating name as more like a username Therefore it should be a unique way of identifying a user. --- lib/chess/store/user.ex | 24 ++++++++++++------- ...8184135_add_unique_index_to_users_name.exs | 7 ++++++ test/chess/store/user_test.exs | 11 ++++++++- 3 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 priv/repo/migrations/20180928184135_add_unique_index_to_users_name.exs diff --git a/lib/chess/store/user.ex b/lib/chess/store/user.ex index 14bd573..1eb92c8 100644 --- a/lib/chess/store/user.ex +++ b/lib/chess/store/user.ex @@ -20,20 +20,23 @@ defmodule Chess.Store.User do timestamps() end + @profile_attrs ~w[name email]a + @registration_attrs ~w[name email password]a + @doc false def changeset(struct, params \\ %{}) do struct - |> cast(params, registration_attrs()) - |> validate_required(registration_attrs()) - |> unique_constraint(:email) + |> cast(params, @registration_attrs) + |> validate_required(@registration_attrs) + |> unique_validations() |> hash_password() end def profile_changeset(struct, params \\ %{}) do struct - |> cast(params, profile_attrs()) - |> validate_required(profile_attrs()) - |> unique_constraint(:email) + |> cast(params, @profile_attrs) + |> validate_required(@profile_attrs) + |> unique_validations() end def password_changeset(struct, params \\ %{}) do @@ -43,6 +46,12 @@ defmodule Chess.Store.User do |> hash_password() end + def unique_validations(struct, params \\ %{}) do + struct + |> unique_constraint(:name) + |> unique_constraint(:email) + end + def opponents(user) do from user in "users", where: user.id != ^user.id, @@ -58,7 +67,4 @@ defmodule Chess.Store.User do changeset end end - - defp registration_attrs, do: ~w[name email password]a - defp profile_attrs, do: ~w{name email}a end diff --git a/priv/repo/migrations/20180928184135_add_unique_index_to_users_name.exs b/priv/repo/migrations/20180928184135_add_unique_index_to_users_name.exs new file mode 100644 index 0000000..9978f17 --- /dev/null +++ b/priv/repo/migrations/20180928184135_add_unique_index_to_users_name.exs @@ -0,0 +1,7 @@ +defmodule Chess.Repo.Migrations.AddUniqueIndexToUsersName do + use Ecto.Migration + + def change do + create unique_index(:users, [:name]) + end +end diff --git a/test/chess/store/user_test.exs b/test/chess/store/user_test.exs index e59da2c..05dbb8a 100644 --- a/test/chess/store/user_test.exs +++ b/test/chess/store/user_test.exs @@ -25,7 +25,16 @@ defmodule Chess.Store.UserTest do end test "email must be unique" do - insert(:user, %{email: "zelda@hyrule.com"}) + insert(:user, %{name: "Princess", email: "zelda@hyrule.com"}) + + changeset = User.changeset(%User{}, @valid_attrs) + {:error, changeset} = Repo.insert(changeset) + + refute changeset.valid? + end + + test "name must be unique" do + insert(:user, %{name: "Zelda", email: "princess@hyrule.kingdom"}) changeset = User.changeset(%User{}, @valid_attrs) {:error, changeset} = Repo.insert(changeset)