// Path: Backend/internal/database/postgres.go package database import ( "context" "time" "boostai-backend/db" "github.com/jackc/pgx/v5/pgxpool" "github.com/jackc/pgx/v5/stdlib" "github.com/pressly/goose/v3" ) type DB struct { Pool *pgxpool.Pool } func NewPostgres(databaseURL string) (*DB, error) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() config, err := pgxpool.ParseConfig(databaseURL) if err != nil { return nil, err } config.MaxConns = 25 config.MinConns = 5 config.MaxConnLifetime = time.Hour config.MaxConnIdleTime = 30 * time.Minute pool, err := pgxpool.NewWithConfig(ctx, config) if err != nil { return nil, err } if err := pool.Ping(ctx); err != nil { pool.Close() return nil, err } return &DB{Pool: pool}, nil } func (d *DB) Migrate() error { sqlDB := stdlib.OpenDBFromPool(d.Pool) goose.SetBaseFS(db.Migrations) if err := goose.SetDialect("postgres"); err != nil { return err } return goose.Up(sqlDB, "migrations") } func (d *DB) Close() { d.Pool.Close() } func (d *DB) Health(ctx context.Context) error { return d.Pool.Ping(ctx) }