60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package server
|
|
|
|
import (
|
|
apperrors "brainbuffer/pkg/brainbuffer/errors"
|
|
"brainbuffer/pkg/brainbuffer/task"
|
|
"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(conf *koanf.Koanf, pool *pgxpool.Pool) *echo.Echo {
|
|
server := echo.New()
|
|
|
|
server.HTTPErrorHandler = errorHandler(server)
|
|
|
|
registerHandlers(server, pool)
|
|
registerMiddleware(server, conf)
|
|
|
|
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)
|
|
}
|
|
}
|