A deployable markdown editor that connects with your self hosted files and lets you edit in a beautiful interface
at main 86 lines 2.8 kB view raw
1package api 2 3import ( 4 "net/http" 5 "os" 6 "strings" 7 8 "github.com/go-chi/chi/v5" 9 chimiddleware "github.com/go-chi/chi/v5/middleware" 10 "github.com/go-chi/cors" 11 "github.com/yourusername/markedit/internal/api/handlers" 12 "github.com/yourusername/markedit/internal/api/middleware" 13 "github.com/yourusername/markedit/internal/database" 14) 15 16// NewRouter creates and configures the HTTP router 17func NewRouter(db *database.DB) http.Handler { 18 r := chi.NewRouter() 19 20 // Middleware 21 r.Use(chimiddleware.RequestID) 22 r.Use(chimiddleware.RealIP) 23 r.Use(middleware.Logger) 24 r.Use(chimiddleware.Recoverer) 25 26 // CORS configuration 27 allowedOrigins := os.Getenv("ALLOWED_ORIGINS") 28 if allowedOrigins == "" { 29 allowedOrigins = "http://localhost:4321" 30 } 31 32 r.Use(cors.Handler(cors.Options{ 33 AllowedOrigins: strings.Split(allowedOrigins, ","), 34 AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, 35 AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, 36 ExposedHeaders: []string{"Link"}, 37 AllowCredentials: true, 38 MaxAge: 300, 39 })) 40 41 // Create handlers 42 authHandler := handlers.NewAuthHandler(db) 43 repoHandler := handlers.NewRepoHandler(db) 44 45 // Get cache directory from environment 46 cacheDir := os.Getenv("GIT_CACHE_DIR") 47 if cacheDir == "" { 48 cacheDir = "./data/repos" 49 } 50 branchHandler := handlers.NewBranchHandler(db, cacheDir) 51 52 // Public routes 53 r.Get("/api/health", handlers.HealthCheck) 54 r.Get("/api/auth/github/login", authHandler.BeginAuth) 55 r.Get("/api/auth/github/callback", authHandler.CallbackAuth) 56 57 // Protected routes 58 r.Group(func(r chi.Router) { 59 r.Use(middleware.RequireAuth(db)) 60 61 r.Get("/api/auth/user", authHandler.GetCurrentUser) 62 r.Post("/api/auth/logout", authHandler.Logout) 63 r.Get("/api/user/repos", authHandler.GetUserRepos) 64 r.Post("/api/user/repo", authHandler.UpdateLastRepo) 65 66 // Repository routes 67 r.Get("/api/repos", repoHandler.ListRepositories) 68 r.Get("/api/repos/{owner}/{repo}/files", repoHandler.ListFiles) 69 r.Get("/api/repos/{owner}/{repo}/files/*", repoHandler.GetFileContent) 70 r.Put("/api/repos/{owner}/{repo}/files/*", repoHandler.UpdateFileContent) 71 r.Delete("/api/repos/{owner}/{repo}/cache", repoHandler.InvalidateCache) 72 73 // File management routes 74 r.Post("/api/repos/{owner}/{repo}/create-file", repoHandler.CreateFile) 75 r.Post("/api/repos/{owner}/{repo}/create-folder", repoHandler.CreateFolder) 76 r.Post("/api/repos/{owner}/{repo}/rename", repoHandler.RenameItem) 77 r.Get("/api/repos/{owner}/{repo}/pending-changes", repoHandler.GetPendingChanges) 78 r.Delete("/api/repos/{owner}/{repo}/pending-changes", repoHandler.DiscardChanges) 79 80 // Branch routes 81 r.Get("/api/repos/{owner}/{repo}/branch/status", branchHandler.GetBranchStatus) 82 r.Post("/api/repos/{owner}/{repo}/publish", branchHandler.Publish) 83 }) 84 85 return r 86}