diff --git a/pkg/miniauth/error.go b/pkg/miniauth/error.go index 79d6f9b..d7f428b 100644 --- a/pkg/miniauth/error.go +++ b/pkg/miniauth/error.go @@ -3,6 +3,6 @@ package miniauth import "errors" var ( - ErrUSernameInvalide = errors.New("username not valide") ErrUserHasInvalideChars = errors.New("username has invalide chars") + ErrUsernameIsTaken = errors.New("username already takebn") ) diff --git a/pkg/miniauth/miniauth.go b/pkg/miniauth/miniauth.go index 11d99cd..2bda06a 100644 --- a/pkg/miniauth/miniauth.go +++ b/pkg/miniauth/miniauth.go @@ -34,5 +34,15 @@ func (m Miniauth) checkUsernameForRegistration(username string) error { if !reg.MatchString(username) { return ErrUserHasInvalideChars } + + exists, err := m.store.UserExists(username) + if err != nil { + return err + } + + if exists { + return ErrUsernameIsTaken + } + return nil } diff --git a/pkg/miniauth/miniauth_test.go b/pkg/miniauth/miniauth_test.go index 897824f..df156cb 100644 --- a/pkg/miniauth/miniauth_test.go +++ b/pkg/miniauth/miniauth_test.go @@ -38,9 +38,16 @@ func TestInvalideUsernames(t *testing.T) { username: "kekskurse", exptErr: nil, }, + { + name: "username already taken", + username: "testuser", + exptErr: ErrUsernameIsTaken, + }, } ma := getMiniAuth(t) + _, err := ma.store.UserWrite("testuser", "testpassword") + assert.Nil(t, err, "[setup] should be abel to write user without error") for _, tt := range tts { t.Run(tt.name, func(t *testing.T) { err := ma.checkUsernameForRegistration(tt.username) diff --git a/pkg/userstore/users.go b/pkg/userstore/users.go index 513ae21..6a07cb2 100644 --- a/pkg/userstore/users.go +++ b/pkg/userstore/users.go @@ -7,7 +7,7 @@ import ( func (s Store) UserWrite(username, password string) (int64, error) { query := "INSERT INTO users (username, password) VALUES (?, ?);" - log := s.log.With().Str("query", query).Str("username", username).Logger() + log := s.log.With().Str("func", "UserWrite").Str("query", query).Str("username", username).Logger() pwHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { @@ -25,3 +25,20 @@ func (s Store) UserWrite(username, password string) (int64, error) { } return id, nil } + +func (s Store) UserExists(username string) (bool, error) { + query := "SELECT COUNT(*) FROM users WHERE username = ?" + log := s.log.With().Str("func", "UserExists").Str("query", query).Str("username", username).Logger() + + var count int + err := s.db.QueryRow(query, username).Scan(&count) + if err != nil { + return true, utils.WrapError(ErrCantExecuteQuery, err, log) + } + + if count == 0 { + return false, nil + } + + return true, nil +} diff --git a/pkg/userstore/users_test.go b/pkg/userstore/users_test.go index 64515ce..267548f 100644 --- a/pkg/userstore/users_test.go +++ b/pkg/userstore/users_test.go @@ -68,3 +68,19 @@ func TestWriteUser(t *testing.T) { assert.NotEqual(t, "kekskurse", pw2) assert.NotEqual(t, pw1, pw2, "passwords should not be equal") } + +func TestUserExists(t *testing.T) { + store, err := NewDummyStore() + assert.Nil(t, err, "[setup] should get dummy store without error") + + exists, err := store.UserExists("kekskurse") + assert.Nil(t, err) + assert.False(t, exists) + + _, err = store.UserWrite("kekskurse", "kekskurse") + assert.Nil(t, err, "[setup] should be abel to create user") + + exists, err = store.UserExists("kekskurse") + assert.Nil(t, err) + assert.True(t, exists) +}