150 lines
3.2 KiB
Go
150 lines
3.2 KiB
Go
package webserver
|
|
|
|
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
|
|
}
|
|
*/
|