feat: refactor configuration management to use viper for environment variables

This commit is contained in:
Habib Fatkhul Rohman 2025-12-03 11:43:00 +07:00
parent 95323b9f65
commit db82ad3364
6 changed files with 29 additions and 19 deletions

View File

@ -33,6 +33,7 @@ import (
"github.com/Caknoooo/go-gin-clean-starter/modules/warehouse" "github.com/Caknoooo/go-gin-clean-starter/modules/warehouse"
"github.com/Caknoooo/go-gin-clean-starter/modules/zona" "github.com/Caknoooo/go-gin-clean-starter/modules/zona"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/viper"
swaggerFiles "github.com/swaggo/files" swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger" ginSwagger "github.com/swaggo/gin-swagger"
@ -58,13 +59,13 @@ func args(injector *do.Injector) bool {
func run(server *gin.Engine) { func run(server *gin.Engine) {
server.Static("/assets", "./assets") server.Static("/assets", "./assets")
port := os.Getenv("GOLANG_PORT") port := viper.GetString("GOLANG_PORT")
if port == "" { if port == "" {
port = "8888" port = "8888"
} }
var serve string var serve string
if os.Getenv("APP_ENV") == "localhost" { if viper.GetString("APP_ENV") == "localhost" {
serve = "0.0.0.0:" + port serve = "0.0.0.0:" + port
} else { } else {
serve = ":" + port serve = ":" + port
@ -102,6 +103,13 @@ func run(server *gin.Engine) {
// @externalDocs.description OpenAPI // @externalDocs.description OpenAPI
// @externalDocs.url https://swagger.io/resources/open-api/ // @externalDocs.url https://swagger.io/resources/open-api/
func main() { func main() {
viper.SetConfigFile(".env")
err := viper.ReadInConfig()
if err != nil {
log.Fatal("Error loading .env file")
}
viper.AutomaticEnv()
var ( var (
injector = do.New() injector = do.New()

View File

@ -2,10 +2,10 @@ package config
import ( import (
"fmt" "fmt"
"os"
"github.com/Caknoooo/go-gin-clean-starter/pkg/constants" "github.com/Caknoooo/go-gin-clean-starter/pkg/constants"
"github.com/joho/godotenv" "github.com/joho/godotenv"
"github.com/spf13/viper"
"gorm.io/driver/postgres" "gorm.io/driver/postgres"
"gorm.io/gorm" "gorm.io/gorm"
) )
@ -15,18 +15,18 @@ func RunExtension(db *gorm.DB) {
} }
func SetUpDatabaseConnection() *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") err := godotenv.Load(".env")
if err != nil { if err != nil {
panic(err) panic(err)
} }
} }
dbUser := os.Getenv("DB_USER") dbUser := viper.GetString("DB_USER")
dbPass := os.Getenv("DB_PASS") dbPass := viper.GetString("DB_PASS")
dbHost := os.Getenv("DB_HOST") dbHost := viper.GetString("DB_HOST")
dbName := os.Getenv("DB_NAME") dbName := viper.GetString("DB_NAME")
dbPort := os.Getenv("DB_PORT") dbPort := viper.GetString("DB_PORT")
dsn := fmt.Sprintf("host=%v user=%v password=%v dbname=%v port=%v", dbHost, dbUser, dbPass, dbName, dbPort) dsn := fmt.Sprintf("host=%v user=%v password=%v dbname=%v port=%v", dbHost, dbUser, dbPass, dbName, dbPort)

View File

@ -15,6 +15,7 @@ type EmailConfig struct {
func NewEmailConfig() (*EmailConfig, error) { func NewEmailConfig() (*EmailConfig, error) {
viper.SetConfigFile(".env") viper.SetConfigFile(".env")
if err := viper.ReadInConfig(); err != nil { if err := viper.ReadInConfig(); err != nil {
return nil, err return nil, err
} }

View File

@ -11,6 +11,7 @@ import (
amqp "github.com/rabbitmq/amqp091-go" amqp "github.com/rabbitmq/amqp091-go"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/viper"
"gorm.io/gorm/logger" "gorm.io/gorm/logger"
) )
@ -70,12 +71,12 @@ func SetupLoggerLogrus() *logrus.Logger {
// ✔️ Pasang RabbitMQ Hook kalau channel berhasil connect // ✔️ Pasang RabbitMQ Hook kalau channel berhasil connect
if RabbitChannel != nil { 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) hook := NewRabbitMQHook(RabbitChannel, queue)
logger.AddHook(hook) logger.AddHook(hook)
} }
logLevel := strings.ToLower(os.Getenv("LOG_LEVEL")) logLevel := strings.ToLower(viper.GetString("LOG_LEVEL"))
if logLevel == "production" { if logLevel == "production" {
logger.SetLevel(logrus.WarnLevel) logger.SetLevel(logrus.WarnLevel)
} else { } else {

View File

@ -3,20 +3,20 @@ package config
import ( import (
"fmt" "fmt"
"log" "log"
"os"
amqp "github.com/rabbitmq/amqp091-go" amqp "github.com/rabbitmq/amqp091-go"
"github.com/spf13/viper"
) )
var RabbitConn *amqp.Connection var RabbitConn *amqp.Connection
var RabbitChannel *amqp.Channel var RabbitChannel *amqp.Channel
func InitRabbitMQ() { func InitRabbitMQ() {
host := os.Getenv("RABBITMQ_HOST") host := viper.GetString("RABBITMQ_HOST")
port := os.Getenv("RABBITMQ_PORT") port := viper.GetString("RABBITMQ_PORT")
user := os.Getenv("RABBITMQ_USER") user := viper.GetString("RABBITMQ_USER")
pass := os.Getenv("RABBITMQ_PASSWORD") pass := viper.GetString("RABBITMQ_PASSWORD")
queue := os.Getenv("RABBITMQ_LOG_QUEUE") // contoh: log_queue queue := viper.GetString("RABBITMQ_LOG_QUEUE") // contoh: log_queue
uri := fmt.Sprintf("amqp://%s:%s@%s:%s/", uri := fmt.Sprintf("amqp://%s:%s@%s:%s/",
user, pass, host, port, user, pass, host, port,

View File

@ -5,10 +5,10 @@ import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"log" "log"
"os"
"time" "time"
"github.com/golang-jwt/jwt/v4" "github.com/golang-jwt/jwt/v4"
"github.com/spf13/viper"
) )
type UserTokenInfo struct { type UserTokenInfo struct {
@ -51,7 +51,7 @@ func NewJWTService() JWTService {
} }
func getSecretKey() string { func getSecretKey() string {
secretKey := os.Getenv("JWT_SECRET") secretKey := viper.GetString("JWT_SECRET")
if secretKey == "" { if secretKey == "" {
secretKey = "WMS-WareifySecretKey" secretKey = "WMS-WareifySecretKey"
} }