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 field :fever_password, :string, virtual: true field :fever_auth_token, :string has_many :groups, Frenzy.Group, on_delete: :delete_all timestamps() end @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 |> cast(attrs, [:username, :password, :fever_password]) |> validate_length(:password, min: 8) |> validate_length(:fever_password, min: 8) |> put_password_hash() end defp put_password_hash( %Ecto.Changeset{ valid?: true, changes: %{username: username, password: password, fever_password: fever_password} } = changeset ) do changeset |> change(Bcrypt.add_hash(password)) |> change(%{ fever_auth_token: :crypto.hash(:md5, "#{username}:#{fever_password}") |> Base.encode16(case: :lower) }) end end