Commit f6a29e530ab91dbdda512e57b22906790c060689

Authored by YunaiV
1 parent 1269e626

📝 refactor(im): 移除后端的 conversation

yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java deleted
1   -package cn.iocoder.yudao.module.im.controller.admin.conversation;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO;
6   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
7   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO;
8   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
9   -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
10   -import cn.iocoder.yudao.module.im.service.conversation.ImConversationService;
11   -import io.swagger.v3.oas.annotations.Operation;
12   -import io.swagger.v3.oas.annotations.tags.Tag;
13   -import jakarta.annotation.Resource;
14   -import jakarta.validation.Valid;
15   -import org.springframework.validation.annotation.Validated;
16   -import org.springframework.web.bind.annotation.*;
17   -
18   -import java.util.List;
19   -
20   -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21   -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
22   -
23   -@Tag(name = "管理后台 - IM 会话")
24   -@RestController
25   -@RequestMapping("/im/conversation")
26   -@Validated
27   -public class ImConversationController {
28   -
29   - @Resource
30   - private ImConversationService imConversationService;
31   -
32   - // TODO @芋艿:头像和昵称的聚合应交给前端完成
33   - @GetMapping("/list")
34   - @Operation(summary = "获得用户的会话列表")
35   - public CommonResult<List<ImConversationRespVO>> getConversationList() {
36   - List<ImConversationDO> conversationList = imConversationService.getConversationList(getLoginUserId());
37   - List<ImConversationRespVO> imConversationRespVOList = BeanUtils.toBean(conversationList, ImConversationRespVO.class);
38   - return success(imConversationRespVOList);
39   - }
40   -
41   - @PostMapping("/update-pinned")
42   - @Operation(summary = "置顶会话")
43   - public CommonResult<Boolean> updatePinned(@Valid @RequestBody ImConversationUpdatePinnedReqVO updateReqVO) {
44   - imConversationService.updatePinned(getLoginUserId(),updateReqVO);
45   - return success(true);
46   - }
47   -
48   - @PostMapping("/update-last-read-time")
49   - @Operation(summary = "更新最后已读时间")
50   - public CommonResult<Boolean> updateLastReadTime(@Valid @RequestBody ImConversationUpdateLastReadTimeReqVO updateReqVO) {
51   - imConversationService.updateLastReadTime(getLoginUserId(),updateReqVO);
52   - return success(true);
53   - }
54   -
55   - @PostMapping("/create")
56   - @Operation(summary = "创建会话")
57   - public CommonResult<ImConversationDO> createConversation(@Valid @RequestBody ImConversationCreateReqVO createReqVO) {
58   - ImConversationDO conversation = imConversationService.createConversation(getLoginUserId(), createReqVO);
59   - return success(conversation);
60   - }
61   -
62   -}
63 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationCreateReqVO.java deleted
1   -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
5   -import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7   -import lombok.Data;
8   -
9   -import java.time.LocalDateTime;
10   -
11   -@Schema(description = "管理后台 - 会话最后已读时间 Request VO")
12   -@Data
13   -public class ImConversationCreateReqVO {
14   -
15   - @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
16   - private Long targetId;
17   -
18   - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
19   - @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
20   - private Integer type;
21   -
22   -}
23 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java deleted
1   -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import java.time.LocalDateTime;
7   -
8   -@Schema(description = "管理后台 - 会话 Response VO")
9   -@Data
10   -public class ImConversationRespVO {
11   -
12   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905")
13   - private Long id;
14   -
15   - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
16   - private Long userId;
17   -
18   - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
19   - private Integer type;
20   -
21   - @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
22   - private Long targetId;
23   -
24   - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2")
25   - private String no;
26   -
27   - @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
28   - private Boolean pinned;
29   -
30   - @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00")
31   - private LocalDateTime lastReadTime;
32   -
33   - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
34   - private LocalDateTime createTime;
35   -
36   - // TODO @dylan:这块,交给前端聚合哈。im 这块,我们重前端,后端更多解决消息的通信和存储。
37   - // 1. 基础信息:根据会话类型,查询会话接受者的头像、昵称
38   - // 2. 未读信息:前端自己增量拉取,基于本地 db 查看
39   -
40   - @Schema(description = "会话接受者头像", requiredMode = Schema.RequiredMode.REQUIRED)
41   - private String avatar;
42   -
43   - @Schema(description = "会话接受者昵称", requiredMode = Schema.RequiredMode.REQUIRED)
44   - private String nickname;
45   -
46   - @Schema(description = "最后一条消息的描述", requiredMode = Schema.RequiredMode.REQUIRED)
47   - private String lastMessageDescription;
48   -
49   - @Schema(description = "未读消息条数", requiredMode = Schema.RequiredMode.REQUIRED)
50   - private String unreadMessagesCount;
51   -
52   -}
53 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java deleted
1   -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
5   -import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7   -import lombok.Data;
8   -
9   -import java.time.LocalDateTime;
10   -
11   -@Schema(description = "管理后台 - 会话最后已读时间 Request VO")
12   -@Data
13   -public class ImConversationUpdateLastReadTimeReqVO {
14   -
15   - @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00")
16   - @NotNull(message = "最后已读时间不能为空")
17   - private LocalDateTime lastReadTime;
18   -
19   - @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
20   - private Long targetId;
21   -
22   - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
23   - @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
24   - private Integer type;
25   -
26   -}
27 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java deleted
1   -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
5   -import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7   -import lombok.Data;
8   -
9   -@Schema(description = "管理后台 - 会话置顶 Request VO")
10   -@Data
11   -public class ImConversationUpdatePinnedReqVO {
12   -
13   - @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
14   - @NotNull(message = "是否置顶不能为空")
15   - private Boolean pinned;
16   -
17   - @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
18   - private Long targetId;
19   -
20   - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21   - @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
22   - private Integer type;
23   -
24   -}
25 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java deleted
1   -package cn.iocoder.yudao.module.im.dal.dataobject.conversation;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
5   -import com.baomidou.mybatisplus.annotation.KeySequence;
6   -import com.baomidou.mybatisplus.annotation.TableId;
7   -import com.baomidou.mybatisplus.annotation.TableName;
8   -import lombok.*;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -/**
13   - * IM 会话 DO
14   - *
15   - * @author 芋道源码
16   - */
17   -@TableName("im_conversation")
18   -@KeySequence("im_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
19   -@Data
20   -@EqualsAndHashCode(callSuper = true)
21   -@ToString(callSuper = true)
22   -@Builder
23   -@NoArgsConstructor
24   -@AllArgsConstructor
25   -public class ImConversationDO extends BaseDO {
26   -
27   - /**
28   - * 编号
29   - */
30   - @TableId
31   - private Long id;
32   -
33   - /**
34   - * 所属用户
35   - */
36   - private Long userId;
37   -
38   - /**
39   - * 会话类型
40   - * <p>
41   - * 枚举 {@link ImConversationTypeEnum}
42   - */
43   - private Integer type;
44   - /**
45   - * 聊天对象编号
46   - * <p>
47   - * 1. 单聊时,用户编号;
48   - * 2. 群聊时,群编号
49   - */
50   - private Long targetId;
51   - /**
52   - * 会话标志
53   - *
54   - * 1. 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId
55   - * 2. 群聊:g_groupId
56   - */
57   - private String no;
58   - /**
59   - * 是否置顶
60   - */
61   - private Boolean pinned;
62   - /**
63   - * 最后已读时间
64   - */
65   - private LocalDateTime lastReadTime;
66   -
67   -}
68 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ImConversationMapper.java deleted
1   -package cn.iocoder.yudao.module.im.dal.mysql.conversation;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
5   -import org.apache.ibatis.annotations.Mapper;
6   -
7   -/**
8   - * IM 会话 Mapper
9   - *
10   - * @author 芋道源码
11   - */
12   -@Mapper
13   -public interface ImConversationMapper extends BaseMapperX<ImConversationDO> {
14   -
15   - default ImConversationDO selectByNo(String no){
16   - return selectOne(ImConversationDO::getNo, no);
17   - }
18   -}
19 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java deleted
1   -package cn.iocoder.yudao.module.im.service.conversation;
2   -
3   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO;
4   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
5   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
6   -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
7   -
8   -import java.util.List;
9   -
10   -/**
11   - * IM 会话 Service 接口
12   - *
13   - * @author 芋道源码
14   - */
15   -public interface ImConversationService {
16   -
17   - /**
18   - * 获得用户的会话列表
19   - *
20   - * @return 会话列表
21   - */
22   - List<ImConversationDO> getConversationList(Long loginUserId);
23   -
24   - /**
25   - * 置顶会话
26   - *
27   - * @param loginUserId 登录用户编号
28   - * @param updateReqVO 更新信息
29   - */
30   - void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO);
31   -
32   - /**
33   - * 更新最后已读时间
34   - *
35   - * @param loginUserId 登录用户编号
36   - * @param updateReqVO 更新信息
37   - */
38   - void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO);
39   -
40   - ImConversationDO createConversation(Long loginUserId, ImConversationCreateReqVO createReqVO);
41   -
42   -}
43 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java deleted
1   -package cn.iocoder.yudao.module.im.service.conversation;
2   -
3   -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4   -import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender;
5   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationCreateReqVO;
6   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
7   -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
8   -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
9   -import cn.iocoder.yudao.module.im.dal.mysql.conversation.ImConversationMapper;
10   -import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
11   -import jakarta.annotation.Resource;
12   -import org.springframework.stereotype.Service;
13   -import org.springframework.validation.annotation.Validated;
14   -
15   -import java.util.List;
16   -
17   -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
18   -
19   -/**
20   - * IM 会话 Service 实现类
21   - *
22   - * @author 芋道源码
23   - */
24   -@Service
25   -@Validated
26   -public class ImConversationServiceImpl implements ImConversationService {
27   -
28   - private final String IM_CONVERSATION_ADD = "im-conversation-add";
29   -
30   - @Resource
31   - private ImConversationMapper imConversationMapper;
32   -
33   - @Resource
34   - WebSocketMessageSender webSocketMessageSender;
35   -
36   - @Override
37   - public List<ImConversationDO> getConversationList(Long loginUserId) {
38   - // 根据loginUserId判断targetId, 自己不能做targetId
39   - // 如果loginUserId和targetId相同,则需要调换userId和targetId
40   - List<ImConversationDO> conversationList = imConversationMapper.selectList();
41   -
42   - // 过滤和自己无关的会话
43   - List<ImConversationDO> conversationFilteredList = conversationList.stream().filter(item -> loginUserId.equals(item.getUserId()) || loginUserId.equals(item.getTargetId())).toList();
44   - // 遍历判断loginUserId和targetId相同,相同则将userId设置为targetId, targetId设置为userId
45   - conversationFilteredList.forEach(item -> {
46   - if (item.getTargetId().equals(loginUserId)) {
47   - Long targetId = item.getTargetId();
48   - Long userId = item.getUserId();
49   - item.setTargetId(userId);
50   - item.setUserId(targetId);
51   - }
52   - });
53   - return conversationFilteredList;
54   - }
55   -
56   - @Override
57   - public void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO) {
58   - // 1. 获得会话编号
59   - String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
60   - // 2. 查询会话
61   - ImConversationDO conversation = imConversationMapper.selectByNo(no);
62   - if (conversation == null) {
63   - // 2.1. 不存在,则插入
64   - conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
65   - }
66   - // 3. 更新会话
67   - conversation.setPinned(updateReqVO.getPinned());
68   - imConversationMapper.updateById(conversation);
69   - // 4. 做对应更新的 notify 推送
70   - }
71   -
72   - private ImConversationDO insertConversation(String no, Long userId, Long targetId, Integer type) {
73   - ImConversationDO imConversationDO = new ImConversationDO();
74   - imConversationDO.setNo(no);
75   - imConversationDO.setUserId(userId);
76   - imConversationDO.setTargetId(targetId);
77   - imConversationDO.setType(type);
78   - imConversationMapper.insert(imConversationDO);
79   - return imConversationDO;
80   - }
81   -
82   - @Override
83   - public void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO) {
84   - // 1. 获得会话编号
85   - String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
86   - // 2. 查询会话
87   - ImConversationDO conversation = imConversationMapper.selectByNo(no);
88   - if (conversation == null) {
89   - // 2.1. 不存在,则插入
90   - conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
91   - }
92   - // 3. 更新会话
93   - conversation.setLastReadTime(updateReqVO.getLastReadTime());
94   - imConversationMapper.updateById(conversation);
95   - // 4. 做对应更新的 notify 推送
96   - }
97   -
98   - @Override
99   - public ImConversationDO createConversation(Long loginUserId, ImConversationCreateReqVO createReqVO) {
100   - // 1. 获得会话编号
101   - String no = ImConversationTypeEnum.generateConversationNo(loginUserId, createReqVO.getTargetId(), createReqVO.getType());
102   - // 2. 查询会话
103   - ImConversationDO conversation = imConversationMapper.selectByNo(no);
104   -
105   - if (conversation == null) {
106   - // 2.1. 不存在,则插入
107   - conversation = insertConversation(no, loginUserId, createReqVO.getTargetId(), createReqVO.getType());
108   - }
109   -
110   - // 发送打开会话的通知,并推送会话实体
111   - // 给自己发送创建会话成功的通知, 方便多端登录的时候保持会话同时更新
112   - webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), getLoginUserId(),
113   - IM_CONVERSATION_ADD, conversation);
114   -
115   - // 给接受者发送创建会话的通知
116   - // TODO:[dylan] 接受者,在接收到消息的时候本地发现没有回话,就按照会话编号创建一个,因此可以不需要发送这个通知
117   - webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), createReqVO.getTargetId(),
118   - IM_CONVERSATION_ADD, conversation);
119   - return conversation;
120   - }
121   -
122   -}
123 0 \ No newline at end of file