2025-03-03 18:59:25 +07:00
|
|
|
package config
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
_ "gopkg.in/yaml.v3"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
2025-03-03 19:55:10 +07:00
|
|
|
YAML_PATH = "env/%s"
|
2025-03-03 18:59:25 +07:00
|
|
|
ENV_MODE = "ENV_MODE"
|
2025-04-24 11:25:36 +08:00
|
|
|
DEFAULT_ENV_MODE = "local"
|
2025-03-03 18:59:25 +07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
validEnvMode = map[string]struct{}{
|
2025-04-23 18:18:44 +08:00
|
|
|
"local": {},
|
|
|
|
|
"staging": {},
|
|
|
|
|
"production": {},
|
|
|
|
|
"debug": {},
|
2025-03-03 18:59:25 +07:00
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Config struct {
|
|
|
|
|
Server Server `mapstructure:"server"`
|
|
|
|
|
Database Database `mapstructure:"postgresql"`
|
|
|
|
|
Jwt Jwt `mapstructure:"jwt"`
|
|
|
|
|
OSSConfig OSSConfig `mapstructure:"oss"`
|
2025-03-06 13:30:24 +08:00
|
|
|
Redis Redis `mapstructure:"redis"`
|
2025-03-03 18:59:25 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
config *Config
|
|
|
|
|
configOnce sync.Once
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func LoadConfig() *Config {
|
|
|
|
|
envMode := os.Getenv(ENV_MODE)
|
|
|
|
|
if _, ok := validEnvMode[envMode]; !ok {
|
|
|
|
|
envMode = DEFAULT_ENV_MODE // default env mode
|
|
|
|
|
}
|
|
|
|
|
cfgFilePath := fmt.Sprintf(YAML_PATH, envMode)
|
|
|
|
|
|
|
|
|
|
configOnce.Do(func() {
|
|
|
|
|
v := viper.New()
|
|
|
|
|
v.SetConfigType("yaml")
|
|
|
|
|
v.AddConfigPath(".")
|
|
|
|
|
v.SetConfigName(cfgFilePath)
|
|
|
|
|
if err := v.ReadInConfig(); err != nil {
|
|
|
|
|
panic(fmt.Errorf("failed to read config file: %s", err))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
config = &Config{}
|
|
|
|
|
if err := v.Unmarshal(config); err != nil {
|
|
|
|
|
panic(fmt.Errorf("failed to unmarshal config: %s", err))
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return config
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Config) Auth() *AuthConfig {
|
|
|
|
|
return &AuthConfig{
|
|
|
|
|
jwtTokenSecret: c.Jwt.Token.Secret,
|
|
|
|
|
jwtTokenExpiresTTL: c.Jwt.Token.ExpiresTTL,
|
|
|
|
|
}
|
|
|
|
|
}
|