feat(chat): validate username on registration

Also, update seeds to register with usernames.
This commit is contained in:
João Paulo Dubas 2025-02-15 22:15:21 +00:00
parent 10c905249c
commit b7de53bab0
Signed by: joao.dubas
SSH Key Fingerprint: SHA256:V1mixgOGRc/YMhGx/DNkOSmJxgA2vHNrDZEk3wt/kOA
3 changed files with 38 additions and 13 deletions

View File

@ -94,7 +94,11 @@ defmodule Slax.Accounts do
"""
def change_user_registration(%User{} = user, attrs \\ %{}) do
User.registration_changeset(user, attrs, hash_password: false, validate_email: false)
User.registration_changeset(user, attrs,
hash_password: false,
validate_email: false,
validate_username: false
)
end
## Settings

View File

@ -43,8 +43,9 @@ defmodule Slax.Accounts.User do
"""
def registration_changeset(user, attrs, opts \\ []) do
user
|> cast(attrs, [:email, :password])
|> cast(attrs, [:email, :username, :password])
|> validate_email(opts)
|> validate_username(opts)
|> validate_password(opts)
end
@ -56,6 +57,36 @@ defmodule Slax.Accounts.User do
|> maybe_validate_unique_email(opts)
end
defp maybe_validate_unique_email(changeset, opts) do
if Keyword.get(opts, :validate_email, true) do
changeset
|> unsafe_validate_unique(:email, Slax.Repo)
|> unique_constraint(:email)
else
changeset
end
end
defp validate_username(changeset, opts) do
changeset
|> validate_required([:username])
|> validate_format(:username, ~r/^[A-Za-z0-9-]+$/,
message: "can only contain letters, numbers, and dashes"
)
|> validate_length(:username, max: 20)
|> maybe_validate_unique_username(opts)
end
defp maybe_validate_unique_username(changeset, opts) do
if Keyword.get(opts, :validate_username, true) do
changeset
|> unsafe_validate_unique(:username, Slax.Repo)
|> unique_constraint(:username)
else
changeset
end
end
defp validate_password(changeset, opts) do
changeset
|> validate_required([:password])
@ -84,16 +115,6 @@ defmodule Slax.Accounts.User do
end
end
defp maybe_validate_unique_email(changeset, opts) do
if Keyword.get(opts, :validate_email, true) do
changeset
|> unsafe_validate_unique(:email, Slax.Repo)
|> unique_constraint(:email)
else
changeset
end
end
@doc """
A user changeset for changing the email.

View File

@ -30,7 +30,7 @@ pw = "TheFellowship"
for name <- names do
email = "#{String.downcase(name)}@fellowship.me"
Accounts.register_user(%{email: email, password: pw, password_confirmation: pw})
Accounts.register_user(%{username: name, email: email, password: pw, password_confirmation: pw})
end
aragorn = Accounts.get_user_by_email("aragorn@fellowship.me")