【代码评审】IM:消息相关接口
This commit is contained in:
parent
d67362043e
commit
1f58fd2be4
|
@ -1,18 +1,12 @@
|
||||||
package cn.iocoder.yudao.module.im.controller.admin.conversation;
|
package cn.iocoder.yudao.module.im.controller.admin.conversation;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender;
|
|
||||||
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO;
|
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
|
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
|
||||||
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO;
|
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO;
|
||||||
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
|
import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
|
||||||
import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListByNoReqVO;
|
|
||||||
import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
|
|
||||||
import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
|
import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
|
||||||
import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
|
|
||||||
import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
|
|
||||||
import cn.iocoder.yudao.module.im.service.conversation.ImConversationService;
|
import cn.iocoder.yudao.module.im.service.conversation.ImConversationService;
|
||||||
import cn.iocoder.yudao.module.im.service.message.ImMessageService;
|
import cn.iocoder.yudao.module.im.service.message.ImMessageService;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
@ -25,7 +19,6 @@ import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
|
@ -19,6 +19,7 @@ public class ImMessageListReqVO {
|
||||||
@NotNull(message = "接收人编号不能为空")
|
@NotNull(message = "接收人编号不能为空")
|
||||||
private Long receiverId;
|
private Long receiverId;
|
||||||
|
|
||||||
|
// TODO @dylan:这个是不是不用传递呀。因为 http 连接,有当前的 userid 呀
|
||||||
@Schema(description = "会话所属人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
|
@Schema(description = "会话所属人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
|
||||||
@NotNull(message = "会话所属人编号不能为空")
|
@NotNull(message = "会话所属人编号不能为空")
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
|
@ -24,6 +24,7 @@ public class ImMessageSendReqVO {
|
||||||
@NotNull(message = "会话类型不能为空")
|
@NotNull(message = "会话类型不能为空")
|
||||||
private Integer conversationType;
|
private Integer conversationType;
|
||||||
|
|
||||||
|
// TODO @dylan:这个是不是不用传递呀。因为 http 连接,有当前的 userid 呀
|
||||||
@Schema(description = "会话所属用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
@Schema(description = "会话所属用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||||
@NotNull(message = "会话所属用户id")
|
@NotNull(message = "会话所属用户id")
|
||||||
private Long conversationUserId;
|
private Long conversationUserId;
|
||||||
|
|
|
@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversatio
|
||||||
import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
|
import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
|
||||||
import cn.iocoder.yudao.module.im.dal.mysql.conversation.ImConversationMapper;
|
import cn.iocoder.yudao.module.im.dal.mysql.conversation.ImConversationMapper;
|
||||||
import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
|
import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
||||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
@ -26,6 +24,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
|
||||||
@Service
|
@Service
|
||||||
@Validated
|
@Validated
|
||||||
public class ImConversationServiceImpl implements ImConversationService {
|
public class ImConversationServiceImpl implements ImConversationService {
|
||||||
|
|
||||||
private final String IM_CONVERSATION_ADD = "im-conversation-add";
|
private final String IM_CONVERSATION_ADD = "im-conversation-add";
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
|
@ -108,6 +107,7 @@ public class ImConversationServiceImpl implements ImConversationService {
|
||||||
conversation = insertConversation(no, loginUserId, createReqVO.getTargetId(), createReqVO.getType());
|
conversation = insertConversation(no, loginUserId, createReqVO.getTargetId(), createReqVO.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @dylan:这个是不是不用 push 呀。对于发送端,它自己肯定知道;对于接收端,貌似收到 message 的时候,再创建更合理一点。
|
||||||
// 发送打开会话的通知,并推送会话实体
|
// 发送打开会话的通知,并推送会话实体
|
||||||
// 给自己发送创建会话成功的通知
|
// 给自己发送创建会话成功的通知
|
||||||
webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), getLoginUserId(),
|
webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), getLoginUserId(),
|
||||||
|
@ -116,9 +116,7 @@ public class ImConversationServiceImpl implements ImConversationService {
|
||||||
// 给接受者发送创建会话的通知
|
// 给接受者发送创建会话的通知
|
||||||
webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), createReqVO.getTargetId(),
|
webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), createReqVO.getTargetId(),
|
||||||
IM_CONVERSATION_ADD, conversation);
|
IM_CONVERSATION_ADD, conversation);
|
||||||
|
|
||||||
return conversation;
|
return conversation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -23,7 +23,6 @@ import org.springframework.validation.annotation.Validated;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
@ -51,9 +50,10 @@ public class ImMessageServiceImpl implements ImMessageService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ImMessageDO> getMessageList(ImMessageListReqVO listReqVO) {
|
public List<ImMessageDO> getMessageList(ImMessageListReqVO listReqVO) {
|
||||||
|
// TODO @dylan:userId 从 controller 传递,service 保持无状态
|
||||||
// 1. 获得会话编号
|
// 1. 获得会话编号
|
||||||
Long loginUserId = getLoginUserId();
|
Long loginUserId = getLoginUserId();
|
||||||
|
// TODO @dylan:修复下 generateConversationNo 方法,fromUserId、receiverId 需要小的放前面,大的放后面。这样,可以保证一定只生成唯一的。
|
||||||
String no1 = generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType());
|
String no1 = generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType());
|
||||||
String no2 = generateConversationNo(listReqVO.getReceiverId(),loginUserId, listReqVO.getConversationType());
|
String no2 = generateConversationNo(listReqVO.getReceiverId(),loginUserId, listReqVO.getConversationType());
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,7 @@ public class UserController {
|
||||||
pageResult.getTotal()));
|
pageResult.getTotal()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @dylan:可以服用 getSimpleUserList 呀。
|
||||||
@GetMapping("/all")
|
@GetMapping("/all")
|
||||||
@Operation(summary = "获得所有用户列表")
|
@Operation(summary = "获得所有用户列表")
|
||||||
@PreAuthorize("@ss.hasPermission('system:user:list')")
|
@PreAuthorize("@ss.hasPermission('system:user:list')")
|
||||||
|
@ -115,6 +116,7 @@ public class UserController {
|
||||||
return success(UserConvert.INSTANCE.convertList(result, deptMap));
|
return success(UserConvert.INSTANCE.convertList(result, deptMap));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @dylan:融合到 getSimpleUserList 接口,允许传递 deptId 筛选
|
||||||
@GetMapping("/listByDept")
|
@GetMapping("/listByDept")
|
||||||
@Operation(summary = "获得部门用户列表")
|
@Operation(summary = "获得部门用户列表")
|
||||||
@PreAuthorize("@ss.hasPermission('system:user:list')")
|
@PreAuthorize("@ss.hasPermission('system:user:list')")
|
||||||
|
|
Loading…
Reference in New Issue