CommentManager.java 8.81 KB
Newer Older
刘基明's avatar
刘基明 committed
1 2
package com.tanpu.community.manager;

王亚雷's avatar
王亚雷 committed
3
import com.google.common.collect.Sets;
张辰's avatar
张辰 committed
4 5 6
import com.tanpu.biz.common.enums.community.CollectionTypeEnum;
import com.tanpu.biz.common.enums.community.CommentTypeEnum;
import com.tanpu.biz.common.enums.community.ReportTypeEnum;
刘基明's avatar
刘基明 committed
7
import com.tanpu.common.api.CommonResp;
8
import com.tanpu.common.constant.ErrorCodeConstant;
刘基明's avatar
刘基明 committed
9
import com.tanpu.common.exception.BizException;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.qo.CommentQo;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.beans.req.comment.CreateCommentReq;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.beans.req.comment.LikeCommentReq;
13
import com.tanpu.community.api.beans.req.comment.ReportCommentReq;
14
import com.tanpu.community.api.beans.vo.feign.fatools.UserInfoResp;
15
import com.tanpu.community.api.constants.BizConstant;
刘基明's avatar
刘基明 committed
16
import com.tanpu.community.api.enums.NotificationTypeEnum;
刘基明's avatar
刘基明 committed
17
import com.tanpu.community.api.enums.OperationTypeEnum;
张辰's avatar
张辰 committed
18
import com.tanpu.community.cache.RedisCache;
刘基明's avatar
刘基明 committed
19
import com.tanpu.community.dao.entity.community.CommentEntity;
刘基明's avatar
刘基明 committed
20
import com.tanpu.community.dao.entity.community.ThemeEntity;
刘基明's avatar
刘基明 committed
21
import com.tanpu.community.feign.fatools.FeignClientForFatools;
刘基明's avatar
刘基明 committed
22 23
import com.tanpu.community.service.CollectionService;
import com.tanpu.community.service.CommentService;
刘基明's avatar
刘基明 committed
24
import com.tanpu.community.service.NotificationService;
25
import com.tanpu.community.service.ReportLogService;
刘基明's avatar
刘基明 committed
26
import com.tanpu.community.service.ThemeService;
刘基明's avatar
刘基明 committed
27
import com.tanpu.community.util.ConvertUtil;
张辰's avatar
张辰 committed
28
import org.apache.commons.lang3.StringUtils;
刘基明's avatar
刘基明 committed
29 30
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
刘基明's avatar
刘基明 committed
31
import org.springframework.transaction.annotation.Transactional;
刘基明's avatar
刘基明 committed
32

刘基明's avatar
刘基明 committed
33
import javax.annotation.Resource;
34
import java.time.LocalDateTime;
刘基明's avatar
刘基明 committed
35
import java.util.Comparator;
刘基明's avatar
刘基明 committed
36 37
import java.util.List;
import java.util.Set;
刘基明's avatar
刘基明 committed
38
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
39

刘基明's avatar
刘基明 committed
40
import static com.tanpu.community.api.constants.RedisKeyConstant.CACHE_FEIGN_USER_INFO;
张辰's avatar
张辰 committed
41

刘基明's avatar
刘基明 committed
42 43 44 45 46 47 48
@Service
public class CommentManager {

    @Autowired
    private CommentService commentService;

    @Autowired
刘基明's avatar
刘基明 committed
49
    private FeignClientForFatools feignClientForFatools;
刘基明's avatar
刘基明 committed
50 51 52 53

    @Autowired
    private CollectionService collectionService;

刘基明's avatar
刘基明 committed
54
    @Resource
55
    private ReportLogService reportLogService;
刘基明's avatar
刘基明 committed
56

张辰's avatar
张辰 committed
57 58 59
    @Autowired
    private RedisCache redisCache;

刘基明's avatar
刘基明 committed
60 61
    @Autowired
    private NotificationService notificationService;
刘基明's avatar
刘基明 committed
62

刘基明's avatar
刘基明 committed
63 64
    @Autowired
    private ThemeService themeService;
刘基明's avatar
刘基明 committed
65

刘基明's avatar
刘基明 committed
66
    // 评论(对主题)
刘基明's avatar
刘基明 committed
67
    // 发表评论(对主题)
刘基明's avatar
刘基明 committed
68
    public CommentQo comment(CreateCommentReq req, String userId) {
69

70 71 72
        if (StringUtils.isEmpty(req.getComment())) {
            throw new IllegalArgumentException("评论内容不能为空");
        }
刘基明's avatar
刘基明 committed
73
        if (req.getComment().length() > 500) {
74 75 76
            throw new IllegalArgumentException("评论内容不能超过500字");
        }

77
        LocalDateTime now = LocalDateTime.now();
刘基明's avatar
刘基明 committed
78 79 80 81 82
        CommentEntity commentEntity = CommentEntity.builder()
                .themeId(req.getThemeId())
                .parentId(req.getParentId())
                .replyId(req.getReplyId())
                .authorId(userId)
刘基明's avatar
刘基明 committed
83
                .content(req.getComment())
刘基明's avatar
刘基明 committed
84
                .commentType(CommentTypeEnum.THEME.getCode())
85 86
                .createTime(now)
                .updateTime(now)
刘基明's avatar
刘基明 committed
87 88 89
                .build();

        commentService.insertComment(commentEntity);
刘基明's avatar
刘基明 committed
90 91
        CommentQo commentQo = ConvertUtil.commentEntity2Qo(commentEntity);
        buildUserInfo(commentQo);
刘基明's avatar
刘基明 committed
92 93
        // 消息通知
        ThemeEntity themeEntity = themeService.queryByThemeId(req.getThemeId());
刘基明's avatar
刘基明 committed
94 95
        if (themeEntity == null) {
            throw new BizException(ErrorCodeConstant.UNREACHABLE);
96
        }
刘基明's avatar
刘基明 committed
97 98
        notificationService.insert(userId, themeEntity.getAuthorId(), NotificationTypeEnum.COMMENT, commentEntity.getCommentId(), req.getComment());
        notificationService.putNotifyCache(themeEntity.getAuthorId(), userId, NotificationTypeEnum.COMMENT);
99 100 101 102 103 104

        // 评论同步转发并消息通知
        if (req.getSyncForward() == BizConstant.SyncForwardType.SYNC_FORWARD) {
            String themeId = themeService.commentSyncForward(req, userId);

            // 消息通知
刘基明's avatar
刘基明 committed
105 106 107
            ThemeEntity commentTheme = themeService.queryByThemeId(req.getThemeId());
            notificationService.insertForward(userId, commentTheme.getAuthorId(), commentTheme.getThemeId(), "", req.getComment(), themeId);
            notificationService.putNotifyCache(commentTheme.getAuthorId(), userId, NotificationTypeEnum.FORWARD);
108 109 110
        }


刘基明's avatar
刘基明 committed
111
        return commentQo;
刘基明's avatar
刘基明 committed
112 113
    }

刘基明's avatar
刘基明 committed
114
    // 查询评论
刘基明's avatar
刘基明 committed
115
    public List<CommentQo> queryComments(String themeId, String userId) {
刘基明's avatar
刘基明 committed
116 117
        // 因为需要排序,所以从库中查询所有评论
        List<CommentEntity> commentEntities = commentService.selectByThemeId(themeId);
刘基明's avatar
刘基明 committed
118 119
        List<CommentQo> commentQos = ConvertUtil.commentEntity2Qos(commentEntities);

王亚雷's avatar
王亚雷 committed
120 121 122 123 124 125
        Set<String> likeCommentList;
        if (StringUtils.isNotEmpty(userId)) {
            likeCommentList = collectionService.getSetByUser(userId, CollectionTypeEnum.LIKE_COMMENT);
        } else {
            likeCommentList = Sets.newHashSetWithExpectedSize(0);
        }
刘基明's avatar
刘基明 committed
126 127

        for (CommentQo commentQo : commentQos) {
刘基明's avatar
刘基明 committed
128 129 130
            // 封装用户信息
            buildUserInfo(commentQo);
            // 是否点赞及点赞数
刘基明's avatar
刘基明 committed
131
            String commentId = commentQo.getCommentId();
刘基明's avatar
刘基明 committed
132
            commentQo.setHasLiked(likeCommentList.contains(commentId));
刘基明's avatar
刘基明 committed
133
            Integer countByTypeAndId = collectionService.getCountByTypeAndId(commentId, CollectionTypeEnum.LIKE_COMMENT);
刘基明's avatar
刘基明 committed
134 135 136
            commentQo.setLikeCount(countByTypeAndId);

        }
刘基明's avatar
刘基明 committed
137
        //排序:点赞降序+时间降序
刘基明's avatar
刘基明 committed
138 139
        return commentQos.stream().sorted(Comparator.comparing(CommentQo::getLikeCount, Comparator.reverseOrder()).
                thenComparing(CommentQo::getUpdateTime, Comparator.reverseOrder()))
刘基明's avatar
刘基明 committed
140
                .collect(Collectors.toList());
刘基明's avatar
刘基明 committed
141
    }
刘基明's avatar
刘基明 committed
142

刘基明's avatar
刘基明 committed
143 144 145 146

    private void buildUserInfo(CommentQo commentQo) {
        String authorId = commentQo.getAuthorId();
        UserInfoResp userInfo = redisCache.getObject(StringUtils.joinWith("_", CACHE_FEIGN_USER_INFO, authorId),
刘基明's avatar
刘基明 committed
147
                60, () -> this.getUserInfo(authorId), UserInfoResp.class);
刘基明's avatar
刘基明 committed
148 149 150 151 152 153 154 155 156 157 158 159 160
        if (userInfo != null) {
            commentQo.setUserImg(userInfo.getHeadImageUrl());
            commentQo.setNickName(userInfo.getNickName());
            commentQo.setUserType(userInfo.getUserType());
            commentQo.setLevelGrade(userInfo.getLevelGrade());
            commentQo.setUserInvestorType(userInfo.getUserInvestorType());
            commentQo.setBelongUserOrgId(userInfo.getBelongUserOrgId());
            commentQo.setBelongUserOrgName(userInfo.getBelongUserOrgName());
        }
        commentQo.setHasLiked(false);
        commentQo.setLikeCount(0);
    }

刘基明's avatar
刘基明 committed
161
    private UserInfoResp getUserInfo(String authorId) {
162
        CommonResp<UserInfoResp> userInfoNewCommonResp = feignClientForFatools.queryUserInfoNew(authorId);
刘基明's avatar
刘基明 committed
163 164 165 166 167 168
        if (userInfoNewCommonResp.isNotSuccess()) {
            throw new BizException("内部接口调用失败");
        }
        return userInfoNewCommonResp.getData();
    }

刘基明's avatar
刘基明 committed
169 170
    //点赞评论/取消点赞
    public void likeComment(LikeCommentReq req, String userId) {
刘基明's avatar
刘基明 committed
171
        if (OperationTypeEnum.CONFIRM.getCode().equals(req.getType())) {
172
            boolean b = collectionService.saveOrUpdate(req.getCommentId(), userId, CollectionTypeEnum.LIKE_COMMENT);
刘基明's avatar
刘基明 committed
173
            if (b) {
174
                CommentEntity commentEntity = commentService.queryByCommentId(req.getCommentId());
刘基明's avatar
刘基明 committed
175
                notificationService.insertLikeComment(userId, commentEntity.getAuthorId(), req.getCommentId());
176 177
                notificationService.putNotifyCache(commentEntity.getAuthorId(), userId, NotificationTypeEnum.COMMENT_LIKE);
            }
刘基明's avatar
刘基明 committed
178

刘基明's avatar
刘基明 committed
179
        } else if (OperationTypeEnum.CANCEL.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
180 181 182 183
            collectionService.delete(req.getCommentId(), userId, CollectionTypeEnum.LIKE_COMMENT);
        }

    }
184 185

    //举报评论
刘基明's avatar
刘基明 committed
186
    @Transactional
187 188 189
    public void report(ReportCommentReq req, String userId) {
        //更改举报状态
        commentService.updateReportStatus(req.getCommentId());
刘基明's avatar
刘基明 committed
190
        //写入举报记录表
刘基明's avatar
刘基明 committed
191
        CommentEntity commentEntity = commentService.queryByIdIncludeDelete(req.getCommentId());
刘基明's avatar
刘基明 committed
192
        reportLogService.insert(ReportTypeEnum.COMMENT, userId, req.getCommentId(), commentEntity.getAuthorId(), req.getReason());
193
    }
刘基明's avatar
刘基明 committed
194 195 196 197


    //删除评论
    public void delete(String commentId, String userId) {
198 199 200
        if (StringUtils.isBlank(commentId)){
            throw new BizException("commentId不能为空");
        }
刘基明's avatar
刘基明 committed
201
        commentService.delete(commentId, userId);
202 203
        CommentEntity commentEntity = commentService.queryByIdIncludeDelete(commentId);
        ThemeEntity themeEntity = themeService.queryByThemeId(commentEntity.getThemeId());
刘基明's avatar
刘基明 committed
204
        notificationService.deleteCommentNotify(themeEntity.getAuthorId(), userId, commentId, commentEntity.getCreateTime());
205

刘基明's avatar
刘基明 committed
206
    }
刘基明's avatar
刘基明 committed
207

刘基明's avatar
刘基明 committed
208
}