// Package db : connexion GORM (PostgreSQL) et migrations. package db import ( "fmt" "time" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" "github.com/omnex/control-plane/api/internal/auth" "github.com/omnex/control-plane/api/internal/demos" "github.com/omnex/control-plane/api/internal/projects" "github.com/omnex/control-plane/api/internal/sub" ) // Open ouvre une connexion GORM vers PostgreSQL et configure le pool. func Open(dsn string) (*gorm.DB, error) { gdb, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Warn), SkipDefaultTransaction: true, PrepareStmt: true, // requêtes préparées : perf + anti-injection }) if err != nil { return nil, fmt.Errorf("ouverture db: %w", err) } sqlDB, err := gdb.DB() if err != nil { return nil, err } sqlDB.SetMaxOpenConns(20) sqlDB.SetMaxIdleConns(5) sqlDB.SetConnMaxLifetime(time.Hour) return gdb, nil } // AutoMigrate crée/actualise le schéma des entités du control-plane. func AutoMigrate(gdb *gorm.DB) error { return gdb.AutoMigrate( &auth.User{}, &sub.CodeBuySub{}, &demos.Demo{}, &demos.ExternalResource{}, &projects.Project{}, ) } // SeedExternalPool remplit le pool de ressources externes (idempotent). func SeedExternalPool(gdb *gorm.DB) error { return demos.SeedPool(gdb) }