Files
Novault-backend/internal/config/config.go

178 lines
4.8 KiB
Go

package config
import (
"os"
"strconv"
"time"
)
// Config holds all configuration for the application
type Config struct {
// Server configuration
ServerPort string
Environment string
// MySQL Database configuration
DBHost string
DBPort string
DBUser string
DBPassword string
DBName string
DBCharset string
// Data directory
DataDir string
// Redis configuration
RedisAddr string
RedisPassword string
RedisDB int
// YunAPI configuration (exchange rates)
YunAPIURL string
YunAPIKey string
SyncInterval time.Duration
CacheExpiration time.Duration
MaxRetries int
// JWT configuration
JWTSecret string
JWTAccessExpiry time.Duration
JWTRefreshExpiry time.Duration
// GitHub OAuth configuration
GitHubClientID string
GitHubClientSecret string
GitHubRedirectURL string
FrontendURL string
// AI configuration (OpenAI compatible)
OpenAIAPIKey string
OpenAIBaseURL string
WhisperModel string
ChatModel string
AISessionTimeout time.Duration
// Image upload configuration
ImageUploadDir string
MaxImageSize int64
AllowedImageTypes string
MaxImagesPerTx int
}
// Load loads configuration from environment variables
func Load() *Config {
cfg := &Config{
// Server
ServerPort: getEnv("SERVER_PORT", "2612"),
Environment: getEnv("ENVIRONMENT", "development"),
// Data directory
DataDir: getEnv("DATA_DIR", "./data"),
// MySQL Database
DBHost: getEnv("DB_HOST", ""),
DBPort: getEnv("DB_PORT", "3306"),
DBUser: getEnv("DB_USER", ""),
DBPassword: getEnv("DB_PASSWORD", ""),
DBName: getEnv("DB_NAME", ""),
DBCharset: getEnv("DB_CHARSET", "utf8mb4"),
// Redis
RedisAddr: getEnv("REDIS_ADDR", ""),
RedisPassword: getEnv("REDIS_PASSWORD", ""),
RedisDB: getEnvInt("REDIS_DB", 0),
// YunAPI (exchange rates)
YunAPIURL: getEnv("YUNAPI_URL", ""),
YunAPIKey: getEnv("YUNAPI_KEY", ""),
SyncInterval: getEnvDuration("SYNC_INTERVAL", 10*time.Minute),
CacheExpiration: getEnvDuration("CACHE_EXPIRATION", 10*time.Minute),
MaxRetries: getEnvInt("MAX_RETRIES", 3),
// JWT
JWTSecret: getEnv("JWT_SECRET", ""),
JWTAccessExpiry: getEnvDuration("JWT_ACCESS_EXPIRY", 15*time.Minute),
JWTRefreshExpiry: getEnvDuration("JWT_REFRESH_EXPIRY", 168*time.Hour), // 7 days
// GitHub OAuth
GitHubClientID: getEnv("GITHUB_CLIENT_ID", ""),
GitHubClientSecret: getEnv("GITHUB_CLIENT_SECRET", ""),
GitHubRedirectURL: getEnv("GITHUB_REDIRECT_URL", ""),
FrontendURL: getEnv("FRONTEND_URL", "http://localhost:2613"),
// AI (OpenAI compatible)
OpenAIAPIKey: getEnv("OPENAI_API_KEY", ""),
OpenAIBaseURL: getEnv("OPENAI_BASE_URL", ""),
WhisperModel: getEnv("WHISPER_MODEL", "whisper-1"),
ChatModel: getEnv("CHAT_MODEL", "gpt-3.5-turbo"),
AISessionTimeout: getEnvDuration("AI_SESSION_TIMEOUT", 30*time.Minute),
// Image upload
ImageUploadDir: getEnv("IMAGE_UPLOAD_DIR", "./uploads/images"),
MaxImageSize: getEnvInt64("MAX_IMAGE_SIZE", 10*1024*1024), // 10MB
AllowedImageTypes: getEnv("ALLOWED_IMAGE_TYPES", "image/jpeg,image/png,image/heic"),
MaxImagesPerTx: getEnvInt("MAX_IMAGES_PER_TX", 9),
}
// Ensure data directory exists
if cfg.DataDir != "" {
_ = os.MkdirAll(cfg.DataDir, 0755)
}
// Ensure image upload directory exists
if cfg.ImageUploadDir != "" {
_ = os.MkdirAll(cfg.ImageUploadDir, 0755)
}
return cfg
}
// IsDevelopment returns true if running in development mode
func (c *Config) IsDevelopment() bool {
return c.Environment == "development"
}
// IsProduction returns true if running in production mode
func (c *Config) IsProduction() bool {
return c.Environment == "production"
}
// getEnv gets an environment variable or returns a default value
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
// getEnvInt gets an environment variable as int or returns a default value
func getEnvInt(key string, defaultValue int) int {
if value := os.Getenv(key); value != "" {
if intValue, err := strconv.Atoi(value); err == nil {
return intValue
}
}
return defaultValue
}
// getEnvInt64 gets an environment variable as int64 or returns a default value
func getEnvInt64(key string, defaultValue int64) int64 {
if value := os.Getenv(key); value != "" {
if intValue, err := strconv.ParseInt(value, 10, 64); err == nil {
return intValue
}
}
return defaultValue
}
// getEnvDuration gets an environment variable as duration or returns a default value
func getEnvDuration(key string, defaultValue time.Duration) time.Duration {
if value := os.Getenv(key); value != "" {
if duration, err := time.ParseDuration(value); err == nil {
return duration
}
}
return defaultValue
}