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

刘基明's avatar
刘基明 committed
3
import com.tanpu.common.api.CommonResp;
刘基明's avatar
刘基明 committed
4
import com.tanpu.common.auth.UserHolder;
5
import com.tanpu.common.constant.ErrorCodeConstant;
刘基明's avatar
刘基明 committed
6
import com.tanpu.community.api.beans.qo.DiscussionAeraQo;
刘基明's avatar
刘基明 committed
7
import com.tanpu.community.api.beans.qo.TopicFollowQo;
刘基明's avatar
刘基明 committed
8
import com.tanpu.community.api.beans.qo.TopicPageDetailQo;
刘基明's avatar
刘基明 committed
9
import com.tanpu.community.api.beans.qo.TopicRankQo;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.req.page.Page;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.beans.req.topic.FollowTopicReq;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.beans.req.topic.TopicSearchReq;
刘基明's avatar
刘基明 committed
13
import com.tanpu.community.api.enums.OperationTypeEnum;
刘基明's avatar
刘基明 committed
14
import com.tanpu.community.api.enums.TopicSpecialPermissionEnum;
15
import com.tanpu.community.dao.entity.community.TopicEntity;
刘基明's avatar
刘基明 committed
16
import com.tanpu.community.dao.mapper.community.TopicFollowRelMapper;
刘基明's avatar
刘基明 committed
17
import com.tanpu.community.service.RankService;
刘基明's avatar
刘基明 committed
18
import com.tanpu.community.service.ThemeService;
刘基明's avatar
刘基明 committed
19
import com.tanpu.community.service.TopicService;
刘基明's avatar
刘基明 committed
20
import com.tanpu.community.util.PageUtils;
刘基明's avatar
刘基明 committed
21
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
22
import org.springframework.beans.BeanUtils;
刘基明's avatar
刘基明 committed
23 24
import org.springframework.stereotype.Service;

刘基明's avatar
刘基明 committed
25 26
import javax.annotation.Resource;
import java.util.Comparator;
刘基明's avatar
刘基明 committed
27
import java.util.List;
刘基明's avatar
刘基明 committed
28 29
import java.util.Map;
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
30 31 32 33 34

@Service
public class TopicManager {


刘基明's avatar
刘基明 committed
35
    @Resource
36
    private TopicService topicService;
刘基明's avatar
刘基明 committed
37
    @Resource
刘基明's avatar
刘基明 committed
38
    private RankService rankService;
刘基明's avatar
刘基明 committed
39

刘基明's avatar
刘基明 committed
40
    @Resource
刘基明's avatar
刘基明 committed
41
    private UserHolder userHolder;
刘基明's avatar
刘基明 committed
42

刘基明's avatar
刘基明 committed
43 44 45 46 47
    @Resource
    TopicFollowRelMapper topicFollowRelMapper;
    @Resource
    private ThemeService themeService;

刘基明's avatar
刘基明 committed
48
    // 首页-话题标签
刘基明's avatar
刘基明 committed
49 50
    public List<TopicRankQo> getTop4TopicTitles() {
        return rankService.getRankTopicListTop4();
刘基明's avatar
刘基明 committed
51 52
    }

刘基明's avatar
刘基明 committed
53
    // 话题列表
刘基明's avatar
刘基明 committed
54
    public Page<TopicRankQo> getAllTopicBriefInfo(TopicSearchReq req) {
刘基明's avatar
刘基明 committed
55
        // 全量排序,内存分页
刘基明's avatar
刘基明 committed
56
        List<TopicRankQo> topicList = rankService.getRankTopicList(req.getSearchKeyword());
刘基明's avatar
刘基明 committed
57 58
        Page<TopicRankQo> result = PageUtils.page(req.getPage(), topicList);
        // 添加权限
刘基明's avatar
刘基明 committed
59
        topicService.batchCheckPermission(result.getContent(), userHolder.getUserId());
刘基明's avatar
刘基明 committed
60
        return result;
刘基明's avatar
刘基明 committed
61 62
    }

刘基明's avatar
刘基明 committed
63 64 65 66 67 68 69 70 71 72 73 74
    // 关键字搜索话题(前2个)
    public List<TopicRankQo> getTopicRankList(String keyword) {
        // 全量排序,内存分页
        List<TopicRankQo> topicList = rankService.getRankTopicList(keyword);
        if (CollectionUtils.isEmpty(topicList)) return topicList;
        // 只取前两条
        if (topicList.size() > 2) topicList = topicList.subList(0, 1);
        // 添加权限
        topicService.batchCheckPermission(topicList, userHolder.getUserId());
        return topicList;
    }

刘基明's avatar
刘基明 committed
75 76
    /**
     * 关注话题(讨论区)列表
刘基明's avatar
刘基明 committed
77 78
     *
     * @param keyword
刘基明's avatar
刘基明 committed
79 80
     */

刘基明's avatar
刘基明 committed
81
    public List<TopicFollowQo> getFollowTopicList(String keyword) {
刘基明's avatar
刘基明 committed
82 83

        String userId = userHolder.getUserId();
刘基明's avatar
刘基明 committed
84
        // 查库
刘基明's avatar
刘基明 committed
85
        List<TopicFollowQo> topicFollowQos = topicService.queryFollowTopic(keyword, userId);
刘基明's avatar
刘基明 committed
86
        // 先从缓存中获取浏览量
刘基明's avatar
刘基明 committed
87 88
        Map<String, TopicRankQo> topicMap = rankService.getRankTopicList(null).stream().collect(Collectors.toMap(TopicRankQo::getTopicId, o -> o, (a, b) -> a));

刘基明's avatar
刘基明 committed
89
        topicFollowQos.stream().forEach(o -> {
刘基明's avatar
刘基明 committed
90
            TopicRankQo topicRankQo = topicMap.get(o.getTopicId());
刘基明's avatar
刘基明 committed
91
            BeanUtils.copyProperties(topicRankQo, o);
刘基明's avatar
刘基明 committed
92 93
        });

刘基明's avatar
刘基明 committed
94

刘基明's avatar
刘基明 committed
95 96
        // 最新讨论
        themeService.queryCommentForTopic(topicFollowQos, userId);
刘基明's avatar
刘基明 committed
97

刘基明's avatar
刘基明 committed
98
        // 排序
刘基明's avatar
刘基明 committed
99
        topicFollowQos.stream().filter(o -> o.checkTopicName(keyword)).sorted(Comparator.comparing(TopicFollowQo::getSpecialPermission, Comparator.reverseOrder()).
刘基明's avatar
刘基明 committed
100 101 102 103
                thenComparing(TopicFollowQo::getLastThemeTime, Comparator.nullsFirst(String::compareTo).reversed()))
                .collect(Collectors.toList());

        return topicFollowQos;
刘基明's avatar
刘基明 committed
104 105
    }

刘基明's avatar
刘基明 committed
106 107
    /**
     * 话题详情页
刘基明's avatar
刘基明 committed
108
     *
刘基明's avatar
刘基明 committed
109 110 111
     * @param topicId
     * @return
     */
刘基明's avatar
刘基明 committed
112
    public CommonResp<TopicPageDetailQo> getDetail(String topicId) {
刘基明's avatar
刘基明 committed
113 114 115 116


        TopicEntity topicEntity = topicService.queryOnlineTopicById(topicId);
        if (topicEntity == null) {
刘基明's avatar
刘基明 committed
117
            return CommonResp.error(ErrorCodeConstant.TOPIC_NOT_FOUND.getCode(), "抱歉!该话题已下线。");
118
        }
刘基明's avatar
刘基明 committed
119 120

        //
刘基明's avatar
刘基明 committed
121 122 123
        if (TopicSpecialPermissionEnum.TRUE.getCode().equals(topicEntity.getSpecialPermission()) &&
                !topicService.checkPermission(topicId, userHolder.getUserId())) {
            return CommonResp.error(ErrorCodeConstant.TOPIC_PERMISSION_ABORT.getCode(), topicService.getPermissionToast(topicId));
刘基明's avatar
刘基明 committed
124 125
        }

刘基明's avatar
刘基明 committed
126 127 128 129 130 131 132 133 134 135 136 137 138 139
        // DATA Transform
        TopicRankQo topicDetail = rankService.getTopicDetail(topicId);
        TopicPageDetailQo result = new TopicPageDetailQo();
        BeanUtils.copyProperties(topicDetail, result);

        // 查询管理员
        result.setManagers(topicService.queryManagers(result.getTopicId()));
        // 查询关联产品
        topicService.queryAttachments(result);
        // 是否关注
        result.setHasFollow(topicService.checkFollow(result.getTopicId(), userHolder.getUserId()));


        return CommonResp.success(result);
刘基明's avatar
刘基明 committed
140 141 142
    }


刘基明's avatar
刘基明 committed
143 144 145 146 147 148 149 150 151 152 153
    /**
     * 关注/取关 话题
     *
     * @param req
     * @param userId
     * @return
     */
    public CommonResp<Void> followTopic(FollowTopicReq req, String userId) {

        // 检验话题权限是否专属
        TopicEntity topicEntity = topicService.queryOnlineTopicById(req.getTopicId());
刘基明's avatar
刘基明 committed
154 155 156 157
        if (topicEntity == null) {
            return CommonResp.error(ErrorCodeConstant.TOPIC_NOT_FOUND.getCode(), "抱歉!该话题已下线。");
        }

刘基明's avatar
刘基明 committed
158
        if (TopicSpecialPermissionEnum.TRUE.getCode().equals(topicEntity.getSpecialPermission())) {
刘基明's avatar
刘基明 committed
159 160
            return CommonResp.error(ErrorCodeConstant.ILLEGAL_ARGEMENT.getCode(), "专属话题不支持关注");
        }
刘基明's avatar
刘基明 committed
161 162 163 164 165 166

        if (OperationTypeEnum.CONFIRM.getCode().equals(req.getType())) {
            topicService.addFollowTopic(req.getTopicId(), userId);
        } else if (OperationTypeEnum.CANCEL.getCode().equals(req.getType())) {
            topicService.deleteFollowTopic(req.getTopicId(), userId);
        }
刘基明's avatar
刘基明 committed
167
        return CommonResp.success();
刘基明's avatar
刘基明 committed
168
    }
刘基明's avatar
刘基明 committed
169 170 171 172

    public DiscussionAeraQo getForum() {
        return null;
    }
刘基明's avatar
刘基明 committed
173
}
刘基明's avatar
刘基明 committed
174