/
user.ex
67 lines (53 loc) · 1.89 KB
/
user.ex
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
defmodule PhoenixGuardian.User do
use PhoenixGuardian.Web, :model
alias PhoenixGuardian.Repo
schema "users" do
field :name, :string
field :email, :string
field :encrypted_password, :string
field :password, :string, virtual: true
timestamps
end
before_insert :maybe_update_password
before_update :maybe_update_password
def from_email(nil), do: { :error, :not_found }
def from_email(email) do
Repo.one(User, email: email)
end
def create_changeset(model, params \\ :empty) do
model
|> cast(params, ~w(name email password))
end
def update_changeset(model, params \\ :empty) do
model
|> cast(params, ~w(), ~w(name email password))
end
def login_changeset(model), do: model |> cast(%{}, ~w(), ~w(email password))
def login_changeset(model, params) do
model
|> cast(params, ~w(email password), ~w())
|> validate_password
end
def valid_password?(nil, _), do: false
def valid_password?(_, nil), do: false
def valid_password?(password, crypted), do: Comeonin.Bcrypt.checkpw(password, crypted)
defp maybe_update_password(changeset) do
case Ecto.Changeset.fetch_change(changeset, :password) do
{ :ok, password } ->
changeset
|> Ecto.Changeset.put_change(:encrypted_password, Comeonin.Bcrypt.hashpwsalt(password))
:error -> changeset
end
end
defp validate_password(changeset) do
case Ecto.Changeset.get_field(changeset, :encrypted_password) do
nil -> password_incorrect_error(changeset)
crypted -> validate_password(changeset, crypted)
end
end
defp validate_password(changeset, crypted) do
password = Ecto.Changeset.get_change(changeset, :password)
if valid_password?(password, crypted), do: changeset, else: password_incorrect_error(changeset)
end
defp password_incorrect_error(changeset), do: Ecto.Changeset.add_error(changeset, :password, "is incorrect")
end