config.go 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package app
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "time"
  7. )
  8. type Config struct {
  9. AppEnv string
  10. HTTPAddr string
  11. DatabaseURL string
  12. JWTIssuer string
  13. JWTAccessSecret string
  14. JWTAccessTTL time.Duration
  15. RefreshTTL time.Duration
  16. SMSCodeTTL time.Duration
  17. SMSCodeCooldown time.Duration
  18. SMSProvider string
  19. DevSMSCode string
  20. WechatMiniAppID string
  21. WechatMiniSecret string
  22. WechatMiniDevPrefix string
  23. LocalEventDir string
  24. AssetBaseURL string
  25. AssetPublicBaseURL string
  26. AssetBucketRoot string
  27. OSSUtilPath string
  28. OSSUtilConfigFile string
  29. }
  30. func LoadConfigFromEnv() (Config, error) {
  31. cfg := Config{
  32. AppEnv: getEnv("APP_ENV", "development"),
  33. HTTPAddr: getEnv("HTTP_ADDR", ":8080"),
  34. DatabaseURL: os.Getenv("DATABASE_URL"),
  35. JWTIssuer: getEnv("JWT_ISSUER", "cmr-backend"),
  36. JWTAccessSecret: getEnv("JWT_ACCESS_SECRET", "change-me-in-production"),
  37. JWTAccessTTL: getDurationEnv("JWT_ACCESS_TTL", 2*time.Hour),
  38. RefreshTTL: getDurationEnv("AUTH_REFRESH_TTL", 30*24*time.Hour),
  39. SMSCodeTTL: getDurationEnv("AUTH_SMS_CODE_TTL", 10*time.Minute),
  40. SMSCodeCooldown: getDurationEnv("AUTH_SMS_COOLDOWN", 60*time.Second),
  41. SMSProvider: getEnv("AUTH_SMS_PROVIDER", "console"),
  42. DevSMSCode: os.Getenv("AUTH_DEV_SMS_CODE"),
  43. WechatMiniAppID: getEnv("WECHAT_MINI_APP_ID", ""),
  44. WechatMiniSecret: getEnv("WECHAT_MINI_APP_SECRET", ""),
  45. WechatMiniDevPrefix: getEnv("WECHAT_MINI_DEV_PREFIX", "dev-"),
  46. LocalEventDir: getEnv("LOCAL_EVENT_DIR", filepath.Clean("..\\event")),
  47. AssetBaseURL: getEnv("ASSET_BASE_URL", "https://oss-mbh5.colormaprun.com/gotomars"),
  48. AssetPublicBaseURL: getEnv("ASSET_PUBLIC_BASE_URL", "https://oss-mbh5.colormaprun.com"),
  49. AssetBucketRoot: getEnv("ASSET_BUCKET_ROOT", "oss://color-map-html"),
  50. OSSUtilPath: getEnv("OSSUTIL_PATH", filepath.Clean("..\\tools\\ossutil.exe")),
  51. OSSUtilConfigFile: getEnv("OSSUTIL_CONFIG_FILE", filepath.Join(mustUserHomeDir(), ".ossutilconfig")),
  52. }
  53. if cfg.DatabaseURL == "" {
  54. return Config{}, fmt.Errorf("DATABASE_URL is required")
  55. }
  56. if cfg.JWTAccessSecret == "" {
  57. return Config{}, fmt.Errorf("JWT_ACCESS_SECRET is required")
  58. }
  59. return cfg, nil
  60. }
  61. func getEnv(key, fallback string) string {
  62. if value := os.Getenv(key); value != "" {
  63. return value
  64. }
  65. return fallback
  66. }
  67. func getDurationEnv(key string, fallback time.Duration) time.Duration {
  68. if value := os.Getenv(key); value != "" {
  69. if parsed, err := time.ParseDuration(value); err == nil {
  70. return parsed
  71. }
  72. }
  73. return fallback
  74. }
  75. func mustUserHomeDir() string {
  76. home, err := os.UserHomeDir()
  77. if err != nil {
  78. return "."
  79. }
  80. return home
  81. }