web/context.go

150 lines
3.2 KiB
Go

package web
import (
"errors"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"log/slog"
"net/http"
)
type HandlerFunc func(c *Context) error
type Context struct {
echo.Context
csrfConfig *middleware.CSRFConfig
}
func CustomContext(csrfConfig *middleware.CSRFConfig) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
cc := &Context{
Context: c,
csrfConfig: csrfConfig,
}
return next(cc)
}
}
}
func (c *Context) View(code int, filename string, obj interface{}) error {
if mapContext, ok := obj.(map[string]interface{}); ok {
viewData := mapContext
viewData["request"] = c.Request()
viewData["csrf"] = c.CSRF()
obj = viewData
}
return c.Context.Render(code, filename, obj)
}
func (c *Context) DtoError(err error) error {
switch err.(type) {
case *NotFoundError:
return echo.NewHTTPError(http.StatusNotFound, "Not found")
case *InternalError:
return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error")
case *InvalidRequestError:
return echo.NewHTTPError(http.StatusBadRequest, "Bad request")
default:
return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error")
}
}
func (c *Context) NotFound() error {
return echo.NewHTTPError(http.StatusNotFound)
}
func (c *Context) InternalServerError(err ...error) error {
if err != nil && len(err) > 0 {
slog.Error("", err)
}
return echo.NewHTTPError(http.StatusInternalServerError)
}
func Handle(handler HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
return handler(c.(*Context))
}
}
func (c *Context) CSRF() string {
return c.Get(middleware.DefaultCSRFConfig.ContextKey).(string)
}
func (c *Context) GetFormData() (map[string]string, error) {
var err error
ret := make(map[string]string)
//c.MultipartForm()
contentType := c.Request().Header.Get("Content-Type")
if contentType == "multipart/form-data" {
err = c.Request().ParseMultipartForm(4 * 1024 * 1024)
} else if contentType == "application/x-www-form-urlencoded" {
err = c.Request().ParseForm()
} else {
err = errors.New("unsupported content type")
}
if err != nil {
return nil, err
}
for k, v := range c.Request().PostForm {
ret[k] = v[len(v)-1]
}
return ret, nil
}
/*
func requestQueryToFilter(c *Context, params map[string]string) (i2bolt.Filter, map[string]string) {
var subFilters []i2bolt.Filter
filterParams := make(map[string]string)
query := c.Request().URL.Query()
for param, fieldMethod := range params {
if v, ok := query[param]; ok {
value := strings.TrimSpace(v[0])
if value != "" {
parts := strings.Split(fieldMethod, "__")
fieldName := parts[0]
method := ""
if len(parts) > 1 {
method = parts[1]
}
var valueIntf interface{}
valueIntf = value
if method == "is" {
valueIntf = value == "yes"
}
fieldNames := strings.Split(fieldName, "|")
for _, name := range fieldNames {
subFilters = append(subFilters, i2bolt.Q(name, method, valueIntf))
filterParams[param] = value
}
} else {
filterParams[param] = ""
}
}
}
var filter i2bolt.Filter
if len(subFilters) > 0 {
filter = i2bolt.And(subFilters...)
}
return filter, filterParams
}
*/