diff --git a/core/database/database.go b/core/database/database.go index 3455ee29..8c639b65 100644 --- a/core/database/database.go +++ b/core/database/database.go @@ -50,9 +50,59 @@ func LoadDbConfig() { } } +// Ensure that the database exists; if not, create one. +func ensureDatabaseExists() error { + dsn := fmt.Sprintf("user=%s password=%s dbname=postgres host=%s port=%s sslmode=%s", + dbConfig.PsqlConf.User, + dbConfig.PsqlConf.Password, + dbConfig.PsqlConf.Host, + dbConfig.PsqlConf.Port, + dbConfig.PsqlConf.SslMode) + + db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) + if err != nil { + return fmt.Errorf("failed to connect to postgres database: %w", err) + } + + sqlDB, err := db.DB() + if err != nil { + return fmt.Errorf("failed to get underlying sql.DB: %w", err) + } + defer sqlDB.Close() + + // Check if database exists + var exists bool + result := db.Raw("SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname = ?)", + dbConfig.PsqlConf.Dbname).Scan(&exists) + + if result.Error != nil { + return fmt.Errorf("failed to check if database exists: %w", result.Error) + } + + if !exists { + log.Infof("Database '%s' does not exist. Creating...", dbConfig.PsqlConf.Dbname) + + // Create the database + createSQL := fmt.Sprintf("CREATE DATABASE %s", dbConfig.PsqlConf.Dbname) + if err := db.Exec(createSQL).Error; err != nil { + return fmt.Errorf("failed to create database: %w", err) + } + + log.Infof("Database '%s' created successfully.", dbConfig.PsqlConf.Dbname) + } + + return nil +} + // Connect psql database func ConnectDatabase() error { LoadDbConfig() + + // Check if the DB exists, if not, create it. + if err := ensureDatabaseExists(); err != nil { + log.Fatalf("failed to ensure database exists: %v", err) + } + dsn := fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%s sslmode=%s", dbConfig.PsqlConf.User, dbConfig.PsqlConf.Password, dbConfig.PsqlConf.Dbname, dbConfig.PsqlConf.Host, dbConfig.PsqlConf.Port, dbConfig.PsqlConf.SslMode) Db, dberr = gorm.Open(postgres.Open(dsn), &gorm.Config{}) if dberr != nil {