From bfae1b53fc1fd7e3224c31fb63c26f83d50b065a Mon Sep 17 00:00:00 2001 From: shenlan Date: Mon, 6 Oct 2025 10:36:40 +0800 Subject: [PATCH] fix: rely on db uniqueness for account usernames (#416) --- account/internal/store/postgres.go | 55 +++--------------------------- account/sql/schema.sql | 3 ++ 2 files changed, 7 insertions(+), 51 deletions(-) diff --git a/account/internal/store/postgres.go b/account/internal/store/postgres.go index a62336c..8080b09 100644 --- a/account/internal/store/postgres.go +++ b/account/internal/store/postgres.go @@ -100,25 +100,10 @@ func (s *postgresStore) CreateUser(ctx context.Context, user *User) error { return ErrInvalidName } - exists, err := s.userExistsByName(ctx, normalizedName) - if err != nil { - return err - } - if exists { - return ErrNameExists - } - - if normalizedEmail != "" { - exists, err = s.userExistsByEmail(ctx, normalizedEmail) - if err != nil { - return err - } - if exists { - return ErrEmailExists - } - } - - var verifiedAt any + var ( + verifiedAt any + err error + ) if user.EmailVerified { verifiedAt = time.Now().UTC() } @@ -210,38 +195,6 @@ func (s *postgresStore) GetUserByID(ctx context.Context, id string) (*User, erro return scanUser(row) } -func (s *postgresStore) userExistsByEmail(ctx context.Context, email string) (bool, error) { - if email == "" { - return false, nil - } - - var exists int - err := s.db.QueryRowContext(ctx, `SELECT 1 FROM users WHERE lower(email) = lower($1) LIMIT 1`, email).Scan(&exists) - if err == nil { - return true, nil - } - if errors.Is(err, sql.ErrNoRows) { - return false, nil - } - return false, err -} - -func (s *postgresStore) userExistsByName(ctx context.Context, name string) (bool, error) { - if name == "" { - return false, nil - } - - var exists int - err := s.db.QueryRowContext(ctx, `SELECT 1 FROM users WHERE lower(username) = lower($1) LIMIT 1`, name).Scan(&exists) - if err == nil { - return true, nil - } - if errors.Is(err, sql.ErrNoRows) { - return false, nil - } - return false, err -} - type rowScanner interface { Scan(dest ...any) error } diff --git a/account/sql/schema.sql b/account/sql/schema.sql index c3c23c6..e9f1978 100644 --- a/account/sql/schema.sql +++ b/account/sql/schema.sql @@ -50,6 +50,9 @@ CREATE TABLE IF NOT EXISTS users ( CONSTRAINT users_email_uk UNIQUE (email) ); +CREATE UNIQUE INDEX IF NOT EXISTS users_username_lower_uk ON users (lower(username)); +CREATE UNIQUE INDEX IF NOT EXISTS users_email_lower_uk ON users (lower(email)) WHERE email IS NOT NULL; + CREATE TABLE IF NOT EXISTS identities ( provider TEXT NOT NULL, external_id TEXT NOT NULL,