package database import ( "fmt" "time" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "github.com/sundynix/pets-be/internal/config" "github.com/sundynix/pets-be/internal/model" ) func Open(cfg config.PostgresConfig, release bool) (*gorm.DB, error) { logLevel := logger.Info if release { logLevel = logger.Warn } db, err := gorm.Open(postgres.Open(cfg.DSN()), &gorm.Config{ NamingStrategy: schema.NamingStrategy{TablePrefix: "sundynix_", SingularTable: true}, Logger: logger.Default.LogMode(logLevel), }) if err != nil { return nil, fmt.Errorf("open postgres: %w", err) } sqlDB, err := db.DB() if err != nil { return nil, err } sqlDB.SetMaxOpenConns(25) sqlDB.SetMaxIdleConns(10) sqlDB.SetConnMaxLifetime(time.Hour) return db, nil } func Migrate(db *gorm.DB) error { if err := db.AutoMigrate(model.All()...); err != nil { return err } return db.Exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_sundynix_walk_one_active_per_user ON sundynix_walk (user_id) WHERE status IN ('active', 'paused')").Error }