CommentManager.java 9.33 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
        CommentEntity commentEntity = CommentEntity.builder()
                .themeId(req.getThemeId())
                .parentId(req.getParentId())
                .replyId(req.getReplyId())
刘基明's avatar
刘基明 committed
82
                .replyUserId(req.getReplyUserId())
刘基明's avatar
刘基明 committed
83
                .authorId(userId)
刘基明's avatar
刘基明 committed
84
                .content(req.getComment())
刘基明's avatar
刘基明 committed
85
                .commentType(CommentTypeEnum.THEME.getCode())
86 87
                .createTime(now)
                .updateTime(now)
刘基明's avatar
刘基明 committed
88 89 90
                .build();

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

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

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


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

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

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

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

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

刘基明's avatar
刘基明 committed
145 146 147 148

    private void buildUserInfo(CommentQo commentQo) {
        String authorId = commentQo.getAuthorId();
        UserInfoResp userInfo = redisCache.getObject(StringUtils.joinWith("_", CACHE_FEIGN_USER_INFO, authorId),
刘基明's avatar
刘基明 committed
149
                60, () -> this.getUserInfo(authorId), UserInfoResp.class);
刘基明's avatar
刘基明 committed
150 151 152 153 154 155 156 157 158
        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());
        }
刘基明's avatar
刘基明 committed
159
        // 回复用户名
刘基明's avatar
刘基明 committed
160 161 162 163 164 165
        if (StringUtils.isNotBlank(commentQo.getReplyUserId())){
            UserInfoResp replyUser = redisCache.getObject(StringUtils.joinWith("_", CACHE_FEIGN_USER_INFO, authorId),
                    60, () -> this.getUserInfo(commentQo.getReplyUserId()), UserInfoResp.class);
            if (replyUser != null) {
                commentQo.setReplyUserName(replyUser.getNickName());
            }
刘基明's avatar
刘基明 committed
166
        }
刘基明's avatar
刘基明 committed
167

刘基明's avatar
刘基明 committed
168 169 170 171
        commentQo.setHasLiked(false);
        commentQo.setLikeCount(0);
    }

刘基明's avatar
刘基明 committed
172
    private UserInfoResp getUserInfo(String authorId) {
173
        CommonResp<UserInfoResp> userInfoNewCommonResp = feignClientForFatools.queryUserInfoNew(authorId);
刘基明's avatar
刘基明 committed
174 175 176 177 178 179
        if (userInfoNewCommonResp.isNotSuccess()) {
            throw new BizException("内部接口调用失败");
        }
        return userInfoNewCommonResp.getData();
    }

刘基明's avatar
刘基明 committed
180 181
    //点赞评论/取消点赞
    public void likeComment(LikeCommentReq req, String userId) {
刘基明's avatar
刘基明 committed
182
        if (OperationTypeEnum.CONFIRM.getCode().equals(req.getType())) {
183
            boolean b = collectionService.saveOrUpdate(req.getCommentId(), userId, CollectionTypeEnum.LIKE_COMMENT);
刘基明's avatar
刘基明 committed
184
            if (b) {
185
                CommentEntity commentEntity = commentService.queryByCommentId(req.getCommentId());
刘基明's avatar
刘基明 committed
186
                notificationService.insertLikeComment(userId, commentEntity.getAuthorId(), req.getCommentId());
187 188
                notificationService.putNotifyCache(commentEntity.getAuthorId(), userId, NotificationTypeEnum.COMMENT_LIKE);
            }
刘基明's avatar
刘基明 committed
189

刘基明's avatar
刘基明 committed
190
        } else if (OperationTypeEnum.CANCEL.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
191 192 193 194
            collectionService.delete(req.getCommentId(), userId, CollectionTypeEnum.LIKE_COMMENT);
        }

    }
195 196

    //举报评论
刘基明's avatar
刘基明 committed
197
    @Transactional
198 199 200
    public void report(ReportCommentReq req, String userId) {
        //更改举报状态
        commentService.updateReportStatus(req.getCommentId());
刘基明's avatar
刘基明 committed
201
        //写入举报记录表
刘基明's avatar
刘基明 committed
202
        CommentEntity commentEntity = commentService.queryByIdIncludeDelete(req.getCommentId());
刘基明's avatar
刘基明 committed
203
        reportLogService.insert(ReportTypeEnum.COMMENT, userId, req.getCommentId(), commentEntity.getAuthorId(), req.getReason());
204
    }
刘基明's avatar
刘基明 committed
205 206 207 208


    //删除评论
    public void delete(String commentId, String userId) {
刘基明's avatar
刘基明 committed
209
        if (StringUtils.isBlank(commentId)) {
210 211
            throw new BizException("commentId不能为空");
        }
刘基明's avatar
刘基明 committed
212
        commentService.delete(commentId, userId);
213 214
        CommentEntity commentEntity = commentService.queryByIdIncludeDelete(commentId);
        ThemeEntity themeEntity = themeService.queryByThemeId(commentEntity.getThemeId());
刘基明's avatar
刘基明 committed
215
        notificationService.deleteCommentNotify(themeEntity.getAuthorId(), userId, commentId, commentEntity.getCreateTime());
216

刘基明's avatar
刘基明 committed
217
    }
刘基明's avatar
刘基明 committed
218

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