init push
This commit is contained in:
165
backend/handler/share/comment.go
Normal file
165
backend/handler/share/comment.go
Normal 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 所有, 1,2 为需要审核的评论
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user