init push
This commit is contained in:
91
backend/handler/share/captcha.go
Normal file
91
backend/handler/share/captcha.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package share
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
gocap "github.com/ackcoder/go-cap"
|
||||
"github.com/getsentry/sentry-go"
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/chaitin/panda-wiki/consts"
|
||||
"github.com/chaitin/panda-wiki/handler"
|
||||
"github.com/chaitin/panda-wiki/log"
|
||||
)
|
||||
|
||||
type ShareCaptchaHandler struct {
|
||||
*handler.BaseHandler
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
func NewShareCaptchaHandler(
|
||||
baseHandler *handler.BaseHandler,
|
||||
echo *echo.Echo,
|
||||
logger *log.Logger,
|
||||
) *ShareCaptchaHandler {
|
||||
h := &ShareCaptchaHandler{
|
||||
BaseHandler: baseHandler,
|
||||
logger: logger.WithModule("handler.share.captcha"),
|
||||
}
|
||||
|
||||
group := echo.Group("share/v1/captcha")
|
||||
group.POST("/challenge", h.CreateCaptcha)
|
||||
group.POST("/redeem", h.RedeemCaptcha)
|
||||
|
||||
return h
|
||||
}
|
||||
|
||||
// CreateCaptcha
|
||||
//
|
||||
// @Summary CreateCaptcha
|
||||
// @Description CreateCaptcha
|
||||
// @Tags share_captcha
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param X-KB-ID header string true "kb id"
|
||||
// @Success 200 {object} gocap.ChallengeData
|
||||
// @Router /share/v1/captcha/challenge [post]
|
||||
func (h *ShareCaptchaHandler) CreateCaptcha(c echo.Context) error {
|
||||
kbID := c.Request().Header.Get("X-KB-ID")
|
||||
if kbID == "" {
|
||||
return h.NewResponseWithError(c, "kb_id is required", nil)
|
||||
}
|
||||
data, err := h.Captcha.CreateChallenge(c.Request().Context())
|
||||
if err != nil {
|
||||
return h.NewResponseWithError(c, "create captcha failed", err)
|
||||
}
|
||||
return c.JSON(http.StatusCreated, data)
|
||||
}
|
||||
|
||||
// RedeemCaptcha
|
||||
//
|
||||
// @Summary RedeemCaptcha
|
||||
// @Description RedeemCaptcha
|
||||
// @Tags share_captcha
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param X-KB-ID header string true "kb id"
|
||||
// @Param body body consts.RedeemCaptchaReq true "request"
|
||||
// @Success 200 {object} gocap.VerificationResult
|
||||
// @Router /share/v1/captcha/redeem [post]
|
||||
func (h *ShareCaptchaHandler) RedeemCaptcha(c echo.Context) error {
|
||||
kbID := c.Request().Header.Get("X-KB-ID")
|
||||
if kbID == "" {
|
||||
return h.NewResponseWithError(c, "kb_id is required", nil)
|
||||
}
|
||||
var req consts.RedeemCaptchaReq
|
||||
if err := c.Bind(&req); err != nil {
|
||||
return h.NewResponseWithError(c, "request is invalid", err)
|
||||
}
|
||||
data, err := h.Captcha.RedeemChallenge(c.Request().Context(), req.Token, req.Solutions)
|
||||
if err != nil {
|
||||
sentry.CaptureException(err)
|
||||
return c.JSON(http.StatusInternalServerError, gocap.VerificationResult{
|
||||
Success: false,
|
||||
Message: err.Error(),
|
||||
})
|
||||
}
|
||||
return c.JSON(http.StatusCreated, gocap.VerificationResult{
|
||||
Success: true,
|
||||
TokenData: data,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user