90 lines
2.5 KiB
Go
90 lines
2.5 KiB
Go
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
|
|
}
|