Commit d60156015be9e9cc130a579755be66c164a17859

Authored by YunaiV
1 parent 032d9558

✨ feat(im): 增加频道的检查

yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/channel/ImChannelMaterialController.java
... ... @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 5 import cn.iocoder.yudao.module.im.controller.admin.manager.channel.vo.material.ImChannelMaterialRespVO;
6 6 import cn.iocoder.yudao.module.im.dal.dataobject.channel.ImChannelMaterialDO;
7 7 import cn.iocoder.yudao.module.im.service.channel.ImChannelMaterialService;
8   -import cn.iocoder.yudao.module.im.service.channel.ImChannelMessageService;
9 8 import io.swagger.v3.oas.annotations.Operation;
10 9 import io.swagger.v3.oas.annotations.Parameter;
11 10 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -16,10 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
16 15 import org.springframework.web.bind.annotation.RequestParam;
17 16 import org.springframework.web.bind.annotation.RestController;
18 17  
19   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20 18 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21   -import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
22   -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.IM_CHANNEL_MATERIAL_NOT_EXISTS;
23 19  
24 20 @Tag(name = "用户 APP - IM 频道素材")
25 21 @RestController
... ... @@ -29,19 +25,11 @@ public class ImChannelMaterialController {
29 25  
30 26 @Resource
31 27 private ImChannelMaterialService channelMaterialService;
32   - @Resource
33   - private ImChannelMessageService channelMessageService;
34 28  
35   - // TODO @AI:要不,还是不校验了。会存在一个情况,有人转发图文消息到私聊里。(先不考虑这块的安全性了;简化简化!)
36 29 @GetMapping("/get")
37 30 @Operation(summary = "获取素材详情;用于客户端点击图文卡片渲染详情页")
38 31 @Parameter(name = "id", description = "素材编号", required = true, example = "1024")
39 32 public CommonResult<ImChannelMaterialRespVO> getMaterial(@RequestParam("id") Long id) {
40   - // 防横向越权:仅允许拉取自己曾经收到过的素材,否则视为不存在
41   - if (!channelMessageService.isUserReceivedMaterial(getLoginUserId(), id)) {
42   - throw exception(IM_CHANNEL_MATERIAL_NOT_EXISTS);
43   - }
44   - // 获取素材详情
45 33 ImChannelMaterialDO material = channelMaterialService.validateMaterialExists(id);
46 34 return success(BeanUtils.toBean(material, ImChannelMaterialRespVO.class));
47 35 }
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/channel/ImChannelMessageMapper.java
... ... @@ -6,8 +6,6 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 6 import cn.iocoder.yudao.module.im.controller.admin.manager.channel.vo.message.ImChannelMessagePageReqVO;
7 7 import cn.iocoder.yudao.module.im.dal.dataobject.channel.ImChannelMessageDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9   -import org.apache.ibatis.annotations.Param;
10   -import org.apache.ibatis.annotations.Select;
11 9  
12 10 import java.util.List;
13 11  
... ... @@ -19,7 +17,6 @@ import java.util.List;
19 17 @Mapper
20 18 public interface ImChannelMessageMapper extends BaseMapperX<ImChannelMessageDO> {
21 19  
22   - // TODO @AI:代码风格,和别的 message 一致;
23 20 /**
24 21 * 拉取指定用户应收的频道消息
25 22 * <p>
... ... @@ -30,30 +27,15 @@ public interface ImChannelMessageMapper extends BaseMapperX&lt;ImChannelMessageDO&gt;
30 27 * @param size 返回条数
31 28 * @return 频道消息列表;按 id 升序
32 29 */
33   - @Select("SELECT * FROM im_channel_message "
34   - + "WHERE deleted = 0 "
35   - + "AND id > #{minId} "
36   - + "AND (receiver_user_ids IS NULL "
37   - + " OR receiver_user_ids = '' "
38   - + " OR FIND_IN_SET(#{userId}, receiver_user_ids)) "
39   - + "ORDER BY id ASC "
40   - + "LIMIT #{size}")
41   - List<ImChannelMessageDO> selectListByUserAndMinId(@Param("userId") Long userId,
42   - @Param("minId") Long minId,
43   - @Param("size") Integer size);
44   -
45   - // TODO @AI:代码风格,和别的 message 一致;
46   - /**
47   - * 校验用户是否曾经收到过指定素材(receiver_user_ids 为空表示全员);用于详情接口归属校验
48   - */
49   - @Select("SELECT EXISTS(SELECT 1 FROM im_channel_message "
50   - + "WHERE deleted = 0 AND material_id = #{materialId} "
51   - + "AND (receiver_user_ids IS NULL "
52   - + " OR receiver_user_ids = '' "
53   - + " OR FIND_IN_SET(#{userId}, receiver_user_ids)) "
54   - + "LIMIT 1)")
55   - boolean existsByUserAndMaterial(@Param("userId") Long userId,
56   - @Param("materialId") Long materialId);
  30 + default List<ImChannelMessageDO> selectListByUserAndMinId(Long userId, Long minId, Integer size) {
  31 + return selectList(new LambdaQueryWrapperX<ImChannelMessageDO>()
  32 + .gt(ImChannelMessageDO::getId, minId)
  33 + .and(w -> w.isNull(ImChannelMessageDO::getReceiverUserIds)
  34 + .or().eq(ImChannelMessageDO::getReceiverUserIds, "")
  35 + .or().apply("FIND_IN_SET({0}, receiver_user_ids)", userId))
  36 + .orderByAsc(ImChannelMessageDO::getId)
  37 + .last("LIMIT " + size));
  38 + }
57 39  
58 40 default Long selectCountByMaterialId(Long materialId) {
59 41 return selectCount(ImChannelMessageDO::getMaterialId, materialId);
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/channel/ImChannelMessageService.java
... ... @@ -28,14 +28,6 @@ public interface ImChannelMessageService {
28 28 */
29 29 List<ImChannelMessageDO> getMessageListForPull(Long userId, Long minId, Integer size);
30 30  
31   - /**
32   - * 校验用户是否曾经收到过指定素材;防横向越权
33   - *
34   - * @param userId 当前用户编号
35   - * @param materialId 素材编号
36   - * @return 是否曾收到(receiver_user_ids 命中 / 全员)
37   - */
38   - boolean isUserReceivedMaterial(Long userId, Long materialId);
39 31  
40 32 // ==================== 管理后台 ====================
41 33  
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/channel/ImChannelMessageServiceImpl.java
... ... @@ -47,11 +47,6 @@ public class ImChannelMessageServiceImpl implements ImChannelMessageService {
47 47 return channelMessageMapper.selectListByUserAndMinId(userId, minId, size);
48 48 }
49 49  
50   - @Override
51   - public boolean isUserReceivedMaterial(Long userId, Long materialId) {
52   - return channelMessageMapper.existsByUserAndMaterial(userId, materialId);
53   - }
54   -
55 50 // ==================== 管理后台 ====================
56 51  
57 52 @Override
... ...