From bcc3aadb85bf6135c149380b04914808dfbec1eb Mon Sep 17 00:00:00 2001 From: Jean Jacques Avril Date: Mon, 31 Mar 2025 19:11:38 +0000 Subject: [PATCH] refactor: move JWTConfig to config package and update database initialization methods --- backend/internal/api/middleware/jwt_auth.go | 2 +- backend/internal/models/db.go | 98 ++++++++------------- backend/internal/models/jwt.go | 13 +-- 3 files changed, 41 insertions(+), 72 deletions(-) diff --git a/backend/internal/api/middleware/jwt_auth.go b/backend/internal/api/middleware/jwt_auth.go index 7fc68ba..a40fd1c 100644 --- a/backend/internal/api/middleware/jwt_auth.go +++ b/backend/internal/api/middleware/jwt_auth.go @@ -73,7 +73,7 @@ func fileExists(path string) bool { } // generateRSAKeys generates RSA keys and saves them to disk -func generateRSAKeys(cfg models.JWTConfig) error { +func generateRSAKeys(cfg config.JWTConfig) error { // Create key directory if it doesn't exist if err := os.MkdirAll(cfg.KeyDir, 0700); err != nil { return fmt.Errorf("failed to create key directory: %w", err) diff --git a/backend/internal/models/db.go b/backend/internal/models/db.go index c72aa68..2aca1c7 100644 --- a/backend/internal/models/db.go +++ b/backend/internal/models/db.go @@ -9,54 +9,25 @@ import ( "strings" "time" - "github.com/timetracker/backend/internal/permissions" // For PostgreSQL + "github.com/timetracker/backend/internal/config" + "github.com/timetracker/backend/internal/db" + "github.com/timetracker/backend/internal/permissions" + "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) -// Global variable for the DB connection -var defaultDB *gorm.DB - -// DatabaseConfig contains the configuration data for the database connection -type DatabaseConfig struct { - Host string - Port int - User string - Password string - DBName string - SSLMode string - MaxIdleConns int // Maximum number of idle connections - MaxOpenConns int // Maximum number of open connections - MaxLifetime time.Duration // Maximum lifetime of a connection - LogLevel logger.LogLevel -} - -// DefaultDatabaseConfig returns a default configuration with sensible values -func DefaultDatabaseConfig() DatabaseConfig { - return DatabaseConfig{ - Host: "localhost", - Port: 5432, - User: "timetracker", - Password: "password", - DBName: "timetracker", - SSLMode: "disable", - MaxIdleConns: 10, - MaxOpenConns: 100, - MaxLifetime: time.Hour, - LogLevel: logger.Info, - } -} - // MigrateDB performs database migrations for all models func MigrateDB() error { - if defaultDB == nil { + gormDB := db.GetEngine(context.Background()) + if gormDB == nil { return errors.New("database not initialized") } log.Println("Starting database migration...") // Add all models that should be migrated here - err := defaultDB.AutoMigrate( + err := gormDB.AutoMigrate( &Company{}, &User{}, &Customer{}, @@ -75,33 +46,31 @@ func MigrateDB() error { return nil } -// GetGormDB is no longer needed, as we use db.InitDB and db.GetEngine -/* -func GetGormDB(dbConfig DatabaseConfig, dbName string) (*gorm.DB, error) { - dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", - dbConfig.Host, dbConfig.Port, dbConfig.User, dbConfig.Password, dbName, dbConfig.SSLMode) +// GetGormDB is used for special cases like database creation +func GetGormDB(dbConfig config.DatabaseConfig, dbName string) (*gorm.DB, error) { + dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", + dbConfig.Host, dbConfig.Port, dbConfig.User, dbConfig.Password, dbName, dbConfig.SSLMode) - // Configure GORM logger - gormLogger := logger.New( - log.New(log.Writer(), "\r\n", log.LstdFlags), // io writer - logger.Config{ - SlowThreshold: 200 * time.Millisecond, // Slow SQL threshold - LogLevel: dbConfig.LogLevel, // Log level - IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger - Colorful: true, // Enable color - }, - ) + // Configure GORM logger + gormLogger := logger.New( + log.New(log.Writer(), "\r\n", log.LstdFlags), // io writer + logger.Config{ + SlowThreshold: 200 * time.Millisecond, // Slow SQL threshold + LogLevel: dbConfig.LogLevel, // Log level + IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + Colorful: true, // Enable color + }, + ) - db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ - Logger: gormLogger, - }) - if err != nil { - return nil, fmt.Errorf("error connecting to the database: %w", err) - } + db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ + Logger: gormLogger, + }) + if err != nil { + return nil, fmt.Errorf("error connecting to the database: %w", err) + } - return db, nil + return db, nil } -*/ // UpdateModel updates a model based on the set pointer fields func UpdateModel(ctx context.Context, model any, updates any) error { @@ -160,5 +129,14 @@ func UpdateModel(ctx context.Context, model any, updates any) error { return nil // Nothing to update } - return defaultDB.WithContext(ctx).Model(model).Updates(updateMap).Error + return db.GetEngine(ctx).Model(model).Updates(updateMap).Error +} + +// InitDB and CloseDB are forwarded to the db package for backward compatibility +func InitDB(config config.DatabaseConfig) error { + return db.InitDB(config) +} + +func CloseDB() error { + return db.CloseDB() } diff --git a/backend/internal/models/jwt.go b/backend/internal/models/jwt.go index 239a854..9bea0dd 100644 --- a/backend/internal/models/jwt.go +++ b/backend/internal/models/jwt.go @@ -1,13 +1,4 @@ package models -import "time" - -type JWTConfig struct { - Secret string `env:"JWT_SECRET" default:""` - TokenDuration time.Duration `env:"JWT_TOKEN_DURATION" default:"24h"` - KeyGenerate bool `env:"JWT_KEY_GENERATE" default:"true"` - KeyDir string `env:"JWT_KEY_DIR" default:"./keys"` - PrivKeyFile string `env:"JWT_PRIV_KEY_FILE" default:"jwt.key"` - PubKeyFile string `env:"JWT_PUB_KEY_FILE" default:"jwt.key.pub"` - KeyBits int `env:"JWT_KEY_BITS" default:"2048"` -} +// This file is intentionally left empty. +// The JWTConfig struct has been moved to the config package.