prism/service/config/config.go

109 lines
2.7 KiB
Go

package config
import (
"fmt"
"os"
"strconv"
)
type Config struct {
TelegramChatID int64
Port int
RateLimit int
APIKey string
DeviceName string
PrismEndpointPrefix string
SignalSocket string
ProtonIMAPUsername string
ProtonIMAPPassword string
ProtonBridgeAddr string
TelegramBotToken string
StoragePath string
VerboseLogging bool
EnableSignal bool
EnableProton bool
EnableTelegram bool
}
func Load() (*Config, error) {
cfg := &Config{
APIKey: os.Getenv("API_KEY"),
Port: getEnvInt("PORT", 8080),
VerboseLogging: getEnvBool("VERBOSE_LOGGING", false),
RateLimit: getEnvInt("RATE_LIMIT", 100),
DeviceName: getEnvString("DEVICE_NAME", "Prism"),
EnableSignal: getEnvBool("FEATURE_ENABLE_SIGNAL", false),
SignalSocket: getEnvString("SIGNAL_SOCKET", "/run/signal-cli/socket"),
EnableProton: getEnvBool("FEATURE_ENABLE_PROTON", false),
ProtonIMAPUsername: os.Getenv("PROTON_IMAP_USERNAME"),
ProtonIMAPPassword: os.Getenv("PROTON_IMAP_PASSWORD"),
ProtonBridgeAddr: getEnvString("PROTON_BRIDGE_ADDR", "protonmail-bridge:143"),
EnableTelegram: getEnvBool("FEATURE_ENABLE_TELEGRAM", false),
TelegramBotToken: os.Getenv("TELEGRAM_BOT_TOKEN"),
TelegramChatID: getEnvInt64("TELEGRAM_CHAT_ID", 0),
StoragePath: getEnvString("STORAGE_PATH", "./data/prism.db"),
}
cfg.PrismEndpointPrefix = fmt.Sprintf("[%s:", cfg.DeviceName)
if err := cfg.Validate(); err != nil {
return nil, err
}
return cfg, nil
}
func (c *Config) Validate() error {
if c.APIKey == "" {
return fmt.Errorf("API_KEY environment variable is required")
}
return nil
}
func (c *Config) IsProtonEnabled() bool {
return c.EnableProton && c.ProtonIMAPUsername != "" && c.ProtonIMAPPassword != "" && c.ProtonBridgeAddr != ""
}
func (c *Config) IsSignalEnabled() bool {
return c.EnableSignal
}
func (c *Config) IsTelegramEnabled() bool {
return c.EnableTelegram
}
func getEnvString(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
func getEnvInt(key string, defaultValue int) int {
if value := os.Getenv(key); value != "" {
if i, err := strconv.Atoi(value); err == nil {
return i
}
}
return defaultValue
}
func getEnvInt64(key string, defaultValue int64) int64 {
if value := os.Getenv(key); value != "" {
if i, err := strconv.ParseInt(value, 10, 64); err == nil {
return i
}
}
return defaultValue
}
func getEnvBool(key string, defaultValue bool) bool {
if value := os.Getenv(key); value != "" {
return value == "true" || value == "1"
}
return defaultValue
}