diff --git a/pkg/userstore/mail.go b/pkg/userstore/mail.go index cbb7cbd..7e80237 100644 --- a/pkg/userstore/mail.go +++ b/pkg/userstore/mail.go @@ -1,6 +1,10 @@ package userstore import ( + "database/sql" + "fmt" + "time" + "git.keks.cloud/kekskurse/miniauth/pkg/utils" "github.com/google/uuid" ) @@ -46,3 +50,41 @@ func (s Store) MailRemove(email string) error { return nil } + +type Mail struct { + ID int + Mail string + UserID int + ValidationCode string + IsPrimary bool + IsValidated bool + CreatedAt time.Time + UpdatedAt time.Time +} + +func (s Store) MailGetPrimaryForUsername(username string) (Mail, error) { + query := fmt.Sprintf("SELECT %v FROM mail WHERE user_id = (SELECT id FROM users WHERE username = ? LIMIT 1) AND is_primary = ?", s.mailGetFields()) + log := s.log.With().Str("func", "MailGetPrimaryForUsername").Str("username", username).Str("query", query).Logger() + + row := s.db.QueryRow(query, username, 1) + mail, err := s.mailScan(row) + if err != nil { + return Mail{}, utils.WrapError(ErrCantExecuteQuery, err, log) + } + + return mail, nil +} + +func (s Store) mailGetFields() string { + return "id, created_at, updated_at, mail, user_id, validation_code, is_validated, is_primary" +} + +func (s Store) mailScan(row *sql.Row) (Mail, error) { + mail := Mail{} + err := row.Scan(&mail.ID, &mail.CreatedAt, &mail.UpdatedAt, &mail.Mail, &mail.UserID, &mail.ValidationCode, &mail.IsValidated, &mail.IsPrimary) + if err != nil { + return Mail{}, err + } + + return mail, nil +} diff --git a/pkg/userstore/mail_test.go b/pkg/userstore/mail_test.go index 5aec46e..18f0693 100644 --- a/pkg/userstore/mail_test.go +++ b/pkg/userstore/mail_test.go @@ -2,6 +2,7 @@ package userstore import ( "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -122,3 +123,25 @@ func TestDeleteMail(t *testing.T) { assert.Nil(t, err, "should execute count query for mail") assert.Equal(t, 1, count, "should found 1 mails in the database") } + +func TestGetPrimaryMailForUser(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") + + err = store.MailAdd("mail1@example.com", 1, true) + assert.Nil(t, err, "[setup] should be abel to store mail") + err = store.MailAdd("mail2@example.com", 1, false) + assert.Nil(t, err, "[setup] should be abel to store mail2") + + mail, err := store.MailGetPrimaryForUsername("kekskurse") + assert.Nil(t, err) + + assert.Equal(t, "mail1@example.com", mail.Mail) + assert.Equal(t, true, mail.IsPrimary) + assert.Equal(t, false, mail.IsValidated) + assert.Equal(t, time.Now().Year(), mail.CreatedAt.Year()) + assert.Equal(t, time.Now().Year(), mail.UpdatedAt.Year()) +}