package helpers import ( "database/sql" "fmt" "os" "path/filepath" "sync" "time" _ "github.com/mattn/go-sqlite3" ) var ( db *sql.DB dbOnce sync.Once ) func InitSuggestionDB() (*sql.DB, error) { var err error dbOnce.Do(func() { // Create data directory if it doesn't exist dataDir := "data" if err = os.MkdirAll(dataDir, 0755); err != nil { return } dbPath := filepath.Join(dataDir, "suggestions.db") db, err = sql.Open("sqlite3", dbPath) if err != nil { return } // Create table if it doesn't exist _, err = db.Exec(` CREATE TABLE IF NOT EXISTS suggestion_cooldowns ( user_id TEXT PRIMARY KEY, last_submission TIMESTAMP ) `) }) return db, err } func GetLastSubmission(userID string) (time.Time, error) { var lastSubmission time.Time err := db.QueryRow(` SELECT last_submission FROM suggestion_cooldowns WHERE user_id = ? `, userID).Scan(&lastSubmission) if err == sql.ErrNoRows { return time.Time{}, nil // No record exists } return lastSubmission, err } func SetLastSubmission(userID string) error { _, err := db.Exec(` INSERT OR REPLACE INTO suggestion_cooldowns (user_id, last_submission) VALUES (?, ?) `, userID, time.Now()) return err } func RemoveUserSubmittions(userId string) error { _, err := db.Exec(` DELETE FROM suggestion_cooldowns WHERE user_id = ? `, userId) return err } func SweepExpiredSubmissions(expiration time.Duration) error { cutoff := time.Now().Add(-expiration) result, err := db.Exec("DELETE FROM suggestion_cooldowns WHERE last_submission <= ?", cutoff) if err != nil { return fmt.Errorf("failed to sweep expired submissions: %w", err) } rowsDeleted, _ := result.RowsAffected() fmt.Printf("Swept %d expired entries from suggestion_cooldowns\n", rowsDeleted) return nil } func CloseDB() error { if db != nil { return db.Close() } return nil }