CommentService.java 6.23 KB
Newer Older
刘基明's avatar
刘基明 committed
1 2 3
package com.tanpu.community.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
张辰's avatar
张辰 committed
4
import com.fasterxml.jackson.core.type.TypeReference;
张辰's avatar
张辰 committed
5 6
import com.tanpu.biz.common.enums.community.CommentTypeEnum;
import com.tanpu.biz.common.enums.community.ReportStatusEnum;
刘基明's avatar
刘基明 committed
7
import com.tanpu.common.exception.BizException;
刘基明's avatar
刘基明 committed
8
import com.tanpu.common.uuid.UuidGenHelper;
刘基明's avatar
刘基明 committed
9
import com.tanpu.community.api.enums.DeleteTagEnum;
张辰's avatar
张辰 committed
10
import com.tanpu.community.cache.RedisCache;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.dao.entity.community.CommentEntity;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.dao.entity.community.TimesCountEntity;
刘基明's avatar
刘基明 committed
13
import com.tanpu.community.dao.mapper.community.CommentMapper;
刘基明's avatar
刘基明 committed
14
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
15
import org.apache.commons.lang3.StringUtils;
刘基明's avatar
刘基明 committed
16
import org.springframework.beans.factory.annotation.Autowired;
刘基明's avatar
刘基明 committed
17
import org.springframework.stereotype.Service;
刘基明's avatar
刘基明 committed
18
import org.springframework.transaction.annotation.Transactional;
刘基明's avatar
刘基明 committed
19 20

import javax.annotation.Resource;
刘基明's avatar
刘基明 committed
21
import java.util.HashMap;
刘基明's avatar
刘基明 committed
22
import java.util.List;
刘基明's avatar
刘基明 committed
23
import java.util.Map;
刘基明's avatar
刘基明 committed
24
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
25

26
import static com.tanpu.community.api.constants.RedisKeyConstant.*;
张辰's avatar
张辰 committed
27

刘基明's avatar
刘基明 committed
28 29 30 31 32 33
@Service
public class CommentService {

    @Resource
    private CommentMapper commentMapper;

刘基明's avatar
刘基明 committed
34 35 36
    @Autowired
    private UuidGenHelper uuidGenHelper;

张辰's avatar
张辰 committed
37 38 39
    @Autowired
    private RedisCache redisCache;

刘基明's avatar
刘基明 committed
40
    @Transactional
刘基明's avatar
刘基明 committed
41
    public void insertComment(CommentEntity commentEntity) {
刘基明's avatar
刘基明 committed
42
        commentEntity.setCommentId(uuidGenHelper.getUuidStr());
刘基明's avatar
刘基明 committed
43
        commentMapper.insert(commentEntity);
刘基明's avatar
刘基明 committed
44
        //失效缓存
刘基明's avatar
刘基明 committed
45 46
        evictThemeCache(commentEntity.getThemeId());

刘基明's avatar
刘基明 committed
47 48 49
    }


刘基明's avatar
刘基明 committed
50
    public CommentEntity queryByIdIncludeDelete(String commmentId) {
51 52
        return commentMapper.selectOne(new LambdaQueryWrapper<CommentEntity>()
                .eq(CommentEntity::getCommentId, commmentId));
刘基明's avatar
刘基明 committed
53
    }
刘基明's avatar
刘基明 committed
54 55

    //统计主题集合的评论量
刘基明's avatar
刘基明 committed
56 57
    public Integer getTotalCountByThemeIds(List<String> themeIds) {
        if (CollectionUtils.isEmpty(themeIds)) {
刘基明's avatar
刘基明 committed
58 59
            return 0;
        }
刘基明's avatar
刘基明 committed
60
        return commentMapper.selectList((new LambdaQueryWrapper<CommentEntity>()
刘基明's avatar
刘基明 committed
61 62
                .in(CommentEntity::getThemeId, themeIds))
                .eq(CommentEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED))
刘基明's avatar
刘基明 committed
63 64
                .size();
    }
刘基明's avatar
刘基明 committed
65

刘基明's avatar
刘基明 committed
66 67
    //统计主题集合的评论量
    public Integer getCommentCountByThemeId(String themeId) {
刘基明's avatar
刘基明 committed
68
        return commentMapper.selectList((new LambdaQueryWrapper<CommentEntity>()
刘基明's avatar
刘基明 committed
69 70
                .eq(CommentEntity::getThemeId, themeId))
                .eq(CommentEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED))
刘基明's avatar
刘基明 committed
71 72 73
                .size();
    }

刘基明's avatar
刘基明 committed
74 75 76

    //统计主题集合的评论量
    public Map<String, Integer> getCountMapByThemeIds(List<String> themeIds) {
刘基明's avatar
刘基明 committed
77 78 79
        if (CollectionUtils.isEmpty(themeIds)){
            return new HashMap<>();
        }
刘基明's avatar
刘基明 committed
80 81 82 83 84 85
        LambdaQueryWrapper<CommentEntity> wrapper = (new LambdaQueryWrapper<CommentEntity>()
                .in(CommentEntity::getThemeId, themeIds))
                .eq(CommentEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED)
                .groupBy(CommentEntity::getThemeId);
        return commentMapper.selectCountByThemeIds(wrapper).stream()
                .collect(Collectors.toMap(TimesCountEntity::getId, TimesCountEntity::getTimes));
刘基明's avatar
刘基明 committed
86
    }
刘基明's avatar
刘基明 committed
87

刘基明's avatar
刘基明 committed
88 89
    public List<CommentEntity> selectByThemeId(String themeId) {
        return redisCache.getList(StringUtils.joinWith("_", CACHE_COMMENT_THEMEID, themeId),
张辰's avatar
张辰 committed
90
                60, () -> {
刘基明's avatar
刘基明 committed
91 92 93 94 95 96 97
                    LambdaQueryWrapper<CommentEntity> queryWrapper = new LambdaQueryWrapper<CommentEntity>()
                            .eq(CommentEntity::getThemeId, themeId)
                            .eq(CommentEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode())
                            .orderByDesc(CommentEntity::getCreateTime);
                    return commentMapper.selectList(queryWrapper);
                }, new TypeReference<List<CommentEntity>>() {
                });
刘基明's avatar
刘基明 committed
98 99 100
    }


刘基明's avatar
刘基明 committed
101

刘基明's avatar
刘基明 committed
102
    public List<CommentEntity> queryCommentsByUserId(String userId, String lastId, Integer pageSize) {
刘基明's avatar
刘基明 committed
103 104 105
        LambdaQueryWrapper<CommentEntity> queryWrapper = new LambdaQueryWrapper<CommentEntity>()
                .eq(CommentEntity::getAuthorId, userId)
                .eq(CommentEntity::getCommentType, CommentTypeEnum.THEME.getCode())
刘基明's avatar
刘基明 committed
106 107
                .eq(CommentEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode())
                .orderByDesc(CommentEntity::getCreateTime);
刘基明's avatar
刘基明 committed
108
        if (StringUtils.isNotEmpty(lastId)) {
刘基明's avatar
刘基明 committed
109
            CommentEntity commentEntity = commentMapper.selectOne(new LambdaQueryWrapper<CommentEntity>()
刘基明's avatar
刘基明 committed
110 111
                    .eq(CommentEntity::getCommentId, lastId));
            if (commentEntity == null) throw new BizException("评论未找到,id:" + lastId);
刘基明's avatar
刘基明 committed
112 113
            queryWrapper.lt(CommentEntity::getUpdateTime, commentEntity.getCreateTime());
        }
刘基明's avatar
刘基明 committed
114 115
        if (pageSize != null) {
            queryWrapper.last("limit " + pageSize);
刘基明's avatar
刘基明 committed
116 117 118
        }
        return commentMapper.selectList(queryWrapper);
    }
119

刘基明's avatar
刘基明 committed
120
    //修改举报状态,可修改已删除
121
    public void updateReportStatus(String commentId) {
刘基明's avatar
刘基明 committed
122
        CommentEntity commentEntity = queryByIdIncludeDelete(commentId);
刘基明's avatar
刘基明 committed
123 124
        if (commentEntity == null) {
            throw new BizException("评论未找到,id:" + commentId);
125 126
        }
        commentEntity.setReportStatus(ReportStatusEnum.REPORTED.getCode());
刘基明's avatar
刘基明 committed
127 128 129 130
        commentMapper.updateById(commentEntity);
        //失效缓存
        evictThemeCache(commentEntity.getThemeId());

131
    }
刘基明's avatar
刘基明 committed
132 133 134 135

    //删除评论
    @Transactional
    public void delete(String commentId, String userId) {
刘基明's avatar
刘基明 committed
136
        CommentEntity commentEntity = this.queryByIdIncludeDelete(commentId);
刘基明's avatar
刘基明 committed
137 138 139 140 141
        if (commentEntity==null || !commentEntity.getAuthorId().equals(userId)){
            throw new BizException("删除评论与用户不匹配,commentId:"+commentId+",userId:"+userId);
        }
        commentEntity.setDeleteTag(DeleteTagEnum.DELETED.getCode());
        commentMapper.updateById(commentEntity);
刘基明's avatar
刘基明 committed
142
        //失效缓存
刘基明's avatar
刘基明 committed
143 144 145 146 147 148 149
        evictThemeCache(commentEntity.getThemeId());
    }

    // 失效关联主题缓存
    private void evictThemeCache(String themeId){
        redisCache.evict(StringUtils.joinWith("_", CACHE_COMMENT_THEMEID, themeId));
        redisCache.evict(StringUtils.joinWith("_", CACHE_THEME_ID, themeId));
刘基明's avatar
刘基明 committed
150 151
    }

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