init push

This commit is contained in:
2026-05-21 19:52:45 +08:00
commit e3f75311ab
1280 changed files with 179173 additions and 0 deletions

View File

@@ -0,0 +1,165 @@
package share
import (
"net/http"
"strings"
"github.com/labstack/echo/v4"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/handler"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/usecase"
)
type ShareCommentHandler struct {
*handler.BaseHandler
logger *log.Logger
usecase *usecase.CommentUsecase
app *usecase.AppUsecase
}
func NewShareCommentHandler(
e *echo.Echo,
baseHandler *handler.BaseHandler,
logger *log.Logger,
usecase *usecase.CommentUsecase,
app *usecase.AppUsecase,
) *ShareCommentHandler {
h := &ShareCommentHandler{
BaseHandler: baseHandler,
logger: logger.WithModule("handler.share.comment"),
usecase: usecase,
app: app,
}
share := e.Group("share/v1/comment",
func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
c.Response().Header().Set("Access-Control-Allow-Origin", "*")
c.Response().Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
c.Response().Header().Set("Access-Control-Allow-Headers", "Content-Type, Origin, Accept")
if c.Request().Method == "OPTIONS" {
return c.NoContent(http.StatusOK)
}
return next(c)
}
}, h.ShareAuthMiddleware.Authorize)
share.POST("", h.CreateComment)
share.GET("/list", h.GetCommentList)
return h
}
// CreateComment
//
// @Summary CreateComment
// @Description CreateComment
// @Tags share_comment
// @Accept json
// @Produce json
// @Param comment body domain.CommentReq true "Comment"
// @Success 200 {object} domain.PWResponse{data=string} "CommentID"
// @Router /share/v1/comment [post]
func (h *ShareCommentHandler) CreateComment(c echo.Context) error {
ctx := c.Request().Context()
kbID := c.Request().Header.Get("X-KB-ID")
if kbID == "" {
return h.NewResponseWithError(c, "kb_id is required", nil)
}
var req domain.CommentReq
if err := c.Bind(&req); err != nil {
return h.NewResponseWithError(c, "bind comment request failed", err)
}
if err := c.Validate(&req); err != nil {
return h.NewResponseWithError(c, "validate req failed", err)
}
// 校验是否开启了评论
appInfo, err := h.app.GetAppDetailByKBIDAndAppType(ctx, kbID, domain.AppType(domain.AppTypeWeb))
if err != nil {
return h.NewResponseWithError(c, "app info is not found", err)
}
if !appInfo.Settings.WebAppCommentSettings.IsEnable {
return h.NewResponseWithError(c, "please check comment is open", nil)
}
// validate captcha token
if !h.Captcha.ValidateToken(ctx, req.CaptchaToken) {
return h.NewResponseWithError(c, "failed to validate captcha token", nil)
}
for _, url := range req.PicUrls {
if !strings.HasPrefix(url, "/static-file/") {
return h.NewResponseWithError(c, "validate param pic_urls failed", err)
}
}
remoteIP := c.RealIP()
// get user info --> no enterprise is nil
var userIDValue uint
userID := c.Get("user_id")
if userID != nil { // can find userinfo from auth
userIDValue = userID.(uint)
}
var status = 1 // no moderate
// 判断user is moderate comment ---> 默认false
if appInfo.Settings.WebAppCommentSettings.ModerationEnable {
status = 0
}
commentStatus := domain.CommentStatus(status)
// 插入到数据库中
commentID, err := h.usecase.CreateComment(ctx, &req, kbID, remoteIP, commentStatus, userIDValue)
if err != nil {
return h.NewResponseWithError(c, "create comment failed", err)
}
return h.NewResponseWithData(c, commentID)
}
type ShareCommentLists = *domain.PaginatedResult[[]*domain.ShareCommentListItem]
// GetCommentList
//
// @Summary GetCommentList
// @Description GetCommentList
// @Tags share_comment
// @Accept json
// @Produce json
// @Param id query string true "nodeID"
// @Success 200 {object} domain.PWResponse{data=ShareCommentLists} "CommentList
// @Router /share/v1/comment/list [get]
func (h *ShareCommentHandler) GetCommentList(c echo.Context) error {
ctx := c.Request().Context()
kbID := c.Request().Header.Get("X-KB-ID")
if kbID == "" {
return h.NewResponseWithError(c, "kb_id is required", nil)
}
// 拿到node_id即可
nodeID := c.QueryParam("id")
if nodeID == "" {
return h.NewResponseWithError(c, "node id is required", nil)
}
// 校验是否开启了评论
appInfo, err := h.app.GetAppDetailByKBIDAndAppType(ctx, kbID, domain.AppType(domain.AppTypeWeb))
if err != nil {
return h.NewResponseWithError(c, "app info is not found", err)
}
if !appInfo.Settings.WebAppCommentSettings.IsEnable {
return h.NewResponseWithError(c, "please check comment is open", nil)
}
// 查询数据库获取所有评论-->0 所有, 12 为需要审核的评论
commentsList, err := h.usecase.GetCommentListByNodeID(ctx, nodeID)
if err != nil {
return h.NewResponseWithError(c, "failed to get comment list", err)
}
return h.NewResponseWithData(c, commentsList)
}