b7fa012d13
- Removed the old `infra.Config` structure and replaced it with a new modular configuration system in `pkg/config`. - Introduced a `Config` struct in `cmd/web/config.go` to hold command-specific configurations. - Updated configuration loading functions to utilize the new `LoadConfig` method with generics for type safety. - Adjusted various initialization functions in `cmd/web/bootstrap.go` and `cmd/web/main.go` to reflect the new configuration structure. - Cleaned up the `config.yaml` by removing obsolete fields and ensuring it aligns with the new configuration schema.
80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package config
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type ServerConfig struct {
|
|
Host string `mapstructure:"host"`
|
|
Port int `mapstructure:"port"`
|
|
Timeout time.Duration `mapstructure:"timeout"`
|
|
ReadTimeout time.Duration `mapstructure:"read_timeout"`
|
|
WriteTimeout time.Duration `mapstructure:"write_timeout"`
|
|
}
|
|
|
|
type DatabaseConfig struct {
|
|
MongoDB MongoConfig `mapstructure:"mongodb"`
|
|
}
|
|
|
|
type MongoConfig struct {
|
|
URI string `mapstructure:"uri"`
|
|
Name string `mapstructure:"name"`
|
|
Timeout time.Duration `mapstructure:"timeout"`
|
|
MaxPoolSize int `mapstructure:"max_pool_size"`
|
|
}
|
|
|
|
type CacheConfig struct {
|
|
Redis RedisConfig `mapstructure:"redis"`
|
|
}
|
|
|
|
type RedisConfig struct {
|
|
Host string `mapstructure:"host"`
|
|
Port int `mapstructure:"port"`
|
|
Password string `mapstructure:"password"`
|
|
DB int `mapstructure:"db"`
|
|
PoolSize int `mapstructure:"pool_size"`
|
|
}
|
|
|
|
type LoggingConfig struct {
|
|
Level string `mapstructure:"level"`
|
|
Format string `mapstructure:"format"`
|
|
Output string `mapstructure:"output"`
|
|
File LogFileConfig `mapstructure:"file"`
|
|
}
|
|
|
|
type LogFileConfig struct {
|
|
Path string `mapstructure:"path"`
|
|
MaxSize int `mapstructure:"max_size"` // MB
|
|
MaxBackups int `mapstructure:"max_backups"`
|
|
MaxAge int `mapstructure:"max_age"` // days
|
|
Compress bool `mapstructure:"compress"`
|
|
}
|
|
|
|
type RateLimitConfig struct {
|
|
RequestsPerMinute int `mapstructure:"requests_per_minute"`
|
|
Burst int `mapstructure:"burst"`
|
|
}
|
|
|
|
// LoadConfig loads configuration from file and environment variables
|
|
func LoadConfig[T any](path string, config T) (T, error) {
|
|
viper.SetConfigName("config")
|
|
viper.SetConfigType("yaml")
|
|
viper.AddConfigPath(path)
|
|
|
|
// Enable reading from environment variables
|
|
viper.AutomaticEnv()
|
|
|
|
// Read configuration file
|
|
if err := viper.ReadInConfig(); err != nil {
|
|
return config, err
|
|
}
|
|
|
|
if err := viper.Unmarshal(config); err != nil {
|
|
return config, err
|
|
}
|
|
|
|
return config, nil
|
|
}
|