fix:update feature-flag - enable database

This commit is contained in:
ulflow_phattt2901 2025-06-06 12:49:18 +07:00
parent 0a7b336cca
commit 188ebf853c
6 changed files with 114 additions and 106 deletions

View File

@ -106,7 +106,7 @@ docker-compose-up:
# Stop Docker Compose services for local development
docker-compose-down:
@echo "Stopping all development services..."
docker-compose down
docker-compose down -v
# Run Docker Compose for production
docker-compose-prod-up:

View File

@ -24,10 +24,14 @@ type HTTPService struct {
}
func NewHTTPService(cfg *config.Config, db *database.Database) *HTTPService {
var gormDB *gorm.DB
if db != nil {
gormDB = db.DB
}
return &HTTPService{
server: http.NewServer(cfg, db.DB),
server: http.NewServer(cfg, gormDB), // gormDB can be nil here
cfg: cfg,
db: db,
db: db, // db itself (the *database.Database wrapper) can also be nil
}
}
@ -108,26 +112,44 @@ func main() {
}
lifecycleMgr := lifecycle.New(shutdownTimeout)
var gormDB *gorm.DB // Declare gormDB for database connection
var dbInstance *database.Database // Declare dbInstance for HTTPService and other potential users
if feature.IsEnabled(feature.EnableDatabase) {
logger.Info("Feature flag 'enable_database' is true. Initializing database connection...")
// Initialize database connection
db, err := database.NewConnection(&cfg.Database)
if err != nil {
logger.WithError(err).Fatal("Failed to connect to database")
var dbErr error
gormDB, dbErr = database.NewConnection(&cfg.Database)
if dbErr != nil {
logger.WithError(dbErr).Fatal("Failed to connect to database")
}
// Run database migrations
if err := database.Migrate(cfg.Database); err != nil {
if err := database.Migrate(cfg.Database); err != nil { // Migrate still needs cfg.Database for path etc.
logger.WithError(err).Fatal("Failed to migrate database")
}
// Register database cleanup on shutdown
lifecycleMgr.Register(&databaseService{db: db})
lifecycleMgr.Register(&databaseService{db: gormDB})
// Initialize HTTP service with database
httpService := NewHTTPService(cfg, &database.Database{DB: db})
// Prepare dbInstance for HTTPService
dbInstance = &database.Database{DB: gormDB, Config: &cfg.Database}
} else {
logger.Info("Feature flag 'enable_database' is false. Skipping database initialization.")
// gormDB remains nil
// dbInstance remains nil
// No databaseService is registered with lifecycleMgr if DB is disabled.
}
// Initialize HTTP service
// NewHTTPService and its chain (http.NewServer, http.SetupRouter)
// must be able to handle a nil dbInstance or a dbInstance with a nil DB.
// The NewHTTPService function already checks if its db argument (or db.DB) is nil.
httpService := NewHTTPService(cfg, dbInstance) // dbInstance can be nil here
if httpService == nil {
logger.Fatal("Failed to create HTTP service")
}
lifecycleMgr.Register(httpService)
lifecycleMgr.Register(httpService) // HTTP service is always registered
// Start all services
logger.Info("Đang khởi động các dịch vụ...")

View File

@ -19,11 +19,11 @@ server:
database:
driver: "postgres"
host: "localhost"
host: "postgres"
port: 5432
username: "postgres"
password: "postgres"
database: "ulflow"
database: "ulflow_zee"
ssl_mode: "disable"
max_open_conns: 25
max_idle_conns: 5

View File

@ -26,58 +26,30 @@ services:
container_name: ulflow-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USER:-user}
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
POSTGRES_DB: ${DB_NAME:-ulflow_db}
POSTGRES_USER: postgres
POSTGRES_PASSWORD: Minhtuyen0605
POSTGRES_DB: ulflow_zee
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- ulflow-network
# Gitea (Git Server, CI/CD, Registry)
gitea:
image: gitea/gitea:1.21
container_name: ulflow-gitea
adminer:
image: adminer:latest # Hoặc adminer:4.8.1 (chọn phiên bản cụ thể nếu muốn)
container_name: ulflow-adminer
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=postgres:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=${DB_USER:-user}
- GITEA__database__PASSWD=${DB_PASSWORD:-password}
ports:
- "3001:3000"
- "2222:22"
volumes:
- gitea-data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- "8080:8080" # Ánh xạ cổng 8080 của container ra cổng 8080 của host
environment:
ADMINER_DEFAULT_SERVER: postgres # Tên service của PostgreSQL trong Docker Compose
depends_on:
- postgres
networks:
- ulflow-network
# Gitea Runner for CI/CD
gitea-runner:
image: gitea/act_runner:latest
container_name: ulflow-gitea-runner
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- gitea-runner-data:/data
depends_on:
- gitea
- postgres # Đảm bảo postgres khởi động trước adminer
networks:
- ulflow-network
volumes:
postgres-data:
gitea-data:
gitea-runner-data:
go-modules:
networks:

View File

@ -107,6 +107,7 @@ func (l *ViperConfigLoader) loadEnvFile(v *viper.Viper) error {
if err := os.Setenv(key, val); err != nil {
return fmt.Errorf("failed to set environment variable %s: %w", key, err)
}
fmt.Println("Loaded environment variable:", key, "=", val)
}
return nil

View File

@ -4,6 +4,7 @@ import (
"time"
"zee/internal/adapter/postgres"
"zee/internal/helper/config"
"zee/internal/helper/logger" // Added logger import
"zee/internal/service"
"zee/internal/transport/http/handler"
"zee/internal/transport/http/middleware"
@ -31,6 +32,16 @@ func SetupRouter(cfg *config.Config, db *gorm.DB) *gin.Engine {
securityCfg := middleware.DefaultSecurityConfig()
securityCfg.Apply(router)
// Khởi tạo các handlers không phụ thuộc DB
healthHandler := handler.NewHealthHandler(cfg)
// Đăng ký các routes không phụ thuộc DB
router.GET("/ping", healthHandler.Ping)
router.GET("/health", healthHandler.HealthCheck)
// Các thành phần và routes phụ thuộc vào DB
if db != nil {
logger.Info("Database connection is available. Initializing DB-dependent services and routes...")
// Khởi tạo repositories
userRepo := postgres.NewUserRepository(db)
roleRepo := postgres.NewRoleRepository(db)
@ -57,18 +68,10 @@ func SetupRouter(cfg *config.Config, db *gorm.DB) *gin.Engine {
// Khởi tạo middleware
authMiddleware := middleware.NewAuthMiddleware(authSvc)
_ = authMiddleware // TODO: Use authMiddleware when needed
// Khởi tạo các handlers
healthHandler := handler.NewHealthHandler(cfg)
// Khởi tạo các handlers phụ thuộc DB
authHandler := handler.NewAuthHandler(authSvc)
// Đăng ký các routes
// Health check routes (public)
router.GET("/ping", healthHandler.Ping)
router.GET("/health", healthHandler.HealthCheck)
// Auth routes (public)
authGroup := router.Group("/api/v1/auth")
{
@ -86,6 +89,16 @@ func SetupRouter(cfg *config.Config, db *gorm.DB) *gin.Engine {
// api.GET("/profile", userHandler.GetProfile)
// api.PUT("/profile", userHandler.UpdateProfile)
}
} else {
logger.Info("Database is disabled via feature flag or connection failed. DB-dependent routes (e.g., /api/v1/auth, /api/v1/*) will not be available.")
// Optionally, register placeholder routes that return 503 Service Unavailable
// router.Any("/api/v1/auth/*any", func(c *gin.Context) {
// c.JSON(http.StatusServiceUnavailable, gin.H{"error": "Authentication service is currently disabled"})
// })
// router.Any("/api/v1/*any", func(c *gin.Context) {
// c.JSON(http.StatusServiceUnavailable, gin.H{"error": "API service is currently disabled due to database unavailability"})
// })
}
return router
}