prism/service/config/config.go

113 lines
2.6 KiB
Go

package config
import (
"fmt"
"os"
"strconv"
)
type Config struct {
Port int
APIKey string
VerboseLogging bool
RateLimit int
DeviceName string
PrismEndpointPrefix string
EnableSignal bool
SignalSocket string
EnableProton bool
ProtonIMAPUsername string
ProtonIMAPPassword string
ProtonBridgeAddr string
EnableTelegram bool
TelegramBotToken string
TelegramChatID int64
StoragePath string
}
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
}