package admin import ( "context" "errors" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" "github.com/go-sonic/sonic/consts" "github.com/go-sonic/sonic/handler/binding" "github.com/go-sonic/sonic/handler/trans" "github.com/go-sonic/sonic/model/dto" "github.com/go-sonic/sonic/model/entity" "github.com/go-sonic/sonic/model/param" "github.com/go-sonic/sonic/model/property" "github.com/go-sonic/sonic/model/vo" "github.com/go-sonic/sonic/service" "github.com/go-sonic/sonic/service/assembler" "github.com/go-sonic/sonic/service/impl" "github.com/go-sonic/sonic/util" "github.com/go-sonic/sonic/util/xerr" ) type SheetCommentHandler struct { SheetCommentService service.SheetCommentService BaseCommentService service.BaseCommentService OptionService service.OptionService SheetService service.SheetService SheetAssembler assembler.SheetAssembler SheetCommentAssembler assembler.SheetCommentAssembler } func NewSheetCommentHandler( sheetCommentService service.SheetCommentService, baseCommentService service.BaseCommentService, optionService service.OptionService, sheetService service.SheetService, sheetAssembler assembler.SheetAssembler, sheetCommentAssembler assembler.SheetCommentAssembler, ) *SheetCommentHandler { return &SheetCommentHandler{ SheetCommentService: sheetCommentService, BaseCommentService: baseCommentService, OptionService: optionService, SheetService: sheetService, SheetAssembler: sheetAssembler, SheetCommentAssembler: sheetCommentAssembler, } } func (s *SheetCommentHandler) ListSheetComment(ctx *gin.Context) (interface{}, error) { var commentQuery param.CommentQuery err := ctx.ShouldBindWith(&commentQuery, binding.CustomFormBinding) if err != nil { return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("Parameter error") } commentQuery.Sort = ¶m.Sort{ Fields: []string{"createTime,desc"}, } comments, totalCount, err := s.SheetCommentService.Page(ctx, commentQuery, consts.CommentTypeSheet) if err != nil { return nil, err } commentDTOs, err := s.ConvertToWithSheet(ctx, comments) if err != nil { return nil, err } return dto.NewPage(commentDTOs, totalCount, commentQuery.Page), nil } func (s *SheetCommentHandler) ListSheetCommentLatest(ctx *gin.Context) (interface{}, error) { top, err := util.MustGetQueryInt32(ctx, "top") if err != nil { return nil, err } commentQuery := param.CommentQuery{ Sort: ¶m.Sort{Fields: []string{"createTime,desc"}}, Page: param.Page{PageNum: 0, PageSize: int(top)}, } comments, _, err := s.SheetCommentService.Page(ctx, commentQuery, consts.CommentTypeSheet) if err != nil { return nil, err } return s.ConvertToWithSheet(ctx, comments) } func (s *SheetCommentHandler) ListSheetCommentAsTree(ctx *gin.Context) (interface{}, error) { postID, err := util.ParamInt32(ctx, "sheetID") if err != nil { return nil, err } pageNum, err := util.MustGetQueryInt32(ctx, "page") if err != nil { return nil, err } pageSize, err := s.OptionService.GetOrByDefaultWithErr(ctx, property.CommentPageSize, property.CommentPageSize.DefaultValue) if err != nil { return nil, err } page := param.Page{PageSize: pageSize.(int), PageNum: int(pageNum)} allComments, err := s.SheetCommentService.GetByContentID(ctx, postID, consts.CommentTypeSheet, ¶m.Sort{Fields: []string{"createTime,desc"}}) if err != nil { return nil, err } commentVOs, totalCount, err := s.SheetCommentAssembler.PageConvertToVOs(ctx, allComments, page) if err != nil { return nil, err } return dto.NewPage(commentVOs, totalCount, page), nil } func (s *SheetCommentHandler) ListSheetCommentWithParent(ctx *gin.Context) (interface{}, error) { postID, err := util.ParamInt32(ctx, "sheetID") if err != nil { return nil, err } pageNum, err := util.MustGetQueryInt32(ctx, "page") if err != nil { return nil, err } pageSize, err := s.OptionService.GetOrByDefaultWithErr(ctx, property.CommentPageSize, property.CommentPageSize.DefaultValue) if err != nil { return nil, err } page := param.Page{PageSize: pageSize.(int), PageNum: int(pageNum)} comments, totalCount, err := s.SheetCommentService.Page(ctx, param.CommentQuery{ ContentID: &postID, Page: page, Sort: ¶m.Sort{Fields: []string{"createTime,desc"}}, }, consts.CommentTypePost) if err != nil { return nil, err } commentsWithParent, err := s.SheetCommentAssembler.ConvertToWithParentVO(ctx, comments) if err != nil { return nil, err } return dto.NewPage(commentsWithParent, totalCount, page), nil } func (s *SheetCommentHandler) CreateSheetComment(ctx *gin.Context) (interface{}, error) { var commentParam *param.AdminComment err := ctx.ShouldBindJSON(&commentParam) if err != nil { e := validator.ValidationErrors{} if errors.As(err, &e) { return nil, xerr.WithStatus(e, xerr.StatusBadRequest).WithMsg(trans.Translate(e)) } return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("parameter error") } user, err := impl.MustGetAuthorizedUser(ctx) if err != nil || user == nil { return nil, err } blogURL, err := s.OptionService.GetBlogBaseURL(ctx) if err != nil { return nil, err } commonParam := param.Comment{ Author: user.Username, Email: user.Email, AuthorURL: blogURL, Content: commentParam.Content, PostID: commentParam.PostID, ParentID: commentParam.ParentID, AllowNotification: true, CommentType: consts.CommentTypeSheet, } comment, err := s.BaseCommentService.CreateBy(ctx, &commonParam) if err != nil { return nil, err } return s.SheetCommentAssembler.ConvertToDTO(ctx, comment) } func (s *SheetCommentHandler) UpdateSheetCommentStatus(ctx *gin.Context) (interface{}, error) { commentID, err := util.ParamInt32(ctx, "commentID") if err != nil { return nil, err } strStatus, err := util.ParamString(ctx, "status") if err != nil { return nil, err } status, err := consts.CommentStatusFromString(strStatus) if err != nil { return nil, err } return s.SheetCommentService.UpdateStatus(ctx, commentID, status) } func (s *SheetCommentHandler) UpdateSheetCommentStatusBatch(ctx *gin.Context) (interface{}, error) { status, err := util.ParamInt32(ctx, "status") if err != nil { return nil, err } ids := make([]int32, 0) err = ctx.ShouldBindJSON(&ids) if err != nil { return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("post ids error") } comments, err := s.SheetCommentService.UpdateStatusBatch(ctx, ids, consts.CommentStatus(status)) if err != nil { return nil, err } return s.SheetCommentAssembler.ConvertToDTOList(ctx, comments) } func (s *SheetCommentHandler) DeleteSheetComment(ctx *gin.Context) (interface{}, error) { commentID, err := util.ParamInt32(ctx, "commentID") if err != nil { return nil, err } return nil, s.SheetCommentService.Delete(ctx, commentID) } func (s *SheetCommentHandler) DeleteSheetCommentBatch(ctx *gin.Context) (interface{}, error) { ids := make([]int32, 0) err := ctx.ShouldBindJSON(&ids) if err != nil { return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("post ids error") } return nil, s.SheetCommentService.DeleteBatch(ctx, ids) } func (s *SheetCommentHandler) ConvertToWithSheet(ctx context.Context, comments []*entity.Comment) ([]*vo.SheetCommentWithSheet, error) { postIDs := make([]int32, 0, len(comments)) for _, comment := range comments { postIDs = append(postIDs, comment.PostID) } posts, err := s.SheetService.GetByPostIDs(ctx, postIDs) if err != nil { return nil, err } result := make([]*vo.SheetCommentWithSheet, 0, len(comments)) for _, comment := range comments { commentDTO, err := s.SheetCommentAssembler.ConvertToDTO(ctx, comment) if err != nil { return nil, err } commentWithSheet := &vo.SheetCommentWithSheet{ Comment: *commentDTO, } result = append(result, commentWithSheet) post, ok := posts[comment.PostID] if ok { commentWithSheet.PostMinimal, err = s.SheetAssembler.ConvertToMinimalDTO(ctx, post) if err != nil { return nil, err } } } return result, nil }