package userstore import ( "database/sql" "fmt" "time" "git.keks.cloud/kekskurse/miniauth/pkg/utils" "github.com/google/uuid" ) 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, userID, validatenCode, primary) if err != nil { return utils.WrapError(ErrCantExecuteQuery, err, log) } return nil } func (s Store) MailCheckExists(email string) (bool, error) { query := "SELECT COUNT(*) FROM mail WHERE mail = ?" log := s.log.With().Str("func", "MailCheckExists").Str("email", email).Str("query", query).Logger() var count int err := s.db.QueryRow(query, email).Scan(&count) if err != nil { return true, utils.WrapError(ErrCantExecuteQuery, err, log) } if count > 0 { return true, nil } return false, nil } func (s Store) MailRemove(email string) error { query := "DELETE FROM mail WHERE mail = ?" log := s.log.With().Str("func", "MailRemove").Str("email", email).Str("query", query).Logger() _, err := s.db.Exec(query, email) if err != nil { return utils.WrapError(ErrCantExecuteQuery, err, log) } 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 }