1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
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
}
// 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),
}
// 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
}
|