/
/
1 package main 2
3 import ( 4 "log" 5 "net/http" 6 "os" 7 "time" 8
9 "github.com/go-chi/chi/v5" 10 "github.com/go-chi/chi/v5/middleware" 11 ) 12
13 /* @gitian 14 * --group=core 15 * Entry point — sets up the chi router with middleware and 16 * starts the HTTP server. Port defaults to 8080 but can be 17 * overridden with the PORT environment variable. 18 */ 19 func main() { 20 r := chi.NewRouter() 21
22 // @gitian:note Middleware order matters — logger must wrap the recovery handler 23 r.Use(middleware.Logger) 24 r.Use(middleware.Recoverer) 25 r.Use(middleware.Timeout(30 * time.Second)) 26
27 store := NewStore() 28 h := NewHandler(store) 29
30 /* @gitian 31 * --group=api 32 * Route table — RESTful CRUD for todos. All routes are 33 * prefixed under /api/v1 for versioning. 34 */ 35 r.Route("/api/v1", func(r chi.Router) { 36 r.Get("/todos", h.List) 37 r.Post("/todos", h.Create) 38 r.Get("/todos/{id}", h.Get) 39 r.Put("/todos/{id}", h.Update) 40 r.Delete("/todos/{id}", h.Delete) 41 }) 42
43 // @gitian:todo Add /health endpoint for container readiness probes 44 // @gitian:todo Add graceful shutdown with signal handling 45
46 port := os.Getenv("PORT") 47 if port == "" { 48 port = "8080" 49 } 50
51 log.Printf("listening on :%s", port) 52 log.Fatal(http.ListenAndServe(":"+port, r)) 53 } 54