summaryrefslogtreecommitdiff
path: root/internal/config/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/config/config.go')
-rw-r--r--internal/config/config.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/internal/config/config.go b/internal/config/config.go
new file mode 100644
index 0000000..4a86b06
--- /dev/null
+++ b/internal/config/config.go
@@ -0,0 +1,129 @@
+package config
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+)
+
+// Config holds all application configuration
+type Config struct {
+ // API Keys
+ TodoistAPIKey string
+ PlanToEatAPIKey string
+ TrelloAPIKey string
+ TrelloToken string
+
+ // Paths
+ ObsidianVaultPath string
+ DatabasePath string
+
+ // Server
+ Port string
+ CacheTTLMinutes int
+ Debug bool
+
+ // AI Agent Access
+ AIAgentAPIKey string
+}
+
+// Load reads configuration from environment variables
+func Load() (*Config, error) {
+ cfg := &Config{
+ // API Keys
+ TodoistAPIKey: os.Getenv("TODOIST_API_KEY"),
+ PlanToEatAPIKey: os.Getenv("PLANTOEAT_API_KEY"),
+ TrelloAPIKey: os.Getenv("TRELLO_API_KEY"),
+ TrelloToken: os.Getenv("TRELLO_TOKEN"),
+
+ // Paths
+ ObsidianVaultPath: os.Getenv("OBSIDIAN_VAULT_PATH"),
+ DatabasePath: getEnvWithDefault("DATABASE_PATH", "./dashboard.db"),
+
+ // Server
+ Port: getEnvWithDefault("PORT", "8080"),
+ CacheTTLMinutes: getEnvAsInt("CACHE_TTL_MINUTES", 5),
+ Debug: getEnvAsBool("DEBUG", false),
+
+ // AI Agent Access
+ AIAgentAPIKey: os.Getenv("AI_AGENT_API_KEY"),
+ }
+
+ // Validate required fields
+ if err := cfg.Validate(); err != nil {
+ return nil, err
+ }
+
+ return cfg, nil
+}
+
+// Validate checks that required configuration is present
+func (c *Config) Validate() error {
+ // Require both Todoist and Trello (primary task management systems)
+ if c.TodoistAPIKey == "" {
+ return fmt.Errorf("TODOIST_API_KEY is required")
+ }
+
+ if c.TrelloAPIKey == "" {
+ return fmt.Errorf("TRELLO_API_KEY is required")
+ }
+
+ if c.TrelloToken == "" {
+ return fmt.Errorf("TRELLO_TOKEN is required")
+ }
+
+ return nil
+}
+
+// HasPlanToEat checks if PlanToEat is configured
+func (c *Config) HasPlanToEat() bool {
+ return c.PlanToEatAPIKey != ""
+}
+
+// HasTrello checks if Trello is configured
+func (c *Config) HasTrello() bool {
+ return c.TrelloAPIKey != "" && c.TrelloToken != ""
+}
+
+// HasObsidian checks if Obsidian is configured
+func (c *Config) HasObsidian() bool {
+ return c.ObsidianVaultPath != ""
+}
+
+// getEnvWithDefault returns environment variable value or default if not set
+func getEnvWithDefault(key, defaultValue string) string {
+ if value := os.Getenv(key); value != "" {
+ return value
+ }
+ return defaultValue
+}
+
+// getEnvAsInt returns environment variable as int or default if not set or invalid
+func getEnvAsInt(key string, defaultValue int) int {
+ valueStr := os.Getenv(key)
+ if valueStr == "" {
+ return defaultValue
+ }
+
+ value, err := strconv.Atoi(valueStr)
+ if err != nil {
+ return defaultValue
+ }
+
+ return value
+}
+
+// getEnvAsBool returns environment variable as bool or default if not set
+func getEnvAsBool(key string, defaultValue bool) bool {
+ valueStr := os.Getenv(key)
+ if valueStr == "" {
+ return defaultValue
+ }
+
+ value, err := strconv.ParseBool(valueStr)
+ if err != nil {
+ return defaultValue
+ }
+
+ return value
+}