You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sonic/handler/content/api/sheet.go

179 lines
5.7 KiB
Go

package api
import (
"html/template"
"github.com/gin-gonic/gin"
"github.com/go-sonic/sonic/consts"
"github.com/go-sonic/sonic/handler/binding"
"github.com/go-sonic/sonic/model/dto"
"github.com/go-sonic/sonic/model/param"
"github.com/go-sonic/sonic/model/property"
"github.com/go-sonic/sonic/service"
"github.com/go-sonic/sonic/service/assembler"
"github.com/go-sonic/sonic/util"
"github.com/go-sonic/sonic/util/xerr"
)
type SheetHandler struct {
OptionService service.OptionService
SheetService service.SheetService
SheetCommentService service.SheetCommentService
SheetCommentAssembler assembler.SheetCommentAssembler
}
func NewSheetHandler(
optionService service.OptionService,
sheetService service.SheetService,
sheetCommentService service.SheetCommentService,
sheetCommentAssembler assembler.SheetCommentAssembler,
) *SheetHandler {
return &SheetHandler{
OptionService: optionService,
SheetService: sheetService,
SheetCommentService: sheetCommentService,
SheetCommentAssembler: sheetCommentAssembler,
}
}
func (j *SheetHandler) ListTopComment(ctx *gin.Context) (interface{}, error) {
sheetID, err := util.ParamInt32(ctx, "sheetID")
if err != nil {
return nil, err
}
pageSize := j.OptionService.GetOrByDefault(ctx, property.CommentPageSize).(int)
commentQuery := param.CommentQuery{}
err = ctx.ShouldBindWith(&commentQuery, binding.CustomFormBinding)
if err != nil {
return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("Parameter error")
}
if commentQuery.Sort != nil && len(commentQuery.Fields) > 0 {
commentQuery.Sort = &param.Sort{
Fields: []string{"createTime,desc"},
}
}
commentQuery.ContentID = &sheetID
commentQuery.Keyword = nil
commentQuery.CommentStatus = consts.CommentStatusPublished.Ptr()
commentQuery.PageSize = pageSize
commentQuery.ParentID = util.Int32Ptr(0)
comments, totalCount, err := j.SheetCommentService.Page(ctx, commentQuery, consts.CommentTypeSheet)
if err != nil {
return nil, err
}
_ = j.SheetCommentAssembler.ClearSensitiveField(ctx, comments)
commenVOs, err := j.SheetCommentAssembler.ConvertToWithHasChildren(ctx, comments)
if err != nil {
return nil, err
}
return dto.NewPage(commenVOs, totalCount, commentQuery.Page), nil
}
func (j *SheetHandler) ListChildren(ctx *gin.Context) (interface{}, error) {
sheetID, err := util.ParamInt32(ctx, "sheetID")
if err != nil {
return nil, err
}
parentID, err := util.ParamInt32(ctx, "parentID")
if err != nil {
return nil, err
}
children, err := j.SheetCommentService.GetChildren(ctx, parentID, sheetID, consts.CommentTypeSheet)
if err != nil {
return nil, err
}
_ = j.SheetCommentAssembler.ClearSensitiveField(ctx, children)
return j.SheetCommentAssembler.ConvertToDTOList(ctx, children)
}
func (p *SheetHandler) ListCommentTree(ctx *gin.Context) (interface{}, error) {
sheetID, err := util.ParamInt32(ctx, "sheetID")
if err != nil {
return nil, err
}
pageSize := p.OptionService.GetOrByDefault(ctx, property.CommentPageSize).(int)
commentQuery := param.CommentQuery{}
err = ctx.ShouldBindWith(&commentQuery, binding.CustomFormBinding)
if err != nil {
return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("Parameter error")
}
if commentQuery.Sort != nil && len(commentQuery.Fields) > 0 {
commentQuery.Sort = &param.Sort{
Fields: []string{"createTime,desc"},
}
}
commentQuery.ContentID = &sheetID
commentQuery.Keyword = nil
commentQuery.CommentStatus = consts.CommentStatusPublished.Ptr()
commentQuery.PageSize = pageSize
commentQuery.ParentID = util.Int32Ptr(0)
allComments, err := p.SheetCommentService.GetByContentID(ctx, sheetID, consts.CommentTypeSheet, commentQuery.Sort)
if err != nil {
return nil, err
}
_ = p.SheetCommentAssembler.ClearSensitiveField(ctx, allComments)
commentVOs, total, err := p.SheetCommentAssembler.PageConvertToVOs(ctx, allComments, commentQuery.Page)
if err != nil {
return nil, err
}
return dto.NewPage(commentVOs, total, commentQuery.Page), nil
}
func (p *SheetHandler) ListComment(ctx *gin.Context) (interface{}, error) {
sheetID, err := util.ParamInt32(ctx, "sheetID")
if err != nil {
return nil, err
}
pageSize := p.OptionService.GetOrByDefault(ctx, property.CommentPageSize).(int)
commentQuery := param.CommentQuery{}
err = ctx.ShouldBindWith(&commentQuery, binding.CustomFormBinding)
if err != nil {
return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("Parameter error")
}
if commentQuery.Sort != nil && len(commentQuery.Fields) > 0 {
commentQuery.Sort = &param.Sort{
Fields: []string{"createTime,desc"},
}
}
commentQuery.ContentID = &sheetID
commentQuery.Keyword = nil
commentQuery.CommentStatus = consts.CommentStatusPublished.Ptr()
commentQuery.PageSize = pageSize
commentQuery.ParentID = util.Int32Ptr(0)
comments, total, err := p.SheetCommentService.Page(ctx, commentQuery, consts.CommentTypeSheet)
if err != nil {
return nil, err
}
_ = p.SheetCommentAssembler.ClearSensitiveField(ctx, comments)
result, err := p.SheetCommentAssembler.ConvertToWithParentVO(ctx, comments)
if err != nil {
return nil, err
}
return dto.NewPage(result, total, commentQuery.Page), nil
}
func (p *SheetHandler) CreateComment(ctx *gin.Context) (interface{}, error) {
comment := param.Comment{}
err := ctx.ShouldBindJSON(&p)
if err != nil {
return nil, err
}
comment.Author = template.HTMLEscapeString(comment.Author)
comment.AuthorURL = template.HTMLEscapeString(comment.AuthorURL)
comment.Content = template.HTMLEscapeString(comment.Content)
comment.Email = template.HTMLEscapeString(comment.Email)
comment.CommentType = consts.CommentTypeSheet
result, err := p.SheetCommentService.CreateBy(ctx, &comment)
if err != nil {
return nil, err
}
return p.SheetCommentAssembler.ConvertToDTO(ctx, result)
}