frenzy/lib/frenzy/user.ex

92 lines
2.5 KiB
Elixir
Raw Normal View History

2019-03-23 17:53:53 +00:00
defmodule Frenzy.User do
use Ecto.Schema
import Ecto.Changeset
schema "users" do
field :username, :string
field :password, :string, virtual: true
field :password_hash, :string
2019-03-24 15:00:46 +00:00
field :fever_password, :string, virtual: true
field :fever_auth_token, :string
2023-06-25 22:19:11 +00:00
field :oidc_subject, :string
2019-03-23 17:53:53 +00:00
2019-03-28 21:11:25 +00:00
has_many :approved_clients, Frenzy.ApprovedClient, on_delete: :delete_all
2019-03-23 17:53:53 +00:00
has_many :groups, Frenzy.Group, on_delete: :delete_all
has_many :feeds, through: [:groups, :feeds]
2019-03-23 17:53:53 +00:00
timestamps()
end
@type t() :: %__MODULE__{
__meta__: Ecto.Schema.Metadata.t(),
id: integer() | nil,
username: String.t(),
password: String.t() | nil,
password_hash: String.t(),
fever_password: String.t() | nil,
fever_auth_token: String.t(),
2023-06-25 22:19:11 +00:00
oidc_subject: String.t() | nil,
approved_clients: [Frenzy.ApprovedClient.t()] | Ecto.Association.NotLoaded.t(),
groups: [Frenzy.Group.t()] | Ecto.Association.NotLoaded.t(),
inserted_at: NaiveDateTime.t(),
updated_at: NaiveDateTime.t()
}
2019-03-23 17:53:53 +00:00
@doc false
def changeset(user, attrs) do
user
|> cast(attrs, [:username, :password_hash])
|> validate_required([:username, :password_hash])
end
def registration_changeset(user, attrs) do
user
2019-03-24 15:00:46 +00:00
|> cast(attrs, [:username, :password, :fever_password])
2019-03-23 17:53:53 +00:00
|> validate_length(:password, min: 8)
2019-03-24 15:00:46 +00:00
|> validate_length(:fever_password, min: 8)
2019-03-23 17:53:53 +00:00
|> put_password_hash()
2019-03-31 15:52:20 +00:00
|> put_fever_token()
end
def change_password_changeset(user, attrs) do
user
|> cast(attrs, [:password])
|> validate_length(:password, min: 8)
|> put_password_hash()
2019-03-23 17:53:53 +00:00
end
2019-03-31 17:19:11 +00:00
def change_fever_password_changeset(user, attrs) do
user
|> cast(attrs, [:username, :fever_password])
|> validate_length(:fever_password, min: 8)
|> put_fever_token()
end
2023-06-25 22:19:11 +00:00
def set_oidc_subject_changeset(user, attrs) do
user
|> cast(attrs, [:oidc_subject])
end
2019-03-23 17:53:53 +00:00
defp put_password_hash(
2019-03-31 15:52:20 +00:00
%Ecto.Changeset{valid?: true, changes: %{password: password}} = changeset
) do
change(changeset, Bcrypt.add_hash(password))
end
defp put_fever_token(
2019-03-24 15:00:46 +00:00
%Ecto.Changeset{
valid?: true,
2019-03-31 17:19:11 +00:00
changes: %{fever_password: fever_password}
2019-03-24 15:00:46 +00:00
} = changeset
2019-03-23 17:53:53 +00:00
) do
2019-03-31 17:19:11 +00:00
username = Map.get(changeset.changes, "username") || changeset.data.username
IO.inspect(username)
2019-03-31 15:52:20 +00:00
change(changeset, %{
2019-03-24 15:00:46 +00:00
fever_auth_token:
:crypto.hash(:md5, "#{username}:#{fever_password}") |> Base.encode16(case: :lower)
})
2019-03-23 17:53:53 +00:00
end
end