166 lines
4.7 KiB
Go
166 lines
4.7 KiB
Go
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)
|
||
}
|