76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
// Command seed-registry inserts the real preset tag IDs from
|
|
// db/preset_tag_ids.txt into the tags table (the anti-scam registry).
|
|
// Idempotent: already-existing IDs are skipped.
|
|
// Usage: go run ./cmd/seed-registry -registry ../db/preset_tag_ids.txt
|
|
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/jackc/pgx/v5/pgconn"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
"wherewoof/frontend/internal/db"
|
|
)
|
|
|
|
func main() {
|
|
registryPath := flag.String("registry", "../db/preset_tag_ids.txt", "path to preset tag ID file")
|
|
flag.Parse()
|
|
|
|
dsn := os.Getenv("DATABASE_URL")
|
|
if dsn == "" {
|
|
fmt.Fprintln(os.Stderr, "error: DATABASE_URL not set")
|
|
os.Exit(1)
|
|
}
|
|
|
|
f, err := os.Open(*registryPath)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error opening registry:", err)
|
|
os.Exit(1)
|
|
}
|
|
defer f.Close()
|
|
|
|
ctx := context.Background()
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "connect:", err)
|
|
os.Exit(1)
|
|
}
|
|
defer pool.Close()
|
|
|
|
q := db.New(pool)
|
|
seeded, skipped, errs := 0, 0, 0
|
|
sc := bufio.NewScanner(f)
|
|
for sc.Scan() {
|
|
line := strings.TrimSpace(sc.Text())
|
|
if line == "" || strings.HasPrefix(line, "#") {
|
|
continue
|
|
}
|
|
if _, err := q.InsertTag(ctx, line); err != nil {
|
|
var pgErr *pgconn.PgError
|
|
if errors.As(err, &pgErr) && pgErr.Code == "23505" {
|
|
skipped++
|
|
continue
|
|
}
|
|
fmt.Fprintln(os.Stderr, "insert", line, ":", err)
|
|
errs++
|
|
continue
|
|
}
|
|
seeded++
|
|
}
|
|
if err := sc.Err(); err != nil {
|
|
fmt.Fprintln(os.Stderr, "read:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("registry seed: %d inserted, %d already existed, %d errors\n", seeded, skipped, errs)
|
|
if errs > 0 {
|
|
os.Exit(1)
|
|
}
|
|
}
|