package api import ( "net/http" "os" "strings" "github.com/go-chi/chi/v5" chimiddleware "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/cors" "github.com/yourusername/markedit/internal/api/handlers" "github.com/yourusername/markedit/internal/api/middleware" "github.com/yourusername/markedit/internal/database" ) // NewRouter creates and configures the HTTP router func NewRouter(db *database.DB) http.Handler { r := chi.NewRouter() // Middleware r.Use(chimiddleware.RequestID) r.Use(chimiddleware.RealIP) r.Use(middleware.Logger) r.Use(chimiddleware.Recoverer) // CORS configuration allowedOrigins := os.Getenv("ALLOWED_ORIGINS") if allowedOrigins == "" { allowedOrigins = "http://localhost:4321" } r.Use(cors.Handler(cors.Options{ AllowedOrigins: strings.Split(allowedOrigins, ","), AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, ExposedHeaders: []string{"Link"}, AllowCredentials: true, MaxAge: 300, })) // Create handlers authHandler := handlers.NewAuthHandler(db) repoHandler := handlers.NewRepoHandler(db) // Get cache directory from environment cacheDir := os.Getenv("GIT_CACHE_DIR") if cacheDir == "" { cacheDir = "./data/repos" } branchHandler := handlers.NewBranchHandler(db, cacheDir) // Public routes r.Get("/api/health", handlers.HealthCheck) r.Get("/api/auth/github/login", authHandler.BeginAuth) r.Get("/api/auth/github/callback", authHandler.CallbackAuth) // Protected routes r.Group(func(r chi.Router) { r.Use(middleware.RequireAuth(db)) r.Get("/api/auth/user", authHandler.GetCurrentUser) r.Post("/api/auth/logout", authHandler.Logout) r.Get("/api/user/repos", authHandler.GetUserRepos) r.Post("/api/user/repo", authHandler.UpdateLastRepo) // Repository routes r.Get("/api/repos", repoHandler.ListRepositories) r.Get("/api/repos/{owner}/{repo}/files", repoHandler.ListFiles) r.Get("/api/repos/{owner}/{repo}/files/*", repoHandler.GetFileContent) r.Put("/api/repos/{owner}/{repo}/files/*", repoHandler.UpdateFileContent) r.Delete("/api/repos/{owner}/{repo}/cache", repoHandler.InvalidateCache) // File management routes r.Post("/api/repos/{owner}/{repo}/create-file", repoHandler.CreateFile) r.Post("/api/repos/{owner}/{repo}/create-folder", repoHandler.CreateFolder) r.Post("/api/repos/{owner}/{repo}/rename", repoHandler.RenameItem) r.Get("/api/repos/{owner}/{repo}/pending-changes", repoHandler.GetPendingChanges) r.Delete("/api/repos/{owner}/{repo}/pending-changes", repoHandler.DiscardChanges) // Branch routes r.Get("/api/repos/{owner}/{repo}/branch/status", branchHandler.GetBranchStatus) r.Post("/api/repos/{owner}/{repo}/publish", branchHandler.Publish) }) return r }