mirror of https://github.com/chaitin/PandaWiki.git
66 lines
2.0 KiB
Go
66 lines
2.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/labstack/echo/v4"
|
|
"go.opentelemetry.io/otel/attribute"
|
|
"go.opentelemetry.io/otel/trace"
|
|
|
|
"github.com/chaitin/panda-wiki/config"
|
|
"github.com/chaitin/panda-wiki/domain"
|
|
"github.com/chaitin/panda-wiki/log"
|
|
"github.com/chaitin/panda-wiki/middleware"
|
|
"github.com/chaitin/panda-wiki/pkg/captcha"
|
|
)
|
|
|
|
type BaseHandler struct {
|
|
Router *echo.Echo
|
|
baseLogger *log.Logger
|
|
config *config.Config
|
|
ShareAuthMiddleware *middleware.ShareAuthMiddleware
|
|
V1Auth middleware.AuthMiddleware
|
|
Captcha *captcha.Captcha
|
|
}
|
|
|
|
func NewBaseHandler(echo *echo.Echo, logger *log.Logger, config *config.Config, v1Auth middleware.AuthMiddleware, shareAuthMiddleware *middleware.ShareAuthMiddleware, cap *captcha.Captcha) *BaseHandler {
|
|
return &BaseHandler{
|
|
Router: echo,
|
|
baseLogger: logger.WithModule("http_base_handler"),
|
|
config: config,
|
|
ShareAuthMiddleware: shareAuthMiddleware,
|
|
V1Auth: v1Auth,
|
|
Captcha: cap,
|
|
}
|
|
}
|
|
|
|
func (h *BaseHandler) NewResponseWithData(c echo.Context, data any) error {
|
|
return c.JSON(http.StatusOK, domain.PWResponse{
|
|
Success: true,
|
|
Data: data,
|
|
})
|
|
}
|
|
|
|
func (h *BaseHandler) NewResponseWithErrCode(c echo.Context, resp domain.PWResponseErrCode) error {
|
|
return c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
func (h *BaseHandler) NewResponseWithError(c echo.Context, msg string, err error) error {
|
|
traceID := ""
|
|
if h.config.GetBool("apm.enabled") {
|
|
span := trace.SpanFromContext(c.Request().Context())
|
|
traceID = span.SpanContext().TraceID().String()
|
|
span.SetAttributes(attribute.String("error", fmt.Sprintf("%+v", err)), attribute.String("msg", msg))
|
|
} else {
|
|
traceID = uuid.New().String()
|
|
}
|
|
h.baseLogger.LogAttrs(c.Request().Context(), slog.LevelError, msg, slog.String("trace_id", traceID), slog.Any("error", err))
|
|
return c.JSON(http.StatusOK, domain.PWResponse{
|
|
Success: false,
|
|
Message: fmt.Sprintf("%s [trace_id: %s]", msg, traceID),
|
|
})
|
|
}
|