Files
YouduWiki/backend/handler/share/comment.go
2026-05-21 19:52:45 +08:00

166 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}