Commit e2eab4fe787c8d644d98ae0a25944e1339c5b42a
1 parent
15a1bca7
♻️ refactor(friend): 重构好友关系管理逻辑,简化双向绑定方法
Showing
1 changed file
with
23 additions
and
36 deletions
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java
| @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.im.controller.admin.friend.vo.ImFriendUpdateReqVO | @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.im.controller.admin.friend.vo.ImFriendUpdateReqVO | ||
| 5 | import cn.iocoder.yudao.module.im.dal.dataobject.friend.ImFriendDO; | 5 | import cn.iocoder.yudao.module.im.dal.dataobject.friend.ImFriendDO; |
| 6 | import cn.iocoder.yudao.module.im.dal.mysql.friend.ImFriendMapper; | 6 | import cn.iocoder.yudao.module.im.dal.mysql.friend.ImFriendMapper; |
| 7 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | 7 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| 8 | +import cn.hutool.extra.spring.SpringUtil; | ||
| 8 | import jakarta.annotation.Resource; | 9 | import jakarta.annotation.Resource; |
| 9 | import org.springframework.cache.annotation.CacheEvict; | 10 | import org.springframework.cache.annotation.CacheEvict; |
| 10 | import org.springframework.cache.annotation.Cacheable; | 11 | import org.springframework.cache.annotation.Cacheable; |
| @@ -77,26 +78,20 @@ public class ImFriendServiceImpl implements ImFriendService { | @@ -77,26 +78,20 @@ public class ImFriendServiceImpl implements ImFriendService { | ||
| 77 | // 1.2 校验对方存在(禁用/不存在的账号不允许添加) | 78 | // 1.2 校验对方存在(禁用/不存在的账号不允许添加) |
| 78 | adminUserApi.validateUser(friendUserId); | 79 | adminUserApi.validateUser(friendUserId); |
| 79 | 80 | ||
| 80 | - // 双向绑定 | ||
| 81 | - // DONE @AI:改成 createOrUpdateFriend 之类的接口,内部自动处理"已删除的好友再加回来"的情况;或者直接在数据库层面通过唯一索引 + 物理更新来解决。 | ||
| 82 | - // 说明:bindFriend 内部已处理 DISABLE → ENABLE 的恢复逻辑 | ||
| 83 | - bindFriend(userId, friendUserId); | ||
| 84 | - bindFriend(friendUserId, userId); | 81 | + // 2. 双向绑定 |
| 82 | + getSelf().addFriend0(userId, friendUserId); | ||
| 83 | + getSelf().addFriend0(friendUserId, userId); | ||
| 85 | 84 | ||
| 86 | - // TODO @AI:推送异步化:1)好友的打招呼;2)通知好友发生变化的消息; | ||
| 87 | - | ||
| 88 | - // TODO @AI:实现如下: | ||
| 89 | - // TODO @芋艿:【对齐】这里缺少了好友添加成功的系统提示消息, | ||
| 90 | - // 需要通过 `ImPrivateMessageService` 插入一条 TIP_TEXT 类型的消息并走 WebSocket 推送给双方。 | ||
| 91 | - // 涉及 WebSocket 推送器的事件类型扩展(当前 `ImWsEventType` 无 FRIEND_NEW),待统一后补上。 | 85 | + // TODO @芋艿:好友添加成功后:1)插入 TIP_TEXT 系统提示消息并推送双方;2)通知双方好友列表变更。 |
| 86 | + // 依赖 WebSocket 事件类型扩展(当前无 FRIEND_NEW),待统一后补上。 | ||
| 92 | } | 87 | } |
| 93 | 88 | ||
| 94 | @Override | 89 | @Override |
| 95 | @Transactional(rollbackFor = Exception.class) | 90 | @Transactional(rollbackFor = Exception.class) |
| 96 | public void deleteFriend(Long userId, Long friendUserId) { | 91 | public void deleteFriend(Long userId, Long friendUserId) { |
| 97 | // 双向标记为 DISABLE + 记录 deleteTime | 92 | // 双向标记为 DISABLE + 记录 deleteTime |
| 98 | - unbindFriend(userId, friendUserId); | ||
| 99 | - unbindFriend(friendUserId, userId); | 93 | + getSelf().deleteFriend0(userId, friendUserId); |
| 94 | + getSelf().deleteFriend0(friendUserId, userId); | ||
| 100 | 95 | ||
| 101 | // TODO @芋艿:【对齐】这里缺少了好友删除的系统提示 + FRIEND_DEL WebSocket 推送, | 96 | // TODO @芋艿:【对齐】这里缺少了好友删除的系统提示 + FRIEND_DEL WebSocket 推送, |
| 102 | // 待 WS 事件类型扩展后补上。 | 97 | // 待 WS 事件类型扩展后补上。 |
| @@ -109,29 +104,20 @@ public class ImFriendServiceImpl implements ImFriendService { | @@ -109,29 +104,20 @@ public class ImFriendServiceImpl implements ImFriendService { | ||
| 109 | * - 已存在但 DISABLE:恢复关系(status=ENABLE,刷新 addTime,清空 deleteTime) | 104 | * - 已存在但 DISABLE:恢复关系(status=ENABLE,刷新 addTime,清空 deleteTime) |
| 110 | */ | 105 | */ |
| 111 | @CacheEvict(cacheNames = FRIEND, key = "#userId + '_' + #friendUserId") | 106 | @CacheEvict(cacheNames = FRIEND, key = "#userId + '_' + #friendUserId") |
| 112 | - public void bindFriend(Long userId, Long friendUserId) { | 107 | + public void addFriend0(Long userId, Long friendUserId) { |
| 113 | ImFriendDO exists = imFriendMapper.selectByUserIdAndFriendUserId(userId, friendUserId); | 108 | ImFriendDO exists = imFriendMapper.selectByUserIdAndFriendUserId(userId, friendUserId); |
| 109 | + // 情况一:恢复已删除的好友关系 | ||
| 114 | if (exists != null) { | 110 | if (exists != null) { |
| 115 | if (CommonStatusEnum.isEnable(exists.getStatus())) { | 111 | if (CommonStatusEnum.isEnable(exists.getStatus())) { |
| 116 | - return; // 已是好友,跳过 | 112 | + return; |
| 117 | } | 113 | } |
| 118 | - // 恢复已删除的好友关系 | ||
| 119 | - ImFriendDO updateObj = new ImFriendDO(); | ||
| 120 | - updateObj.setId(exists.getId()); | ||
| 121 | - updateObj.setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||
| 122 | - updateObj.setAddTime(LocalDateTime.now()); | ||
| 123 | - updateObj.setDeleteTime(null); | ||
| 124 | - imFriendMapper.updateById(updateObj); | 114 | + imFriendMapper.updateById(new ImFriendDO().setId(exists.getId()) |
| 115 | + .setStatus(CommonStatusEnum.ENABLE.getStatus()).setAddTime(LocalDateTime.now())); | ||
| 125 | return; | 116 | return; |
| 126 | } | 117 | } |
| 127 | - // 新增 | ||
| 128 | - ImFriendDO friend = ImFriendDO.builder() | ||
| 129 | - .userId(userId) | ||
| 130 | - .friendUserId(friendUserId) | ||
| 131 | - .muted(false) | ||
| 132 | - .status(CommonStatusEnum.ENABLE.getStatus()) | ||
| 133 | - .addTime(LocalDateTime.now()) | ||
| 134 | - .build(); | 118 | + // 情况二:新增好有关系 |
| 119 | + ImFriendDO friend = ImFriendDO.builder().userId(userId).friendUserId(friendUserId) | ||
| 120 | + .muted(false).status(CommonStatusEnum.ENABLE.getStatus()).addTime(LocalDateTime.now()).build(); | ||
| 135 | imFriendMapper.insert(friend); | 121 | imFriendMapper.insert(friend); |
| 136 | } | 122 | } |
| 137 | 123 | ||
| @@ -139,16 +125,17 @@ public class ImFriendServiceImpl implements ImFriendService { | @@ -139,16 +125,17 @@ public class ImFriendServiceImpl implements ImFriendService { | ||
| 139 | * 单向解除好友关系(status 设为 DISABLE,记录 deleteTime) | 125 | * 单向解除好友关系(status 设为 DISABLE,记录 deleteTime) |
| 140 | */ | 126 | */ |
| 141 | @CacheEvict(cacheNames = FRIEND, key = "#userId + '_' + #friendUserId") | 127 | @CacheEvict(cacheNames = FRIEND, key = "#userId + '_' + #friendUserId") |
| 142 | - public void unbindFriend(Long userId, Long friendUserId) { | 128 | + public void deleteFriend0(Long userId, Long friendUserId) { |
| 143 | ImFriendDO exists = imFriendMapper.selectByUserIdAndFriendUserId(userId, friendUserId); | 129 | ImFriendDO exists = imFriendMapper.selectByUserIdAndFriendUserId(userId, friendUserId); |
| 144 | if (exists == null || CommonStatusEnum.isDisable(exists.getStatus())) { | 130 | if (exists == null || CommonStatusEnum.isDisable(exists.getStatus())) { |
| 145 | return; | 131 | return; |
| 146 | } | 132 | } |
| 147 | - ImFriendDO updateObj = new ImFriendDO(); | ||
| 148 | - updateObj.setId(exists.getId()); | ||
| 149 | - updateObj.setStatus(CommonStatusEnum.DISABLE.getStatus()); | ||
| 150 | - updateObj.setDeleteTime(LocalDateTime.now()); | ||
| 151 | - imFriendMapper.updateById(updateObj); | 133 | + imFriendMapper.updateById(new ImFriendDO().setId(exists.getId()) |
| 134 | + .setStatus(CommonStatusEnum.DISABLE.getStatus()).setDeleteTime(LocalDateTime.now())); | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + private ImFriendServiceImpl getSelf() { | ||
| 138 | + return SpringUtil.getBean(getClass()); | ||
| 152 | } | 139 | } |
| 153 | 140 | ||
| 154 | } | 141 | } |