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-11-12 03:42:10 +00:00
|
|
|
field :active_profile_user_id, :id
|
2021-11-16 16:58:22 +00:00
|
|
|
field :avatar_url, :string
|
|
|
|
field :external_homepage_url, :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
|
2021-11-16 16:58:22 +00:00
|
|
|
%{"login" => username, "avatar_url" => avatar_url, "html_url" => external_homepage_url} = 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-16 16:58:22 +00:00
|
|
|
"name" => get_change(identity_changeset, :provider_name),
|
|
|
|
"avatar_url" => avatar_url,
|
|
|
|
"external_homepage_url" => external_homepage_url
|
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{}
|
2021-11-16 16:58:22 +00:00
|
|
|
|> cast(params, [:email, :name, :username, :avatar_url, :external_homepage_url])
|
2021-09-08 14:58:32 +00:00
|
|
|
|> 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
|
2021-11-12 17:41:16 +00:00
|
|
|
|> cast(params, [:username, :profile_tagline])
|
|
|
|
|> validate_required([:username, :profile_tagline])
|
2021-11-09 11:20:10 +00:00
|
|
|
|> 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
|