add username field, make it main log-in method
This commit is contained in:
@@ -10,36 +10,36 @@ defmodule PokemonCouture.Accounts do
|
||||
## Database getters
|
||||
|
||||
@doc """
|
||||
Gets a user by email.
|
||||
Gets a user by username.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_user_by_email("foo@example.com")
|
||||
iex> get_user_by_username("foo@example.com")
|
||||
%User{}
|
||||
|
||||
iex> get_user_by_email("unknown@example.com")
|
||||
iex> get_user_by_username("unknown@example.com")
|
||||
nil
|
||||
|
||||
"""
|
||||
def get_user_by_email(email) when is_binary(email) do
|
||||
Repo.get_by(User, email: email)
|
||||
def get_user_by_username(username) when is_binary(username) do
|
||||
Repo.get_by(User, username: username)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a user by email and password.
|
||||
Gets a user by username and password.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_user_by_email_and_password("foo@example.com", "correct_password")
|
||||
iex> get_user_by_username_and_password("foo@example.com", "correct_password")
|
||||
%User{}
|
||||
|
||||
iex> get_user_by_email_and_password("foo@example.com", "invalid_password")
|
||||
iex> get_user_by_username_and_password("foo@example.com", "invalid_password")
|
||||
nil
|
||||
|
||||
"""
|
||||
def get_user_by_email_and_password(email, password)
|
||||
when is_binary(email) and is_binary(password) do
|
||||
user = Repo.get_by(User, email: email)
|
||||
def get_user_by_username_and_password(username, password)
|
||||
when is_binary(username) and is_binary(password) do
|
||||
user = Repo.get_by(User, username: username)
|
||||
if User.valid_password?(user, password), do: user
|
||||
end
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ defmodule PokemonCouture.Accounts.User do
|
||||
|
||||
@derive {Inspect, except: [:password]}
|
||||
schema "users" do
|
||||
field :username, :string
|
||||
field :email, :string
|
||||
field :password, :string, virtual: true
|
||||
field :hashed_password, :string
|
||||
@@ -32,11 +33,21 @@ defmodule PokemonCouture.Accounts.User do
|
||||
"""
|
||||
def registration_changeset(user, attrs, opts \\ []) do
|
||||
user
|
||||
|> cast(attrs, [:email, :password])
|
||||
|> validate_email()
|
||||
|> cast(attrs, [:username, :email, :password])
|
||||
|> validate_username()
|
||||
|> validate_password(opts)
|
||||
end
|
||||
|
||||
defp validate_username(changeset) do
|
||||
changeset
|
||||
|> validate_required([:username])
|
||||
|> validate_format(:username, ~r/^[^\s]+$/, message: "must have no spaces")
|
||||
|> validate_length(:username, max: 160)
|
||||
|> validate_length(:username, min: 3)
|
||||
|> unsafe_validate_unique(:username, PokemonCouture.Repo)
|
||||
|> unique_constraint(:username)
|
||||
end
|
||||
|
||||
defp validate_email(changeset) do
|
||||
changeset
|
||||
|> validate_required([:email])
|
||||
|
||||
Reference in New Issue
Block a user