package service import ( "context" "fmt" "log/slog" "net/http" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" _ "git.zhouxhere.com/zhouxhere/maptile/docs" "git.zhouxhere.com/zhouxhere/maptile/store" ) type MapService struct { *echo.Echo store *store.Store } func NewMapService(e *echo.Echo, s *store.Store) { service := &MapService{e, s} service.Use(middleware.Recover()) service.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{LogStatus: true, LogURI: true, LogError: true, HandleError: true, // forwards error to the global error handler, so it can decide appropriate status code LogValuesFunc: func(c echo.Context, v middleware.RequestLoggerValues) error { if v.Error != nil { slog.LogAttrs(context.Background(), slog.LevelError, "REQUEST", slog.String("method", v.Method), slog.String("uri", v.URI), slog.Int("status", v.Status), slog.String("latency", v.Latency.String()), slog.String("error", v.Error.Error())) } else { slog.LogAttrs(context.Background(), slog.LevelInfo, "REQUEST", slog.String("method", v.Method), slog.String("uri", v.URI), slog.Int("status", v.Status), slog.String("latency", v.Latency.String())) } return nil }, })) service.HTTPErrorHandler = func(err error, c echo.Context) { req := c.Request() slog.LogAttrs(context.Background(), slog.LevelError, "REQUEST", slog.String("method", req.Method), slog.String("uri", req.RequestURI), slog.String("error", err.Error())) c.JSON(http.StatusOK, err) } service.Use(middleware.CORSWithConfig(middleware.CORSConfig{ AllowOrigins: []string{"*"}, AllowMethods: []string{http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete}, // AllowHeaders: []string{"Content-Type", "Authorization"}, })) service.Register() for _, route := range service.Routes() { fmt.Println(route.Method, route.Path) } } func (s *MapService) Register() { group := s.Group("/map") // style group.Static("/style", "./style") // mbtiles group.GET("/mbtiles/:name", s.GetMBTilesByName) group.GET("/mbtiles/:name/:z/:x/:y", s.GetMBTilesByNameAndZAndXAndY) // pmtiles group.GET("/pmtiles/:name", s.GetPMTilesByName) group.GET("/pmtiles/:name/:z/:x/:y", s.GetPMTilesByNameAndZAndXAndY) // postgis // group.GET("/postgis/:name", s.GetPostGISByName) }