diff --git a/pkg/miniauth/error.go b/pkg/miniauth/error.go index 44e0d71..8ba89c4 100644 --- a/pkg/miniauth/error.go +++ b/pkg/miniauth/error.go @@ -6,4 +6,5 @@ var ( ErrUserHasInvalideChars = errors.New("username has invalide chars") ErrUsernameIsTaken = errors.New("username already takebn") ErrPasswordNotComplexEnough = errors.New("password not complex enough") + ErrCantCreateUser = errors.New("cant create user") ) diff --git a/pkg/miniauth/miniauth.go b/pkg/miniauth/miniauth.go index 20a9807..b9a6815 100644 --- a/pkg/miniauth/miniauth.go +++ b/pkg/miniauth/miniauth.go @@ -32,6 +32,18 @@ func (m Miniauth) RegisterUser(username string, mail string, password string) er return utils.WrapError(ErrPasswordNotComplexEnough, err, log) } + id, err := m.store.UserWrite(username, password) + if err != nil { + return utils.WrapError(ErrCantCreateUser, err, log) + } + + log = log.With().Int64("userid", id).Logger() + + err = m.store.MailAdd(mail, id, true) + if err != nil { + return utils.WrapError(ErrCantCreateUser, err, log) + } + return nil } diff --git a/pkg/miniauth/miniauth_test.go b/pkg/miniauth/miniauth_test.go index e2d033b..9479e00 100644 --- a/pkg/miniauth/miniauth_test.go +++ b/pkg/miniauth/miniauth_test.go @@ -7,6 +7,43 @@ import ( "github.com/stretchr/testify/assert" ) +func TestRegistration(t *testing.T) { + tts := []struct { + name string + username string + password string + mail string + exptErr error + exptErrString string + }{ + { + name: "invaloid username", + username: "abc", + password: "2b7B3Wm0KwIZ$Uvtc$!VOb", + mail: "mail@kekskurse.de", + exptErr: ErrUserHasInvalideChars, + exptErrString: "username has invalide chars: username has invalide chars", + }, + { + name: "invaloid password", + username: "kekskurse", + password: "abc123d", + mail: "mail@kekskurse.de", + exptErr: ErrPasswordNotComplexEnough, + exptErrString: "password not complex enough: Password length must be not lower that 15 chars", + }, + } + + ma := getMiniAuth(t) + for _, tt := range tts { + t.Run(tt.name, func(t *testing.T) { + err := ma.RegisterUser(tt.username, tt.mail, tt.password) + assert.ErrorIs(t, err, tt.exptErr) + assert.Equal(t, tt.exptErrString, err.Error()) + }) + } +} + func TestPasswordCheck(t *testing.T) { tts := []struct { name string diff --git a/pkg/userstore/mail.go b/pkg/userstore/mail.go index bbb9aed..d95dea5 100644 --- a/pkg/userstore/mail.go +++ b/pkg/userstore/mail.go @@ -5,12 +5,12 @@ import ( "github.com/google/uuid" ) -func (s Store) MailAdd(mail string, primary bool) error { - query := "INSERT INTO mail (mail, validationCode, isPrimary) VALUES (?, ?, ?);" - log := s.log.With().Str("func", "MailAdd").Str("mail", mail).Bool("primary", primary).Str("query", query).Logger() +func (s Store) MailAdd(mail string, userID int64, primary bool) error { + query := "INSERT INTO mail (mail, user_id, validation_code, is_primary) VALUES (?, ?, ?, ?);" + log := s.log.With().Str("func", "MailAdd").Int64("user_id", userID).Str("mail", mail).Bool("primary", primary).Str("query", query).Logger() validatenCode := uuid.NewString() - _, err := s.db.Exec(query, mail, validatenCode, primary) + _, err := s.db.Exec(query, mail, userID, validatenCode, primary) if err != nil { return utils.WrapError(ErrCantExecuteQuery, err, log) } diff --git a/pkg/userstore/mail_test.go b/pkg/userstore/mail_test.go index e60b465..b5377de 100644 --- a/pkg/userstore/mail_test.go +++ b/pkg/userstore/mail_test.go @@ -10,9 +10,13 @@ func TestAddMail(t *testing.T) { store, err := NewDummyStore() assert.Nil(t, err, "[setup] should be abel to create dummystore") + _, err = store.UserWrite("kekskurse", "kekskurse") + assert.Nil(t, err, "[setup] should be abel to store user") + tts := []struct { name string mail string + user_id int64 primearyMail bool ExptErr error ExptErrString string @@ -20,11 +24,13 @@ func TestAddMail(t *testing.T) { { name: "test-add-first-mail", mail: "mail1@kekskurse.de", + user_id: 1, primearyMail: false, }, { name: "test-add-mail-again-should-return-error", mail: "mail1@kekskurse.de", + user_id: 1, primearyMail: false, ExptErr: ErrCantExecuteQuery, ExptErrString: "cant execute query: constraint failed: UNIQUE constraint failed: mail.mail (2067)", @@ -33,7 +39,7 @@ func TestAddMail(t *testing.T) { for _, tt := range tts { t.Run(tt.name, func(t *testing.T) { - err := store.MailAdd(tt.mail, tt.primearyMail) + err := store.MailAdd(tt.mail, tt.user_id, tt.primearyMail) if tt.ExptErr == nil { assert.Nil(t, err) } else { @@ -45,7 +51,7 @@ func TestAddMail(t *testing.T) { var validateCode string isValidated = true - err = store.db.QueryRow("SELECT validationCode, isValidated FROM mail WHERE mail = ?", tt.mail).Scan(&validateCode, &isValidated) + err = store.db.QueryRow("SELECT validation_code, is_validated FROM mail WHERE mail = ?", tt.mail).Scan(&validateCode, &isValidated) assert.Nil(t, err, "should get mail infos from db without error") assert.False(t, isValidated, "mail should not be validated") assert.NotEmpty(t, validateCode, "validaten code should not be empty") diff --git a/pkg/userstore/migrations/1741770848_init.up.sql b/pkg/userstore/migrations/1741770848_init.up.sql index 6f66cd0..98f773c 100644 --- a/pkg/userstore/migrations/1741770848_init.up.sql +++ b/pkg/userstore/migrations/1741770848_init.up.sql @@ -11,9 +11,12 @@ CREATE TABLE mail ( id INTEGER PRIMARY KEY AUTOINCREMENT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, + user_id INTEGER NOT NULL, mail TEXT NOT NULL UNIQUE, - validationCode TEXT NOT NULL UNIQUE, - isValidated BOOLEAN NOT NULL DEFAULT 0, - isPrimary BOOLEAN NOT NULL DEFAULT 0 + validation_code TEXT NOT NULL UNIQUE, + is_validated BOOLEAN NOT NULL DEFAULT 0, + is_primary BOOLEAN NOT NULL DEFAULT 0, + + FOREIGN KEY(user_id) REFERENCES users(id) ); diff --git a/pkg/userstore/migrations/schema.sql b/pkg/userstore/migrations/schema.sql index 5b55afe..a4b5a31 100644 --- a/pkg/userstore/migrations/schema.sql +++ b/pkg/userstore/migrations/schema.sql @@ -16,8 +16,11 @@ CREATE TABLE mail ( id INTEGER PRIMARY KEY AUTOINCREMENT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, + user_id INTEGER NOT NULL, mail TEXT NOT NULL UNIQUE, - validationCode TEXT NOT NULL UNIQUE, - isValidated BOOLEAN NOT NULL DEFAULT 0, - isPrimary BOOLEAN NOT NULL DEFAULT 0 + validation_code TEXT NOT NULL UNIQUE, + is_validated BOOLEAN NOT NULL DEFAULT 0, + is_primary BOOLEAN NOT NULL DEFAULT 0, + + FOREIGN KEY(user_id) REFERENCES users(id) ); \ No newline at end of file