A deployable markdown editor that connects with your self hosted files and lets you edit in a beautiful interface
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}