package infra import ( "time" "github.com/spf13/viper" ) // Config holds all configuration for the application type Config struct { Server ServerConfig `mapstructure:"server"` Database DatabaseConfig `mapstructure:"database"` Cache CacheConfig `mapstructure:"cache"` Queue QueueConfig `mapstructure:"queue"` Search SearchConfig `mapstructure:"search"` Auth AuthConfig `mapstructure:"auth"` AI AIConfig `mapstructure:"ai"` Scraping ScrapingConfig `mapstructure:"scraping"` Logging LoggingConfig `mapstructure:"logging"` RateLimit RateLimitConfig `mapstructure:"rate_limiting"` } 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 QueueConfig struct { RabbitMQ RabbitMQConfig `mapstructure:"rabbitmq"` } type RabbitMQConfig struct { URL string `mapstructure:"url"` Exchange string `mapstructure:"exchange"` Queues map[string]string `mapstructure:"queues"` } type SearchConfig struct { Elasticsearch ElasticsearchConfig `mapstructure:"elasticsearch"` } type ElasticsearchConfig struct { URLs []string `mapstructure:"urls"` Username string `mapstructure:"username"` Password string `mapstructure:"password"` IndexPrefix string `mapstructure:"index_prefix"` } type AuthConfig struct { JWT JWTConfig `mapstructure:"jwt"` } type JWTConfig struct { AccessSecret string `mapstructure:"access_secret"` RefreshSecret string `mapstructure:"refresh_secret"` AccessExpiresIn int `mapstructure:"access_expires_in"` RefreshExpiresIn int `mapstructure:"refresh_expires_in"` } type AIConfig struct { OpenAI OpenAIConfig `mapstructure:"openai"` } type OpenAIConfig struct { APIKey string `mapstructure:"api_key"` Model string `mapstructure:"model"` MaxTokens int `mapstructure:"max_tokens"` } type ScrapingConfig struct { UserAgent string `mapstructure:"user_agent"` Timeout time.Duration `mapstructure:"timeout"` MaxRetries int `mapstructure:"max_retries"` DelayBetweenRequests time.Duration `mapstructure:"delay_between_requests"` } 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(path string) (*Config, 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 nil, err } var config Config if err := viper.Unmarshal(&config); err != nil { return nil, err } return &config, nil }