package main import ( "flag" "fmt" "net/http" "os" "path/filepath" "wiki-go/internal/auth" "wiki-go/internal/config" "wiki-go/internal/goldext" "wiki-go/internal/handlers" "wiki-go/internal/logger" "wiki-go/internal/migration" "wiki-go/internal/routes" "wiki-go/internal/static" ) func main() { configfilepath := flag.String("configfile", GetEnvString("CONFIGFILE", config.ConfigFilePath), "where to find config.yaml") flag.Parse() config.ConfigFilePath = *configfilepath // Fix broken config file if it exists (from previous bug) if err := migration.FixBrokenConfig(config.ConfigFilePath); err != nil { logger.Warn("Failed to fix broken config: %v", err) } // Migrate user roles from old IsAdmin to new role-based system if err := migration.MigrateUserRoles(config.ConfigFilePath); err != nil { logger.Fatal("Error migrating user roles: %v", err) } // Load configuration (after migration) cfg, err := config.LoadConfig(config.ConfigFilePath) if err != nil { logger.Fatal("Error loading config: %v", err) } // Propagate wiki timezone to the goldext shortcode renderer so that // :::stats recent=N::: formats edit times in the configured zone // (consistent with formatTime used elsewhere in templates). goldext.SetWikiTimezone(cfg.Wiki.Timezone) goldext.ConfigureContentPaths(cfg.Wiki.RootDir, cfg.Wiki.DocumentsDir) // Apply log level from config logger.Init(cfg.Wiki.LogLevel) // Initialize session store for persistent logins sessionPath := filepath.Join(cfg.Wiki.RootDir, "temp", "sessions.json") if err := auth.InitSessionStore(sessionPath); err != nil { logger.Warn("Failed to initialize session store: %v", err) } // Ensure the homepage exists if err := handlers.EnsureHomepageExists(cfg); err != nil { logger.Fatal("Error creating homepage: %v", err) } // Ensure static assets exist in data directory if err := static.EnsureStaticAssetsExist(cfg.Wiki.RootDir); err != nil { logger.Fatal("Error copying static assets: %v", err) } // Update handlers with config handlers.InitHandlers(cfg) // Setup all routes routes.SetupRoutes(cfg) // Start the server addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) if cfg.Server.SSL && cfg.Server.SSLCert != "" && cfg.Server.SSLKey != "" { logger.Info("HTTPS server starting on %s...", addr) if err := http.ListenAndServeTLS(addr, cfg.Server.SSLCert, cfg.Server.SSLKey, nil); err != nil { logger.Fatal("HTTPS server error: %v", err) } } else { logger.Info("HTTP server starting on %s...", addr) if err := http.ListenAndServe(addr, nil); err != nil { logger.Fatal("HTTP server error: %v", err) } } } func GetEnvString(name, defaultvalue string) string { value, ok := os.LookupEnv(name) if !ok { return defaultvalue } return value }