From b7de53bab0c036144a0838941e7507adde2a7ffb Mon Sep 17 00:00:00 2001 From: Joao P Dubas Date: Sat, 15 Feb 2025 22:15:21 +0000 Subject: [PATCH] feat(chat): validate username on registration Also, update seeds to register with usernames. --- lib/slax/accounts.ex | 6 +++++- lib/slax/accounts/user.ex | 43 +++++++++++++++++++++++++++++---------- priv/repo/seeds.exs | 2 +- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/lib/slax/accounts.ex b/lib/slax/accounts.ex index 212fd90..a48274b 100644 --- a/lib/slax/accounts.ex +++ b/lib/slax/accounts.ex @@ -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 diff --git a/lib/slax/accounts/user.ex b/lib/slax/accounts/user.ex index a6ba038..7be453a 100644 --- a/lib/slax/accounts/user.ex +++ b/lib/slax/accounts/user.ex @@ -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. diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index df166de..233d0aa 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -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")