98f581ec97
- Updated cursor rules to emphasize the importance of dependency injection and logging practices. - Introduced a new user management domain, including entities, services, handlers, and validation. - Implemented user authentication features such as login, registration, and role-based access control. - Added Redis integration for token management and caching. - Enhanced API documentation with Swagger for user-related endpoints. - Updated configuration to support new JWT settings and Redis connection parameters.
144 lines
4.0 KiB
Go
144 lines
4.0 KiB
Go
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
|
|
}
|