feat: add database connection and configuration
- Add PostgreSQL database connection setup with GORM - Include database initialization and migration functionality - Add connection pooling and error handling - Support for environment-based database configuration
This commit is contained in:
120
db/conn.go
Normal file
120
db/conn.go
Normal file
@@ -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
|
||||
}
|
Reference in New Issue
Block a user