// SPDX-License-Identifier: AGPL-3.0-or-later package store import ( "database/sql" "errors" "fmt" "strings" ) var ErrSignupRequestExists = errors.New("signup request already exists") type SignupRequestStore struct { db *sql.DB } func NewSignupRequestStore(db *sql.DB) *SignupRequestStore { return &SignupRequestStore{db: db} } // Create stores a pending signup request with a hashed password. func (s *SignupRequestStore) Create(username, password string) error { hash, err := hashPassword(password) if err != nil { return fmt.Errorf("hash password: %w", err) } _, err = s.db.Exec( `INSERT INTO signup_requests (username, password_hash) VALUES (?, ?)`, username, hash, ) if err != nil { if strings.Contains(err.Error(), "UNIQUE constraint failed") { return ErrSignupRequestExists } return fmt.Errorf("insert signup request: %w", err) } return nil } // PendingCount returns the number of pending signup requests. func (s *SignupRequestStore) PendingCount() (int, error) { var n int err := s.db.QueryRow("SELECT COUNT(*) FROM signup_requests WHERE status = 'pending'").Scan(&n) return n, err }