miniauth/pkg/userstore/mail.go
2025-03-18 12:06:17 +01:00

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
}