89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
type Config struct {
|
|
DatabaseURL string
|
|
JWTSecret string
|
|
JWTExpirationHours int
|
|
Port string
|
|
AllowedOrigins []string
|
|
|
|
// 股票数据源
|
|
TickFlowAPIKey string
|
|
TickFlowBaseURL 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])
|
|
}
|
|
}
|
|
|
|
tickFlowBaseURL := os.Getenv("TICKFLOW_BASE_URL")
|
|
if tickFlowBaseURL == "" {
|
|
tickFlowBaseURL = "https://api.tickflow.org"
|
|
}
|
|
|
|
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,
|
|
TickFlowAPIKey: os.Getenv("TICKFLOW_API_KEY"),
|
|
TickFlowBaseURL: tickFlowBaseURL,
|
|
DataSyncEnabled: dataSyncEnabled,
|
|
DataSyncTime: dataSyncTime,
|
|
DataSyncWeekdays: dataSyncWeekdays,
|
|
}, nil
|
|
}
|
|
|
|
func (c *Config) JWTExpiration() time.Duration {
|
|
return time.Duration(c.JWTExpirationHours) * time.Hour
|
|
}
|