initial commit. Cloned timetracker repository
This commit is contained in:
109
app/db/postgres.go
Normal file
109
app/db/postgres.go
Normal file
@@ -0,0 +1,109 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"log/slog"
|
||||
|
||||
"git.ma-al.com/goc_marek/timetracker/app/config"
|
||||
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
var DB *gorm.DB
|
||||
|
||||
func init() {
|
||||
if DB == nil {
|
||||
dbconn, err := newPostgresDB(&config.Get().Database)
|
||||
if err != nil {
|
||||
slog.Error("⚠️ No connection to database was possible to establish", "error", err.Error())
|
||||
}
|
||||
DB = dbconn
|
||||
}
|
||||
}
|
||||
|
||||
func Get() *gorm.DB {
|
||||
return DB
|
||||
}
|
||||
|
||||
// newPostgresDB creates a new PostgreSQL database connection
|
||||
func newPostgresDB(cfg *config.DatabaseConfig) (*gorm.DB, error) {
|
||||
dsn := cfg.GetDSN()
|
||||
|
||||
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Error),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to connect to database: %w", err)
|
||||
}
|
||||
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get database instance: %w", err)
|
||||
}
|
||||
|
||||
// Connection pool settings
|
||||
sqlDB.SetMaxIdleConns(cfg.MaxIdleConns)
|
||||
sqlDB.SetMaxOpenConns(cfg.MaxOpenConns)
|
||||
sqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)
|
||||
|
||||
log.Println("✓ Database connection established successfully")
|
||||
return db, nil
|
||||
}
|
||||
|
||||
// // RunMigrations runs all database migrations
|
||||
// func RunMigrations() error {
|
||||
// if DB == nil {
|
||||
// return fmt.Errorf("database connection not established")
|
||||
// }
|
||||
|
||||
// log.Println("Running database migrations...")
|
||||
|
||||
// // Add your models here for AutoMigrate
|
||||
// // Example: err := db.AutoMigrate(&model.Customer{})
|
||||
|
||||
// err := DB.AutoMigrate(&model.Customer{})
|
||||
// if err != nil {
|
||||
// return fmt.Errorf("failed to run migrations: %w", err)
|
||||
// }
|
||||
|
||||
// log.Println("✓ Database migrations completed successfully")
|
||||
|
||||
// return nil
|
||||
// }
|
||||
|
||||
// // SeedAdminUser creates a default admin user if one doesn't exist
|
||||
// // Call this function with admin credentials after migrations
|
||||
// func SeedAdminUser(adminEmail, adminPassword string) error {
|
||||
// log.Println("✓ Admin seeding ready - implement with your User model")
|
||||
|
||||
// // Example implementation when you have a User model:
|
||||
// // var count int64
|
||||
// // db.Model(&model.User{}).Where("role = ?", "admin").Count(&count)
|
||||
// // if count > 0 {
|
||||
// // log.Println("✓ Admin user already exists")
|
||||
// // return nil
|
||||
// // }
|
||||
// // hashedPassword, err := bcrypt.GenerateFromPassword([]byte(adminPassword), bcrypt.DefaultCost)
|
||||
// // if err != nil {
|
||||
// // return fmt.Errorf("failed to hash password: %w", err)
|
||||
// // }
|
||||
// // admin := model.User{
|
||||
// // Email: adminEmail,
|
||||
// // Password: string(hashedPassword),
|
||||
// // Role: "admin",
|
||||
// // IsActive: true,
|
||||
// // }
|
||||
// // if err := db.Create(&admin).Error; err != nil {
|
||||
// // return err
|
||||
// // }
|
||||
// // log.Printf("✓ Created admin user: %s", adminEmail)
|
||||
|
||||
// // Suppress unused variable warning
|
||||
// _, _ = bcrypt.GenerateFromPassword([]byte(adminPassword), bcrypt.DefaultCost)
|
||||
|
||||
// return nil
|
||||
// }
|
||||
Reference in New Issue
Block a user