From db82ad3364af25d193db6db257c448380c2e5eff Mon Sep 17 00:00:00 2001 From: Habib Fatkhul Rohman Date: Wed, 3 Dec 2025 11:43:00 +0700 Subject: [PATCH] feat: refactor configuration management to use viper for environment variables --- cmd/main.go | 12 ++++++++++-- config/database.go | 14 +++++++------- config/email.go | 1 + config/logger.go | 5 +++-- config/rabbitmq.go | 12 ++++++------ modules/auth/service/jwt_service.go | 4 ++-- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 4e4e60d..264ea7b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -33,6 +33,7 @@ import ( "github.com/Caknoooo/go-gin-clean-starter/modules/warehouse" "github.com/Caknoooo/go-gin-clean-starter/modules/zona" "github.com/sirupsen/logrus" + "github.com/spf13/viper" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" @@ -58,13 +59,13 @@ func args(injector *do.Injector) bool { func run(server *gin.Engine) { server.Static("/assets", "./assets") - port := os.Getenv("GOLANG_PORT") + port := viper.GetString("GOLANG_PORT") if port == "" { port = "8888" } var serve string - if os.Getenv("APP_ENV") == "localhost" { + if viper.GetString("APP_ENV") == "localhost" { serve = "0.0.0.0:" + port } else { serve = ":" + port @@ -102,6 +103,13 @@ func run(server *gin.Engine) { // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func main() { + viper.SetConfigFile(".env") + + err := viper.ReadInConfig() + if err != nil { + log.Fatal("Error loading .env file") + } + viper.AutomaticEnv() var ( injector = do.New() diff --git a/config/database.go b/config/database.go index 31e24c3..3a523e8 100644 --- a/config/database.go +++ b/config/database.go @@ -2,10 +2,10 @@ package config import ( "fmt" - "os" "github.com/Caknoooo/go-gin-clean-starter/pkg/constants" "github.com/joho/godotenv" + "github.com/spf13/viper" "gorm.io/driver/postgres" "gorm.io/gorm" ) @@ -15,18 +15,18 @@ func RunExtension(db *gorm.DB) { } func SetUpDatabaseConnection() *gorm.DB { - if os.Getenv("APP_ENV") != constants.ENUM_RUN_PRODUCTION { + if viper.GetString("APP_ENV") != constants.ENUM_RUN_PRODUCTION { err := godotenv.Load(".env") if err != nil { panic(err) } } - dbUser := os.Getenv("DB_USER") - dbPass := os.Getenv("DB_PASS") - dbHost := os.Getenv("DB_HOST") - dbName := os.Getenv("DB_NAME") - dbPort := os.Getenv("DB_PORT") + dbUser := viper.GetString("DB_USER") + dbPass := viper.GetString("DB_PASS") + dbHost := viper.GetString("DB_HOST") + dbName := viper.GetString("DB_NAME") + dbPort := viper.GetString("DB_PORT") dsn := fmt.Sprintf("host=%v user=%v password=%v dbname=%v port=%v", dbHost, dbUser, dbPass, dbName, dbPort) diff --git a/config/email.go b/config/email.go index d5692cc..1c5c24e 100644 --- a/config/email.go +++ b/config/email.go @@ -14,6 +14,7 @@ type EmailConfig struct { func NewEmailConfig() (*EmailConfig, error) { viper.SetConfigFile(".env") + if err := viper.ReadInConfig(); err != nil { return nil, err diff --git a/config/logger.go b/config/logger.go index 44dc55e..4822107 100644 --- a/config/logger.go +++ b/config/logger.go @@ -11,6 +11,7 @@ import ( amqp "github.com/rabbitmq/amqp091-go" "github.com/sirupsen/logrus" + "github.com/spf13/viper" "gorm.io/gorm/logger" ) @@ -70,12 +71,12 @@ func SetupLoggerLogrus() *logrus.Logger { // ✔️ Pasang RabbitMQ Hook kalau channel berhasil connect if RabbitChannel != nil { - queue := os.Getenv("RABBITMQ_LOG_QUEUE") // contoh: log_queue + queue := viper.GetString("RABBITMQ_LOG_QUEUE") // contoh: log_queue hook := NewRabbitMQHook(RabbitChannel, queue) logger.AddHook(hook) } - logLevel := strings.ToLower(os.Getenv("LOG_LEVEL")) + logLevel := strings.ToLower(viper.GetString("LOG_LEVEL")) if logLevel == "production" { logger.SetLevel(logrus.WarnLevel) } else { diff --git a/config/rabbitmq.go b/config/rabbitmq.go index 48d9934..4add9d0 100644 --- a/config/rabbitmq.go +++ b/config/rabbitmq.go @@ -3,20 +3,20 @@ package config import ( "fmt" "log" - "os" amqp "github.com/rabbitmq/amqp091-go" + "github.com/spf13/viper" ) var RabbitConn *amqp.Connection var RabbitChannel *amqp.Channel func InitRabbitMQ() { - host := os.Getenv("RABBITMQ_HOST") - port := os.Getenv("RABBITMQ_PORT") - user := os.Getenv("RABBITMQ_USER") - pass := os.Getenv("RABBITMQ_PASSWORD") - queue := os.Getenv("RABBITMQ_LOG_QUEUE") // contoh: log_queue + host := viper.GetString("RABBITMQ_HOST") + port := viper.GetString("RABBITMQ_PORT") + user := viper.GetString("RABBITMQ_USER") + pass := viper.GetString("RABBITMQ_PASSWORD") + queue := viper.GetString("RABBITMQ_LOG_QUEUE") // contoh: log_queue uri := fmt.Sprintf("amqp://%s:%s@%s:%s/", user, pass, host, port, diff --git a/modules/auth/service/jwt_service.go b/modules/auth/service/jwt_service.go index 93a89d6..3ca8287 100644 --- a/modules/auth/service/jwt_service.go +++ b/modules/auth/service/jwt_service.go @@ -5,10 +5,10 @@ import ( "encoding/base64" "fmt" "log" - "os" "time" "github.com/golang-jwt/jwt/v4" + "github.com/spf13/viper" ) type UserTokenInfo struct { @@ -51,7 +51,7 @@ func NewJWTService() JWTService { } func getSecretKey() string { - secretKey := os.Getenv("JWT_SECRET") + secretKey := viper.GetString("JWT_SECRET") if secretKey == "" { secretKey = "WMS-WareifySecretKey" }