live_beats/lib/live_beats/accounts/user.ex

83 lines
2.2 KiB
Elixir
Raw Normal View History

2021-09-08 14:58:32 +00:00
defmodule LiveBeats.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
alias LiveBeats.Accounts.{User, Identity}
schema "users" do
field :email, :string
field :name, :string
field :username, :string
field :confirmed_at, :naive_datetime
field :role, :string, default: "subscriber"
2021-11-09 11:20:10 +00:00
field :profile_tagline, :string
2021-09-08 14:58:32 +00:00
has_many :identities, Identity
timestamps()
end
@doc """
A user changeset for github registration.
"""
def github_registration_changeset(info, primary_email, emails, token) do
%{"login" => username} = info
2021-11-09 11:20:10 +00:00
identity_changeset =
Identity.github_registration_changeset(info, primary_email, emails, token)
2021-09-08 14:58:32 +00:00
if identity_changeset.valid? do
params = %{
"username" => username,
"email" => primary_email,
2021-11-09 11:20:10 +00:00
"name" => get_change(identity_changeset, :provider_name)
2021-09-08 14:58:32 +00:00
}
2021-11-09 11:20:10 +00:00
2021-09-08 14:58:32 +00:00
%User{}
|> cast(params, [:email, :name, :username])
|> validate_required([:email, :name, :username])
2021-11-09 11:20:10 +00:00
|> validate_username()
2021-09-08 14:58:32 +00:00
|> validate_email()
|> put_assoc(:identities, [identity_changeset])
else
%User{}
|> change()
|> Map.put(:value?, false)
|> put_assoc(:identities, [identity_changeset])
end
end
2021-11-09 11:20:10 +00:00
def settings_changeset(%User{} = user, params) do
user
|> cast(params, [:username])
|> validate_required([:username])
|> validate_username()
end
2021-09-08 14:58:32 +00:00
defp validate_email(changeset) do
changeset
|> validate_required([:email])
|> validate_format(:email, ~r/^[^\s]+@[^\s]+$/, message: "must have the @ sign and no spaces")
|> validate_length(:email, max: 160)
|> unsafe_validate_unique(:email, LiveBeats.Repo)
|> unique_constraint(:email)
end
2021-11-09 11:20:10 +00:00
defp validate_username(changeset) do
changeset
|> validate_format(:username, ~r/^[a-z0-9_-]{2,32}$/)
|> unsafe_validate_unique(:username, LiveBeats.Repo)
|> unique_constraint(:username)
|> prepare_changes(fn changeset ->
case fetch_change(changeset, :profile_tagline) do
{:ok, _} ->
changeset
:error ->
username = get_field(changeset, :username)
put_change(changeset, :profile_tagline, "#{username}'s beats")
end
end)
end
2021-09-08 14:58:32 +00:00
end