diff --git a/priv/repo/migrations/20260807052500_allow_reusing_deleted_user_emails.exs b/priv/repo/migrations/20260807052500_allow_reusing_deleted_user_emails.exs index 0cb9998..56b8fc4 100644 --- a/priv/repo/migrations/20260807052500_allow_reusing_deleted_user_emails.exs +++ b/priv/repo/migrations/20260807052500_allow_reusing_deleted_user_emails.exs @@ -3,6 +3,21 @@ defmodule Claper.Repo.Migrations.AllowReusingDeletedUserEmails do def change do drop_if_exists unique_index(:users, [:email]) + + execute """ + WITH ranked_users AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY email ORDER BY inserted_at, id) AS email_position + FROM users + WHERE deleted_at IS NULL + ) + UPDATE users + SET deleted_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP + FROM ranked_users + WHERE users.id = ranked_users.id AND ranked_users.email_position > 1 + """ + create unique_index(:users, [:email], where: "deleted_at IS NULL") end end