package config import ( "fmt" "os" "strconv" "strings" "time" "github.com/joho/godotenv" ) const defaultTushareToken = "76efd8465f9f2591aa42a385268e06acf6b80b7a15be2267ad2281b7" type Config struct { DatabaseURL string JWTSecret string JWTExpirationHours int Port string AllowedOrigins []string // 股票数据源 TushareToken string DataSyncEnabled bool DataSyncTime string // HH:MM DataSyncWeekdays bool } func Load() (*Config, error) { _ = godotenv.Load() databaseURL := os.Getenv("DATABASE_URL") if databaseURL == "" { return nil, fmt.Errorf("DATABASE_URL must be set") } jwtSecret := os.Getenv("JWT_SECRET") if jwtSecret == "" { jwtSecret = "change-me-in-production" fmt.Fprintln(os.Stderr, "WARNING: JWT_SECRET not set, using default secret") } expHours, _ := strconv.Atoi(os.Getenv("JWT_EXPIRATION_HOURS")) if expHours == 0 { expHours = 168 // 7 days } port := os.Getenv("PORT") if port == "" { port = "3019" } allowedOrigins := []string{"*"} if v := os.Getenv("ALLOWED_ORIGINS"); v != "" { allowedOrigins = strings.Split(v, ",") for i := range allowedOrigins { allowedOrigins[i] = strings.TrimSpace(allowedOrigins[i]) } } tushareToken := os.Getenv("TUSHARE_TOKEN") if tushareToken == "" { tushareToken = defaultTushareToken } dataSyncEnabled := strings.ToLower(os.Getenv("DATA_SYNC_ENABLED")) != "false" dataSyncTime := os.Getenv("DATA_SYNC_TIME") if dataSyncTime == "" { dataSyncTime = "16:30" } dataSyncWeekdays := strings.ToLower(os.Getenv("DATA_SYNC_WEEKDAYS_ONLY")) != "false" return &Config{ DatabaseURL: databaseURL, JWTSecret: jwtSecret, JWTExpirationHours: expHours, Port: port, AllowedOrigins: allowedOrigins, TushareToken: tushareToken, DataSyncEnabled: dataSyncEnabled, DataSyncTime: dataSyncTime, DataSyncWeekdays: dataSyncWeekdays, }, nil } func (c *Config) JWTExpiration() time.Duration { return time.Duration(c.JWTExpirationHours) * time.Hour }