Commit 1f58fd2be488203bb18a1515bc2921a2e527f53d
1 parent
d6736204
【代码评审】IM:消息相关接口
Showing
6 changed files
with
8 additions
and
13 deletions
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
| 1 | package cn.iocoder.yudao.module.im.controller.admin.conversation; | 1 | package cn.iocoder.yudao.module.im.controller.admin.conversation; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | -import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender; | ||
| 7 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO; | 5 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO; |
| 8 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO; | 6 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO; |
| 9 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; | 7 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; |
| 10 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO; | 8 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO; |
| 11 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListByNoReqVO; | ||
| 12 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; | ||
| 13 | import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; | 9 | import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; |
| 14 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; | ||
| 15 | -import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum; | ||
| 16 | import cn.iocoder.yudao.module.im.service.conversation.ImConversationService; | 10 | import cn.iocoder.yudao.module.im.service.conversation.ImConversationService; |
| 17 | import cn.iocoder.yudao.module.im.service.message.ImMessageService; | 11 | import cn.iocoder.yudao.module.im.service.message.ImMessageService; |
| 18 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | 12 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| @@ -25,7 +19,6 @@ import org.springframework.validation.annotation.Validated; | @@ -25,7 +19,6 @@ import org.springframework.validation.annotation.Validated; | ||
| 25 | import org.springframework.web.bind.annotation.*; | 19 | import org.springframework.web.bind.annotation.*; |
| 26 | 20 | ||
| 27 | import java.util.List; | 21 | import java.util.List; |
| 28 | -import java.util.Objects; | ||
| 29 | 22 | ||
| 30 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 23 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 31 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 24 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java
| @@ -19,6 +19,7 @@ public class ImMessageListReqVO { | @@ -19,6 +19,7 @@ public class ImMessageListReqVO { | ||
| 19 | @NotNull(message = "接收人编号不能为空") | 19 | @NotNull(message = "接收人编号不能为空") |
| 20 | private Long receiverId; | 20 | private Long receiverId; |
| 21 | 21 | ||
| 22 | + // TODO @dylan:这个是不是不用传递呀。因为 http 连接,有当前的 userid 呀 | ||
| 22 | @Schema(description = "会话所属人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") | 23 | @Schema(description = "会话所属人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") |
| 23 | @NotNull(message = "会话所属人编号不能为空") | 24 | @NotNull(message = "会话所属人编号不能为空") |
| 24 | private Long userId; | 25 | private Long userId; |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
| @@ -24,6 +24,7 @@ public class ImMessageSendReqVO { | @@ -24,6 +24,7 @@ public class ImMessageSendReqVO { | ||
| 24 | @NotNull(message = "会话类型不能为空") | 24 | @NotNull(message = "会话类型不能为空") |
| 25 | private Integer conversationType; | 25 | private Integer conversationType; |
| 26 | 26 | ||
| 27 | + // TODO @dylan:这个是不是不用传递呀。因为 http 连接,有当前的 userid 呀 | ||
| 27 | @Schema(description = "会话所属用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | 28 | @Schema(description = "会话所属用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 28 | @NotNull(message = "会话所属用户id") | 29 | @NotNull(message = "会话所属用户id") |
| 29 | private Long conversationUserId; | 30 | private Long conversationUserId; |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java
| @@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversatio | @@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversatio | ||
| 8 | import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; | 8 | import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; |
| 9 | import cn.iocoder.yudao.module.im.dal.mysql.conversation.ImConversationMapper; | 9 | import cn.iocoder.yudao.module.im.dal.mysql.conversation.ImConversationMapper; |
| 10 | import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; | 10 | import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; |
| 11 | -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||
| 12 | -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||
| 13 | import jakarta.annotation.Resource; | 11 | import jakarta.annotation.Resource; |
| 14 | import org.springframework.stereotype.Service; | 12 | import org.springframework.stereotype.Service; |
| 15 | import org.springframework.validation.annotation.Validated; | 13 | import org.springframework.validation.annotation.Validated; |
| @@ -26,6 +24,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | @@ -26,6 +24,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | ||
| 26 | @Service | 24 | @Service |
| 27 | @Validated | 25 | @Validated |
| 28 | public class ImConversationServiceImpl implements ImConversationService { | 26 | public class ImConversationServiceImpl implements ImConversationService { |
| 27 | + | ||
| 29 | private final String IM_CONVERSATION_ADD = "im-conversation-add"; | 28 | private final String IM_CONVERSATION_ADD = "im-conversation-add"; |
| 30 | 29 | ||
| 31 | @Resource | 30 | @Resource |
| @@ -108,6 +107,7 @@ public class ImConversationServiceImpl implements ImConversationService { | @@ -108,6 +107,7 @@ public class ImConversationServiceImpl implements ImConversationService { | ||
| 108 | conversation = insertConversation(no, loginUserId, createReqVO.getTargetId(), createReqVO.getType()); | 107 | conversation = insertConversation(no, loginUserId, createReqVO.getTargetId(), createReqVO.getType()); |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 110 | + // TODO @dylan:这个是不是不用 push 呀。对于发送端,它自己肯定知道;对于接收端,貌似收到 message 的时候,再创建更合理一点。 | ||
| 111 | // 发送打开会话的通知,并推送会话实体 | 111 | // 发送打开会话的通知,并推送会话实体 |
| 112 | // 给自己发送创建会话成功的通知 | 112 | // 给自己发送创建会话成功的通知 |
| 113 | webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), getLoginUserId(), | 113 | webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), getLoginUserId(), |
| @@ -116,9 +116,7 @@ public class ImConversationServiceImpl implements ImConversationService { | @@ -116,9 +116,7 @@ public class ImConversationServiceImpl implements ImConversationService { | ||
| 116 | // 给接受者发送创建会话的通知 | 116 | // 给接受者发送创建会话的通知 |
| 117 | webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), createReqVO.getTargetId(), | 117 | webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), createReqVO.getTargetId(), |
| 118 | IM_CONVERSATION_ADD, conversation); | 118 | IM_CONVERSATION_ADD, conversation); |
| 119 | - | ||
| 120 | return conversation; | 119 | return conversation; |
| 121 | } | 120 | } |
| 122 | 121 | ||
| 123 | - | ||
| 124 | } | 122 | } |
| 125 | \ No newline at end of file | 123 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java
| @@ -23,7 +23,6 @@ import org.springframework.validation.annotation.Validated; | @@ -23,7 +23,6 @@ import org.springframework.validation.annotation.Validated; | ||
| 23 | import java.time.LocalDateTime; | 23 | import java.time.LocalDateTime; |
| 24 | import java.util.Collections; | 24 | import java.util.Collections; |
| 25 | import java.util.List; | 25 | import java.util.List; |
| 26 | -import java.util.Objects; | ||
| 27 | 26 | ||
| 28 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 27 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 29 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 28 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| @@ -51,9 +50,10 @@ public class ImMessageServiceImpl implements ImMessageService { | @@ -51,9 +50,10 @@ public class ImMessageServiceImpl implements ImMessageService { | ||
| 51 | 50 | ||
| 52 | @Override | 51 | @Override |
| 53 | public List<ImMessageDO> getMessageList(ImMessageListReqVO listReqVO) { | 52 | public List<ImMessageDO> getMessageList(ImMessageListReqVO listReqVO) { |
| 54 | - | 53 | + // TODO @dylan:userId 从 controller 传递,service 保持无状态 |
| 55 | // 1. 获得会话编号 | 54 | // 1. 获得会话编号 |
| 56 | Long loginUserId = getLoginUserId(); | 55 | Long loginUserId = getLoginUserId(); |
| 56 | + // TODO @dylan:修复下 generateConversationNo 方法,fromUserId、receiverId 需要小的放前面,大的放后面。这样,可以保证一定只生成唯一的。 | ||
| 57 | String no1 = generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType()); | 57 | String no1 = generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType()); |
| 58 | String no2 = generateConversationNo(listReqVO.getReceiverId(),loginUserId, listReqVO.getConversationType()); | 58 | String no2 = generateConversationNo(listReqVO.getReceiverId(),loginUserId, listReqVO.getConversationType()); |
| 59 | 59 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
| @@ -101,6 +101,7 @@ public class UserController { | @@ -101,6 +101,7 @@ public class UserController { | ||
| 101 | pageResult.getTotal())); | 101 | pageResult.getTotal())); |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | + // TODO @dylan:可以服用 getSimpleUserList 呀。 | ||
| 104 | @GetMapping("/all") | 105 | @GetMapping("/all") |
| 105 | @Operation(summary = "获得所有用户列表") | 106 | @Operation(summary = "获得所有用户列表") |
| 106 | @PreAuthorize("@ss.hasPermission('system:user:list')") | 107 | @PreAuthorize("@ss.hasPermission('system:user:list')") |
| @@ -115,6 +116,7 @@ public class UserController { | @@ -115,6 +116,7 @@ public class UserController { | ||
| 115 | return success(UserConvert.INSTANCE.convertList(result, deptMap)); | 116 | return success(UserConvert.INSTANCE.convertList(result, deptMap)); |
| 116 | } | 117 | } |
| 117 | 118 | ||
| 119 | + // TODO @dylan:融合到 getSimpleUserList 接口,允许传递 deptId 筛选 | ||
| 118 | @GetMapping("/listByDept") | 120 | @GetMapping("/listByDept") |
| 119 | @Operation(summary = "获得部门用户列表") | 121 | @Operation(summary = "获得部门用户列表") |
| 120 | @PreAuthorize("@ss.hasPermission('system:user:list')") | 122 | @PreAuthorize("@ss.hasPermission('system:user:list')") |