Allow reusing deleted user emails

This commit is contained in:
alxlion
2026-08-07 05:59:31 +00:00
parent 40a98be34a
commit 6321b9e262
4 changed files with 27 additions and 1 deletions

View File

@@ -3,6 +3,7 @@
### Fixes and improvements
- Fix datetime being reset at every changes
- Fix account creation with a soft-deleted email
## v.3.0.0

View File

@@ -2,6 +2,7 @@ defmodule Claper.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
import Ecto.Query
@derive {
Flop.Schema,
@@ -129,7 +130,9 @@ defmodule Claper.Accounts.User do
|> 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, Claper.Repo)
|> unsafe_validate_unique(:email, Claper.Repo,
query: from(user in __MODULE__, where: is_nil(user.deleted_at))
)
|> unique_constraint(:email)
end

View File

@@ -0,0 +1,8 @@
defmodule Claper.Repo.Migrations.AllowReusingDeletedUserEmails do
use Ecto.Migration
def change do
drop unique_index(:users, [:email])
create unique_index(:users, [:email], where: "deleted_at IS NULL")
end
end

View File

@@ -186,6 +186,20 @@ defmodule Claper.AccountsTest do
assert oidc_user.user.first_name == "Local"
assert oidc_user.user.last_name == "Name"
end
test "creates a new account when the previous account with that email was deleted" do
deleted_user = user_fixture()
assert {:ok, deleted_user} = Accounts.delete_user(deleted_user)
assert {:ok, oidc_user} =
Accounts.get_or_create_user_with_oidc(
oidc_user_attrs(%{email: deleted_user.email})
)
refute oidc_user.user.id == deleted_user.id
refute Accounts.deleted?(oidc_user.user)
assert Accounts.get_user_by_email(deleted_user.email).id == oidc_user.user.id
end
end
describe "change_user_email/2" do