PandaWiki/backend/handler/base.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),
})
}