maptile/service/map.go

76 lines
2.3 KiB
Go

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)
}