Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions cmd/sponsor-panel-drop-indexes/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package main

import (
"database/sql"
"flag"
"fmt"
"log"
"os"

"github.com/facebookgo/flagenv"
_ "github.com/jackc/pgx/v5/stdlib"
_ "github.com/joho/godotenv/autoload"
)

var databaseURL = flag.String("database-url", "", "Database URL")

func main() {
flagenv.Parse()
flag.Parse()

if *databaseURL == "" {
fmt.Fprintln(os.Stderr, "database-url is required")
os.Exit(1)
}

db, err := sql.Open("pgx", *databaseURL)
if err != nil {
log.Fatalf("failed to connect: %v", err)
}
defer db.Close()

if err := db.Ping(); err != nil {
log.Fatalf("failed to ping: %v", err)
}

statements := []string{
// Users table: drop constraints (unique indexes backed by constraints)
`ALTER TABLE users DROP CONSTRAINT IF EXISTS users_github_id_key`,
`ALTER TABLE users DROP CONSTRAINT IF EXISTS users_patreon_id_key`,
// Users table: drop plain indexes
`DROP INDEX IF EXISTS idx_users_github_id`,
`DROP INDEX IF EXISTS idx_users_login`,
`DROP INDEX IF EXISTS idx_users_patreon_id`,
`DROP INDEX IF EXISTS idx_users_provider_login`,
// Sponsor usernames table: drop constraint
`ALTER TABLE github_sponsor_usernames DROP CONSTRAINT IF EXISTS github_sponsor_usernames_username_key`,
// Sponsor usernames table: drop plain indexes
`DROP INDEX IF EXISTS idx_sponsor_active`,
`DROP INDEX IF EXISTS idx_sponsor_usernames`,
}

for _, stmt := range statements {
fmt.Printf(" %s\n", stmt)
if _, err := db.Exec(stmt); err != nil {
log.Fatalf("failed: %v", err)
}
}

fmt.Println("done — GORM AutoMigrate will recreate indexes on next startup")
}
2 changes: 1 addition & 1 deletion cmd/sponsor-panel/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ func (s *Server) logoHandler(w http.ResponseWriter, r *http.Request) {
GitHubIssueURL: createdIssue.GetHTMLURL(),
GitHubIssueNumber: createdIssue.GetNumber(),
}
if err := createLogoSubmission(r.Context(), s.pool, submission); err != nil {
if err := createLogoSubmission(s.db, submission); err != nil {
slog.Error("logoHandler: failed to store submission", "err", err, "user_id", user.ID, "issue_number", createdIssue.GetNumber())
} else {
slog.Debug("logoHandler: submission stored in database", "user_id", user.ID, "issue_number", createdIssue.GetNumber())
Expand Down
44 changes: 25 additions & 19 deletions cmd/sponsor-panel/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ import (
"github.com/facebookgo/flagenv"
gh "github.com/google/go-github/v82/github"
"github.com/gorilla/sessions"
"github.com/jackc/pgx/v5/pgxpool"
slogGorm "github.com/orandin/slog-gorm"
"gorm.io/driver/postgres"
"gorm.io/gorm"
gormPrometheus "gorm.io/plugin/prometheus"
_ "github.com/joho/godotenv/autoload"
patreon "gopkg.in/mxpv/patreon-go.v1"
"github.com/prometheus/client_golang/prometheus/promhttp"
Expand Down Expand Up @@ -60,7 +63,7 @@ var (

// Server holds the application dependencies.
type Server struct {
pool *pgxpool.Pool
db *gorm.DB
ghClient *gh.Client
oauth *oauth2.Config
patreonOAuth *oauth2.Config // nil if Patreon not configured
Expand Down Expand Up @@ -144,34 +147,37 @@ func main() {
os.Exit(1)
}

// Connect to database
slog.Debug("main: connecting to database")
ctx := context.Background()
pool, err := pgxpool.New(ctx, *databaseURL)
// Connect to database via GORM
slog.Debug("main: connecting to database via GORM")
db, err := gorm.Open(postgres.Open(*databaseURL), &gorm.Config{
Logger: slogGorm.New(
slogGorm.WithErrorField("err"),
slogGorm.WithRecordNotFoundError(),
),
})
if err != nil {
slog.Error("failed to create connection pool", "err", err)
slog.Error("failed to connect to database", "err", err)
os.Exit(1)
}
defer pool.Close()

if err := pool.Ping(ctx); err != nil {
slog.Error("failed to ping database", "err", err)
os.Exit(1)
}
db.Use(gormPrometheus.New(gormPrometheus.Config{
DBName: "sponsor_panel",
}))

slog.Info("main: database connection established")

// Run migrations
slog.Debug("main: running migrations")
if err := runMigrations(ctx, pool); err != nil {
slog.Error("failed to run migrations", "err", err)
// Run GORM AutoMigrate
slog.Debug("main: running GORM auto-migration")
if err := db.AutoMigrate(PanelModels()...); err != nil {
slog.Error("failed to auto-migrate", "err", err)
os.Exit(1)
}
slog.Info("main: migrations completed")
slog.Info("main: auto-migration completed")

// Start sponsor sync loop in background
syncCtx, syncCancel := context.WithCancel(context.Background())
defer syncCancel()
go startSyncLoop(syncCtx, pool, *githubToken)
go startSyncLoop(syncCtx, db, *githubToken)
slog.Info("main: sponsor sync loop started")

// Create GitHub client
Expand Down Expand Up @@ -255,7 +261,7 @@ func main() {
}

server := &Server{
pool: pool,
db: db,
ghClient: ghClient,
oauth: oauthConfig,
patreonOAuth: patreonConfig,
Expand Down
103 changes: 0 additions & 103 deletions cmd/sponsor-panel/migrations.go

This file was deleted.

Loading
Loading