diff --git a/db/conn.go b/db/conn.go new file mode 100644 index 0000000..099594c --- /dev/null +++ b/db/conn.go @@ -0,0 +1,120 @@ +package db + +import ( + "fmt" + "os" + "time" + + "git.secnex.io/secnex/idp-api/models" + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +// Global database instance +var DB *gorm.DB + +type Database struct { + Host string + Port string + User string + Password string + DBName string + SSLMode string + Conn *gorm.DB +} + +type DatabaseConnection struct { + DB *gorm.DB +} + +func NewDatabase(host, port, user, password, dbName, sslMode string) *Database { + return &Database{Host: host, Port: port, User: user, Password: password, DBName: dbName, SSLMode: sslMode} +} + +// InitializeDB initializes the global database connection with connection pooling +func InitializeDB() error { + // Get database configuration from environment variables + host := getEnv("DB_HOST", "10.2.1.2") + port := getEnv("DB_PORT", "5432") + user := getEnv("DB_USER", "postgres") + password := getEnv("DB_PASSWORD", "postgres") + dbName := getEnv("DB_NAME", "idp") + sslMode := getEnv("DB_SSLMODE", "disable") + + dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", + host, port, user, password, dbName, sslMode) + + // Configure GORM with connection pooling + config := &gorm.Config{ + Logger: logger.Default.LogMode(logger.Info), + } + + db, err := gorm.Open(postgres.Open(dsn), config) + if err != nil { + return fmt.Errorf("failed to connect to database: %w", err) + } + + // Configure connection pool + sqlDB, err := db.DB() + if err != nil { + return fmt.Errorf("failed to get underlying sql.DB: %w", err) + } + + // Set connection pool settings + sqlDB.SetMaxIdleConns(10) // Maximum number of idle connections + sqlDB.SetMaxOpenConns(100) // Maximum number of open connections + sqlDB.SetConnMaxLifetime(time.Hour) // Maximum lifetime of a connection + + // Auto migrate models + if err := db.AutoMigrate(&models.User{}, &models.Session{}, &models.ApiKey{}); err != nil { + return fmt.Errorf("failed to auto migrate: %w", err) + } + + // Set global database instance + DB = db + + return nil +} + +// GetDB returns the global database instance +func GetDB() *gorm.DB { + return DB +} + +// CloseDB closes the database connection +func CloseDB() error { + if DB != nil { + sqlDB, err := DB.DB() + if err != nil { + return err + } + return sqlDB.Close() + } + return nil +} + +// Helper function to get environment variables with fallback +func getEnv(key, fallback string) string { + if value := os.Getenv(key); value != "" { + return value + } + return fallback +} + +// Legacy methods for backward compatibility +func (d *Database) Connect() (*gorm.DB, error) { + dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", + d.Host, d.Port, d.User, d.Password, d.DBName, d.SSLMode) + + db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) + if err != nil { + return nil, err + } + + if err := db.AutoMigrate(&models.User{}, &models.Session{}, &models.ApiKey{}); err != nil { + return nil, err + } + + return db, nil +}