You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.4 KiB
Elixir
57 lines
1.4 KiB
Elixir
7 years ago
|
defmodule Asciinema.Accounts.User do
|
||
7 years ago
|
use Ecto.Schema
|
||
|
import Ecto.Changeset
|
||
7 years ago
|
alias Asciinema.Accounts.User
|
||
8 years ago
|
|
||
7 years ago
|
@valid_email_re ~r/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i
|
||
|
|
||
8 years ago
|
schema "users" do
|
||
|
field :username, :string
|
||
|
field :temporary_username, :string
|
||
|
field :email, :string
|
||
|
field :name, :string
|
||
|
field :auth_token, :string
|
||
|
field :theme_name, :string
|
||
|
field :asciicasts_private_by_default, :boolean, default: true
|
||
7 years ago
|
field :last_login_at, Timex.Ecto.DateTime
|
||
8 years ago
|
|
||
7 years ago
|
timestamps(inserted_at: :created_at)
|
||
|
|
||
7 years ago
|
has_many :asciicasts, Asciinema.Asciicasts.Asciicast
|
||
7 years ago
|
has_many :api_tokens, Asciinema.Accounts.ApiToken
|
||
8 years ago
|
end
|
||
|
|
||
|
def changeset(struct, params \\ %{}) do
|
||
|
struct
|
||
7 years ago
|
|> cast(params, [:email, :name, :username, :theme_name, :asciicasts_private_by_default])
|
||
7 years ago
|
|> validate_format(:email, @valid_email_re)
|
||
7 years ago
|
end
|
||
|
|
||
|
def create_changeset(struct, attrs) do
|
||
|
struct
|
||
|
|> changeset(attrs)
|
||
|
|> generate_auth_token
|
||
8 years ago
|
end
|
||
7 years ago
|
|
||
7 years ago
|
def signup_changeset(attrs) do
|
||
|
%User{}
|
||
|
|> create_changeset(attrs)
|
||
|
|> cast(attrs, [:email])
|
||
|
|> validate_required([:email])
|
||
|
end
|
||
|
|
||
|
def login_changeset(user) do
|
||
|
change(user, %{last_login_at: Timex.now()})
|
||
|
end
|
||
|
|
||
7 years ago
|
def temporary_changeset(temporary_username) do
|
||
|
%User{}
|
||
|
|> change(%{temporary_username: temporary_username})
|
||
|
|> generate_auth_token
|
||
|
end
|
||
|
|
||
|
defp generate_auth_token(changeset) do
|
||
|
put_change(changeset, :auth_token, Crypto.random_token(20))
|
||
|
end
|
||
8 years ago
|
end
|