// internal/database/postgresql.go package database import ( "fmt" "log" "time" "go-server/internal/config" "gorm.io/driver/postgres" "gorm.io/gorm" ) type PostgresConfig struct { Host string Port string User string Password string DBName string SSLMode string } func NewPostgresConfig() PostgresConfig { cfg, err := config.LoadConfig() if err != nil { log.Fatalf("Failed to load postgres config: %v", err) } return PostgresConfig{ Host: cfg.Database.Host, Port: cfg.Database.Port, User: cfg.Database.User, Password: cfg.Database.Password, DBName: cfg.Database.Name, SSLMode: cfg.Database.SSLMode, } } func NewPostgresConnection(config PostgresConfig) (*gorm.DB, error) { dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=%s", config.Host, config.User, config.Password, config.DBName, config.Port, config.SSLMode) db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ PrepareStmt: true, SkipDefaultTransaction: true, // Logger can be enabled if needed for debugging // Logger: logger.Default.LogMode(logger.Info), }) if err != nil { return nil, fmt.Errorf("failed to connect to database: %w", err) } // Configure database/sql connection pool sqlDB, err := db.DB() if err == nil { sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(50) sqlDB.SetConnMaxLifetime(60 * time.Minute) sqlDB.SetConnMaxIdleTime(10 * time.Minute) } return db, nil }