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