diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index 58eb9a1..83f440f 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -9,18 +9,22 @@ import ( "github.com/go-chi/chi/v5/middleware" "novamd/internal/api" + "novamd/internal/config" "novamd/internal/db" "novamd/internal/filesystem" "novamd/internal/user" ) func main() { - // Initialize database - dbPath := os.Getenv("NOVAMD_DB_PATH") - if dbPath == "" { - dbPath = "./sqlite.db" + + // Load configuration + cfg, err := config.Load() + if err != nil { + log.Fatal("Failed to load configuration:", err) } - database, err := db.Init(dbPath) + + // Initialize database + database, err := db.Init(cfg.DBPath) if err != nil { log.Fatal(err) } @@ -31,21 +35,13 @@ func main() { }() // Initialize filesystem - workdir := os.Getenv("NOVAMD_WORKDIR") - if workdir == "" { - workdir = "./data" - } - fs := filesystem.New(workdir) + fs := filesystem.New(cfg.WorkDir) // Initialize user service userService := user.NewUserService(database, fs) - adminEmail := os.Getenv("NOVAMD_ADMIN_EMAIL") - adminPassword := os.Getenv("NOVAMD_ADMIN_PASSWORD") - if adminEmail == "" || adminPassword == "" { - log.Fatal("NOVAMD_ADMIN_EMAIL and NOVAMD_ADMIN_PASSWORD environment variables must be set") - } - if _, err := userService.SetupAdminUser(adminEmail, adminPassword); err != nil { + // Create admin user + if _, err := userService.SetupAdminUser(cfg.AdminEmail, cfg.AdminPassword); err != nil { log.Fatal(err) } @@ -59,14 +55,8 @@ func main() { api.SetupRoutes(r, database, fs) }) - // Static file serving - staticPath := os.Getenv("NOVAMD_STATIC_PATH") - if staticPath == "" { - staticPath = "../frontend/dist" - } - // Handle all other routes with static file server - r.Get("/*", api.NewStaticHandler(staticPath).ServeHTTP) + r.Get("/*", api.NewStaticHandler(cfg.StaticPath).ServeHTTP) // Start server port := os.Getenv("NOVAMD_PORT") diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go new file mode 100644 index 0000000..107ffd9 --- /dev/null +++ b/backend/internal/config/config.go @@ -0,0 +1,67 @@ +package config + +import ( + "fmt" + "os" + "path/filepath" +) + +type Config struct { + DBPath string + WorkDir string + StaticPath string + Port string + AdminEmail string + AdminPassword string +} + +func DefaultConfig() *Config { + return &Config{ + DBPath: "./novamd.db", + WorkDir: "./data", + StaticPath: "../frontend/dist", + Port: "8080", + } +} + +// Load creates a new Config instance with values from environment variables +func Load() (*Config, error) { + config := DefaultConfig() + + if dbPath := os.Getenv("NOVAMD_DB_PATH"); dbPath != "" { + config.DBPath = dbPath + } + if err := ensureDir(filepath.Dir(config.DBPath)); err != nil { + return nil, fmt.Errorf("failed to create database directory: %w", err) + } + + if workDir := os.Getenv("NOVAMD_WORKDIR"); workDir != "" { + config.WorkDir = workDir + } + if err := ensureDir(config.WorkDir); err != nil { + return nil, fmt.Errorf("failed to create work directory: %w", err) + } + + if staticPath := os.Getenv("NOVAMD_STATIC_PATH"); staticPath != "" { + config.StaticPath = staticPath + } + + if port := os.Getenv("NOVAMD_PORT"); port != "" { + config.Port = port + } + + config.AdminEmail = os.Getenv("NOVAMD_ADMIN_EMAIL") + config.AdminPassword = os.Getenv("NOVAMD_ADMIN_PASSWORD") + if config.AdminEmail == "" || config.AdminPassword == "" { + return nil, fmt.Errorf("NOVAMD_ADMIN_EMAIL and NOVAMD_ADMIN_PASSWORD must be set") + } + + return config, nil +} + +func ensureDir(dir string) error { + if dir == "" { + return nil + } + return os.MkdirAll(dir, 0755) +}