auto-populate missing username field with email local-part

This commit is contained in:
2026-03-17 19:27:41 +08:00
parent 7b4d2e789f
commit 32746756d4
7 changed files with 215 additions and 11 deletions

View File

@@ -0,0 +1,2 @@
-- This migration was generated locally but superseded before it was applied.
-- It remains as a no-op to preserve Prisma migration history.

View File

@@ -0,0 +1,27 @@
UPDATE users
SET username = lower(split_part(email, '@', 1))
WHERE username IS NULL OR btrim(username) = '';
WITH ranked_users AS (
SELECT id,
username,
row_number() OVER (PARTITION BY username ORDER BY created_at, id) AS rn
FROM users
),
deduplicated AS (
SELECT id,
CASE
WHEN rn = 1 THEN username
ELSE left(username, greatest(1, 24 - char_length(rn::text))) || rn::text
END AS next_username
FROM ranked_users
)
UPDATE users u
SET username = d.next_username
FROM deduplicated d
WHERE u.id = d.id;
ALTER TABLE users
ALTER COLUMN username SET NOT NULL;
CREATE UNIQUE INDEX users_username_key ON users (username);

View File

@@ -1,8 +1,19 @@
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM (
SELECT LOWER(TRIM("email")) AS normalized_email
FROM "users"
GROUP BY LOWER(TRIM("email"))
HAVING COUNT(*) > 1
) duplicates
) THEN
RAISE EXCEPTION
'Cannot normalize user emails: duplicate values would conflict after lowercasing/trimming';
END IF;
END $$;
UPDATE "users"
SET "email" = LOWER(TRIM("email"))
WHERE "email" <> LOWER(TRIM("email"));
ALTER TABLE "users"
DROP CONSTRAINT IF EXISTS "users_email_key";
CREATE UNIQUE INDEX "users_email_key" ON "users"(LOWER("email"));