CommentService.java 6.38 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

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


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

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

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

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

    //统计主题集合的评论量
    public Map<String, Integer> getCountMapByThemeIds(List<String> themeIds) {
刘基明's avatar
刘基明 committed
78 79 80
        if (CollectionUtils.isEmpty(themeIds)){
            return new HashMap<>();
        }
刘基明's avatar
刘基明 committed
81 82 83 84 85 86
        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
87
    }
刘基明's avatar
刘基明 committed
88

刘基明's avatar
刘基明 committed
89 90
    public List<CommentEntity> selectByThemeId(String themeId) {
        return redisCache.getList(StringUtils.joinWith("_", CACHE_COMMENT_THEMEID, themeId),
张辰's avatar
张辰 committed
91
                60, () -> {
刘基明's avatar
刘基明 committed
92 93 94 95 96 97 98
                    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
99 100 101
    }


刘基明's avatar
刘基明 committed
102

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

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

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

    //删除评论
    @Transactional
    public void delete(String commentId, String userId) {
刘基明's avatar
刘基明 committed
137
        CommentEntity commentEntity = this.queryByIdIncludeDelete(commentId);
刘基明's avatar
刘基明 committed
138 139 140 141 142
        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
143
        //失效缓存
刘基明's avatar
刘基明 committed
144 145 146 147 148
        evictThemeCache(commentEntity.getThemeId());
    }

    // 失效关联主题缓存
    private void evictThemeCache(String themeId){
149
        // 评论内容
刘基明's avatar
刘基明 committed
150
        redisCache.evict(StringUtils.joinWith("_", CACHE_COMMENT_THEMEID, themeId));
151
        // 主题内容
刘基明's avatar
刘基明 committed
152
        redisCache.evict(StringUtils.joinWith("_", CACHE_THEME_ID, themeId));
153
        // 评论数
刘基明's avatar
刘基明 committed
154
        redisCache.evict(StringUtils.joinWith("_", THEME_COMMENT_COUNT, themeId));
刘基明's avatar
刘基明 committed
155 156
    }

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