package config import ( "crypto/rand" "encoding/base64" "strings" "github.com/caarlos0/env/v11" "github.com/joho/godotenv" ) type Config struct { Port string `env:"PORT" envDefault:"8080"` AdminUsername string `env:"ADMIN_USERNAME" envDefault:"admin"` AdminPassword string `env:"ADMIN_PASSWORD" envDefault:"infinite-canvas"` JWTSecret string `env:"JWT_SECRET" envDefault:"infinite-canvas"` JWTExpireHours int `env:"JWT_EXPIRE_HOURS" envDefault:"168"` StorageDriver string `env:"STORAGE_DRIVER" envDefault:"sqlite"` DatabaseDSN string `env:"DATABASE_DSN" envDefault:"data/infinite-canvas.db"` LinuxDoAuthorizeURL string `env:"LINUX_DO_AUTHORIZE_URL" envDefault:"https://connect.linux.do/oauth2/authorize"` LinuxDoTokenURL string `env:"LINUX_DO_TOKEN_URL" envDefault:"https://connect.linux.do/oauth2/token"` LinuxDoUserInfoURL string `env:"LINUX_DO_USERINFO_URL" envDefault:"https://connect.linux.do/api/user"` } var Cfg Config func Load() error { _ = godotenv.Load() if err := env.Parse(&Cfg); err != nil { return err } if strings.TrimSpace(Cfg.JWTSecret) == "" || Cfg.JWTSecret == "infinite-canvas" { secret, err := randomSecret() if err != nil { return err } Cfg.JWTSecret = secret } return nil } func randomSecret() (string, error) { buf := make([]byte, 32) if _, err := rand.Read(buf); err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(buf), nil }