Files
stock/backend/internal/config/config.go
T

94 lines
2.1 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])
}
}
tickFlowAPIKey := os.Getenv("TICKFLOW_API_KEY")
if tickFlowAPIKey == "" {
tickFlowAPIKey = "tk_94a20304993f45b5b0e376b9767597cc"
}
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: tickFlowAPIKey,
TickFlowBaseURL: tickFlowBaseURL,
DataSyncEnabled: dataSyncEnabled,
DataSyncTime: dataSyncTime,
DataSyncWeekdays: dataSyncWeekdays,
}, nil
}
func (c *Config) JWTExpiration() time.Duration {
return time.Duration(c.JWTExpirationHours) * time.Hour
}