package main import ( "log" "net/http" "os" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" ) func main() { if len(os.Args) > 1 { runCommand(os.Args[1:]) return } db, err := openDB() if err != nil { log.Fatal("database: ", err) } r := chi.NewRouter() r.Use(middleware.Logger) r.Use(middleware.Recoverer) r.Get("/", accountPageHandler(db)) r.Get("/users/{name}", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, " + chi.URLParam(r, "name") + "!")) }) r.Get("/login", loginPageHandler(db)) r.Post("/login", loginHandler(db)) r.Post("/logout", logoutHandler(db)) r.Get("/admin/keys", adminKeysPageHandler(db)) r.Post("/admin/keys", adminKeysCreateHandler(db)) r.Post("/admin/keys/{id}/retire", adminKeysRetireHandler(db)) r.Get("/admin/applications", adminApplicationsPageHandler(db)) r.Get("/admin/applications/new", adminApplicationNewPageHandler(db)) r.Post("/admin/applications/new", adminApplicationsCreateHandler(db)) r.Post("/admin/applications/{id}/secret", adminApplicationsRotateSecretHandler(db)) r.Post("/admin/applications/{id}/delete", adminApplicationsDeleteHandler(db)) r.Handle("/static/*", staticHandler()) r.Get("/health", func(w http.ResponseWriter, r *http.Request) { sqlDB, err := db.DB() if err != nil { w.WriteHeader(http.StatusServiceUnavailable) w.Write([]byte("db: " + err.Error())) return } if err := sqlDB.Ping(); err != nil { w.WriteHeader(http.StatusServiceUnavailable) w.Write([]byte("db: " + err.Error())) return } w.Write([]byte("ok")) }) // 未匹配任何路由的路徑(不分方法)輸出自訂 404 頁。 r.NotFound(notFoundHandler) if err := http.ListenAndServe(":8080", r); err != nil { log.Fatal(err) } }