- The mapstructure library is no longer needed for direct duration parsing since we now store TTLs as string durations (e.g., "15m", "168h") and parse them on demand via helper methods. - This allows more flexible duration formats in configuration and moves the parsing responsibility to the JWT config struct itself.
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
func defaults(v *viper.Viper) {
|
|
v.SetDefault("server.host", "0.0.0.0")
|
|
v.SetDefault("server.port", 10086)
|
|
|
|
v.SetDefault("database.driver", "sqlite3")
|
|
v.SetDefault("database.path", "data/mygo.db")
|
|
|
|
v.SetDefault("storage.driver", "local")
|
|
v.SetDefault("storage.local.path", "data/files")
|
|
|
|
v.SetDefault("jwt.secret", "dev-secret-do-not-use-in-production")
|
|
v.SetDefault("jwt.access_ttl", "15m")
|
|
v.SetDefault("jwt.refresh_ttl", "168h")
|
|
}
|
|
|
|
func New() *viper.Viper {
|
|
v := viper.New()
|
|
v.SetEnvPrefix("MYGO")
|
|
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
|
v.AutomaticEnv()
|
|
defaults(v)
|
|
return v
|
|
}
|
|
|
|
func Load(v *viper.Viper, cfgFile string) (*Config, error) {
|
|
if cfgFile != "" {
|
|
v.SetConfigFile(cfgFile)
|
|
} else {
|
|
v.SetConfigName("config")
|
|
v.SetConfigType("yaml")
|
|
v.AddConfigPath(".")
|
|
}
|
|
|
|
if err := v.ReadInConfig(); err != nil {
|
|
var notFound viper.ConfigFileNotFoundError
|
|
if !errors.As(err, ¬Found) {
|
|
return nil, fmt.Errorf("read config: %w", err)
|
|
}
|
|
}
|
|
|
|
var cfg Config
|
|
if err := v.Unmarshal(&cfg); err != nil {
|
|
return nil, fmt.Errorf("unmarshal config: %w", err)
|
|
}
|
|
|
|
if err := cfg.Validate(); err != nil {
|
|
return nil, fmt.Errorf("validate config: %w", err)
|
|
}
|
|
|
|
return &cfg, nil
|
|
}
|