fix: rely on db uniqueness for account usernames (#416)

This commit is contained in:
shenlan 2025-10-06 10:36:40 +08:00 committed by GitHub
parent fcab4b5363
commit bfae1b53fc
2 changed files with 7 additions and 51 deletions

View File

@ -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
}

View File

@ -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,