package server import ( "brainbuffer/pkg/brainbuffer/domain/task" "brainbuffer/pkg/brainbuffer/infrastructure" apperrors "brainbuffer/pkg/brainbuffer/infrastructure/errors" "github.com/jackc/pgx/v4/pgxpool" "github.com/knadh/koanf" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/rs/zerolog/log" "net/http" ) func New(context *infrastructure.Context) *echo.Echo { server := echo.New() server.HTTPErrorHandler = errorHandler(server) registerHandlers(server, context.Database) registerMiddleware(server, context.Config) return server } func registerHandlers(server *echo.Echo, pool *pgxpool.Pool) { task.AddHandlers(server) } func registerMiddleware(server *echo.Echo, conf *koanf.Koanf) { server.Use(middleware.CORS()) server.Use(Logger()) server.Use(middleware.JWTWithConfig(middleware.JWTConfig{ Skipper: func(ctx echo.Context) bool { return false }, SigningMethod: middleware.AlgorithmHS256, SigningKey: conf.Bytes("jwt.key"), })) } func errorHandler(s *echo.Echo) echo.HTTPErrorHandler { return func(err error, c echo.Context) { mappedErr := err switch v := err.(type) { case apperrors.NotFoundError: mappedErr = echo.NewHTTPError(http.StatusNotFound, v.Error()) case apperrors.UnknownError: log.Err(v.Err).Send() mappedErr = echo.NewHTTPError(http.StatusInternalServerError) case apperrors.AlreadyExistsError: // TODO: Change status code to hide user identity. mappedErr = echo.NewHTTPError(http.StatusBadRequest, v.Error()) } s.DefaultHTTPErrorHandler(mappedErr, c) } }