Commit fa23ce144d9391c3b30b050c2ad80f6a21bcda82
1 parent
2b891cb4
修改:代码优化
Showing
49 changed files
with
423 additions
and
711 deletions
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java
| @@ -6,7 +6,6 @@ import lombok.Getter; | @@ -6,7 +6,6 @@ import lombok.Getter; | ||
| 6 | 6 | ||
| 7 | import java.util.Arrays; | 7 | import java.util.Arrays; |
| 8 | 8 | ||
| 9 | -// TODO @anhaohao:IM 前缀还是要的哈 | ||
| 10 | /** | 9 | /** |
| 11 | * IM 会话类型枚举 | 10 | * IM 会话类型枚举 |
| 12 | * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档 | 11 | * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档 |
| @@ -15,13 +14,13 @@ import java.util.Arrays; | @@ -15,13 +14,13 @@ import java.util.Arrays; | ||
| 15 | */ | 14 | */ |
| 16 | @Getter | 15 | @Getter |
| 17 | @AllArgsConstructor | 16 | @AllArgsConstructor |
| 18 | -public enum ConversationTypeEnum implements IntArrayValuable { | 17 | +public enum ImConversationTypeEnum implements IntArrayValuable { |
| 19 | 18 | ||
| 20 | SINGLE(1, "单聊"), | 19 | SINGLE(1, "单聊"), |
| 21 | GROUP(3, "群聊"), | 20 | GROUP(3, "群聊"), |
| 22 | NOTIFICATION(4, "通知会话"); | 21 | NOTIFICATION(4, "通知会话"); |
| 23 | 22 | ||
| 24 | - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ConversationTypeEnum::getType).toArray(); | 23 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImConversationTypeEnum::getType).toArray(); |
| 25 | 24 | ||
| 26 | /** | 25 | /** |
| 27 | * 类型 | 26 | * 类型 |
| @@ -33,25 +32,26 @@ public enum ConversationTypeEnum implements IntArrayValuable { | @@ -33,25 +32,26 @@ public enum ConversationTypeEnum implements IntArrayValuable { | ||
| 33 | */ | 32 | */ |
| 34 | private final String name; | 33 | private final String name; |
| 35 | 34 | ||
| 36 | - @Override | ||
| 37 | - public int[] array() { | ||
| 38 | - return ARRAYS; | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | /** | 35 | /** |
| 42 | - * 生成会话编号 TODO @anhaohao:方法注释,和下面参数之间,要有空格 | ||
| 43 | - * @param fromUserId 发送者编号 | ||
| 44 | - * @param receiverId 接收者编号 | 36 | + * 生成会话编号 |
| 37 | + * | ||
| 38 | + * @param fromUserId 发送者编号 | ||
| 39 | + * @param receiverId 接收者编号 | ||
| 45 | * @param conversationType 会话类型 | 40 | * @param conversationType 会话类型 |
| 46 | * @return 会话编号 | 41 | * @return 会话编号 |
| 47 | */ | 42 | */ |
| 48 | public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) { | 43 | public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) { |
| 49 | - if (conversationType.equals(ConversationTypeEnum.SINGLE.getType())) { | 44 | + if (conversationType.equals(ImConversationTypeEnum.SINGLE.getType())) { |
| 50 | return "s_" + fromUserId + "_" + receiverId; | 45 | return "s_" + fromUserId + "_" + receiverId; |
| 51 | - } else if (conversationType.equals(ConversationTypeEnum.GROUP.getType())) { | 46 | + } else if (conversationType.equals(ImConversationTypeEnum.GROUP.getType())) { |
| 52 | return "g_" + receiverId; | 47 | return "g_" + receiverId; |
| 53 | } | 48 | } |
| 54 | return null; | 49 | return null; |
| 55 | } | 50 | } |
| 56 | 51 | ||
| 52 | + @Override | ||
| 53 | + public int[] array() { | ||
| 54 | + return ARRAYS; | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | } | 57 | } |
| 58 | \ No newline at end of file | 58 | \ No newline at end of file |
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java
| @@ -6,7 +6,6 @@ import lombok.Getter; | @@ -6,7 +6,6 @@ import lombok.Getter; | ||
| 6 | 6 | ||
| 7 | import java.util.Arrays; | 7 | import java.util.Arrays; |
| 8 | 8 | ||
| 9 | -// TODO @anhaohao:IM 前缀还是要的哈 | ||
| 10 | /** | 9 | /** |
| 11 | * IM 消息的类型枚举 | 10 | * IM 消息的类型枚举 |
| 12 | * <p> | 11 | * <p> |
| @@ -16,7 +15,7 @@ import java.util.Arrays; | @@ -16,7 +15,7 @@ import java.util.Arrays; | ||
| 16 | */ | 15 | */ |
| 17 | @Getter | 16 | @Getter |
| 18 | @AllArgsConstructor | 17 | @AllArgsConstructor |
| 19 | -public enum MessageContentTypeEnum implements IntArrayValuable { | 18 | +public enum ImMessageContentTypeEnum implements IntArrayValuable { |
| 20 | 19 | ||
| 21 | TEXT(101, "文本消息"), | 20 | TEXT(101, "文本消息"), |
| 22 | PICTURE(102, "图片消息"), | 21 | PICTURE(102, "图片消息"), |
| @@ -57,7 +56,7 @@ public enum MessageContentTypeEnum implements IntArrayValuable { | @@ -57,7 +56,7 @@ public enum MessageContentTypeEnum implements IntArrayValuable { | ||
| 57 | BURN_CHANGE(1701, "阅后即焚开启或关闭通知"), | 56 | BURN_CHANGE(1701, "阅后即焚开启或关闭通知"), |
| 58 | REVOKE(2101, "撤回消息通知");; | 57 | REVOKE(2101, "撤回消息通知");; |
| 59 | 58 | ||
| 60 | - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageContentTypeEnum::getType).toArray(); | 59 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageContentTypeEnum::getType).toArray(); |
| 61 | 60 | ||
| 62 | /** | 61 | /** |
| 63 | * 类型 | 62 | * 类型 |
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java
| @@ -6,24 +6,22 @@ import lombok.RequiredArgsConstructor; | @@ -6,24 +6,22 @@ import lombok.RequiredArgsConstructor; | ||
| 6 | 6 | ||
| 7 | import java.util.Arrays; | 7 | import java.util.Arrays; |
| 8 | 8 | ||
| 9 | -// TODO @anhaohao:IM 前缀还是要的哈 | ||
| 10 | /** | 9 | /** |
| 11 | * IM 消息的消息来源 | 10 | * IM 消息的消息来源 |
| 12 | */ | 11 | */ |
| 13 | @RequiredArgsConstructor | 12 | @RequiredArgsConstructor |
| 14 | @Getter | 13 | @Getter |
| 15 | -public enum MessageSourceEnum implements IntArrayValuable { | 14 | +public enum ImMessageSourceEnum implements IntArrayValuable { |
| 16 | 15 | ||
| 17 | USER_SEND(100, "用户发送"), | 16 | USER_SEND(100, "用户发送"), |
| 18 | SYSTEM_SEND(200, "系统发送"); | 17 | SYSTEM_SEND(200, "系统发送"); |
| 19 | 18 | ||
| 20 | - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageSourceEnum::getStatus).toArray(); | 19 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageSourceEnum::getSource).toArray(); |
| 21 | 20 | ||
| 22 | - // TODO @anhaohao:应该是 source | ||
| 23 | /** | 21 | /** |
| 24 | * 状态 | 22 | * 状态 |
| 25 | */ | 23 | */ |
| 26 | - private final Integer status; | 24 | + private final Integer source; |
| 27 | /** | 25 | /** |
| 28 | * 名字 | 26 | * 名字 |
| 29 | */ | 27 | */ |
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java
| @@ -6,27 +6,21 @@ import lombok.RequiredArgsConstructor; | @@ -6,27 +6,21 @@ import lombok.RequiredArgsConstructor; | ||
| 6 | 6 | ||
| 7 | import java.util.Arrays; | 7 | import java.util.Arrays; |
| 8 | 8 | ||
| 9 | -// TODO @anhaohao:IM 前缀还是要的哈 | ||
| 10 | -// TODO TODO 状态是这些哈,客户端的视角: | ||
| 11 | -// | ||
| 12 | -//- 草稿(预留) 0 | ||
| 13 | -//- 发送中 1 | ||
| 14 | -//- 发送成功 2 | ||
| 15 | -//- 发送失败 3 | ||
| 16 | -//- 已删除 4 | ||
| 17 | -//- 已撤回 5 | ||
| 18 | /** | 9 | /** |
| 19 | * IM 消息的状态枚举 | 10 | * IM 消息的状态枚举 |
| 20 | */ | 11 | */ |
| 21 | @RequiredArgsConstructor | 12 | @RequiredArgsConstructor |
| 22 | @Getter | 13 | @Getter |
| 23 | -public enum MessageStatusEnum implements IntArrayValuable { | 14 | +public enum ImMessageStatusEnum implements IntArrayValuable { |
| 24 | 15 | ||
| 16 | + DRAFT(0, "草稿"), | ||
| 25 | SENDING(1, "发送中"), | 17 | SENDING(1, "发送中"), |
| 26 | - SUCCEED(2, "发送成功"), | ||
| 27 | - FAILED(3, "发送失败"); | 18 | + SUCCESS(2, "发送成功"), |
| 19 | + FAILURE(3, "发送失败"), | ||
| 20 | + DELETED(4, "已删除"), | ||
| 21 | + RECALL(5, "已撤回"); | ||
| 28 | 22 | ||
| 29 | - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageStatusEnum::getStatus).toArray(); | 23 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageStatusEnum::getStatus).toArray(); |
| 30 | 24 | ||
| 31 | /** | 25 | /** |
| 32 | * 状态 | 26 | * 状态 |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
| @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.im.controller.admin.conversation; | @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.im.controller.admin.conversation; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; | 5 | +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO; |
| 6 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; | 6 | import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; |
| 7 | -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; | 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.service.conversation.ConversationService; | 9 | import cn.iocoder.yudao.module.im.service.conversation.ConversationService; |
| 10 | import io.swagger.v3.oas.annotations.Operation; | 10 | import io.swagger.v3.oas.annotations.Operation; |
| 11 | import io.swagger.v3.oas.annotations.tags.Tag; | 11 | import io.swagger.v3.oas.annotations.tags.Tag; |
| @@ -17,13 +17,13 @@ import org.springframework.web.bind.annotation.*; | @@ -17,13 +17,13 @@ import org.springframework.web.bind.annotation.*; | ||
| 17 | import java.util.List; | 17 | import java.util.List; |
| 18 | 18 | ||
| 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 20 | +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | ||
| 20 | 21 | ||
| 21 | -// TODO @anhaohao:im 前缀少啦 | ||
| 22 | @Tag(name = "管理后台 - IM 会话") | 22 | @Tag(name = "管理后台 - IM 会话") |
| 23 | @RestController | 23 | @RestController |
| 24 | @RequestMapping("/im/conversation") | 24 | @RequestMapping("/im/conversation") |
| 25 | @Validated | 25 | @Validated |
| 26 | -public class ConversationController { | 26 | +public class ImConversationController { |
| 27 | 27 | ||
| 28 | @Resource | 28 | @Resource |
| 29 | private ConversationService conversationService; | 29 | private ConversationService conversationService; |
| @@ -31,23 +31,21 @@ public class ConversationController { | @@ -31,23 +31,21 @@ public class ConversationController { | ||
| 31 | @GetMapping("/list") | 31 | @GetMapping("/list") |
| 32 | @Operation(summary = "获得用户的会话列表") | 32 | @Operation(summary = "获得用户的会话列表") |
| 33 | public CommonResult<List<ImConversationRespVO>> getConversationList() { | 33 | public CommonResult<List<ImConversationRespVO>> getConversationList() { |
| 34 | - List<ConversationDO> conversationList = conversationService.getConversationList(); | 34 | + List<ImConversationDO> conversationList = conversationService.getConversationList(); |
| 35 | return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class)); | 35 | return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class)); |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | - // TODO @hao:这个接口,需要单独的 VO 哈; | ||
| 39 | @PostMapping("/update-pinned") | 38 | @PostMapping("/update-pinned") |
| 40 | @Operation(summary = "置顶会话") | 39 | @Operation(summary = "置顶会话") |
| 41 | - public CommonResult<Boolean> updatePinned(@Valid @RequestBody ConversationPinnedReqVO updateReqVO) { | ||
| 42 | - conversationService.updatePinned(updateReqVO); | 40 | + public CommonResult<Boolean> updatePinned(@Valid @RequestBody ImConversationUpdatePinnedReqVO updateReqVO) { |
| 41 | + conversationService.updatePinned(getLoginUserId(),updateReqVO); | ||
| 43 | return success(true); | 42 | return success(true); |
| 44 | } | 43 | } |
| 45 | 44 | ||
| 46 | - // TODO @hao:这个接口,需要单独的 VO 哈; | ||
| 47 | @PostMapping("/update-last-read-time") | 45 | @PostMapping("/update-last-read-time") |
| 48 | @Operation(summary = "更新最后已读时间") | 46 | @Operation(summary = "更新最后已读时间") |
| 49 | - public CommonResult<Boolean> updateLastReadTime(@Valid @RequestBody ConversationLastTimeReqVO updateReqVO) { | ||
| 50 | - conversationService.updateLastReadTime(updateReqVO); | 47 | + public CommonResult<Boolean> updateLastReadTime(@Valid @RequestBody ImConversationUpdateLastReadTimeReqVO updateReqVO) { |
| 48 | + conversationService.updateLastReadTime(getLoginUserId(),updateReqVO); | ||
| 51 | return success(true); | 49 | return success(true); |
| 52 | } | 50 | } |
| 53 | 51 |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java
| 1 | package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; | 1 | package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 5 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | -import jakarta.validation.constraints.NotEmpty; | ||
| 5 | import jakarta.validation.constraints.NotNull; | 6 | import jakarta.validation.constraints.NotNull; |
| 6 | import lombok.Data; | 7 | import lombok.Data; |
| 7 | 8 | ||
| 8 | import java.time.LocalDateTime; | 9 | import java.time.LocalDateTime; |
| 9 | 10 | ||
| 10 | -// TODO @anhaohao:改成 ConversationUpdateLastReadTimeReqVO,项目目前都是动名词哈。更新置顶 | ||
| 11 | @Schema(description = "管理后台 - 会话最后已读时间 Request VO") | 11 | @Schema(description = "管理后台 - 会话最后已读时间 Request VO") |
| 12 | @Data | 12 | @Data |
| 13 | -public class ConversationLastTimeReqVO { | ||
| 14 | - | ||
| 15 | - // TODO @anhaohao:no 不用传递哈。因为 userId + targetId 可以推出来 | ||
| 16 | - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2") | ||
| 17 | - @NotEmpty(message = "会话标志不能为空") | ||
| 18 | - private String no; | 13 | +public class ImConversationUpdateLastReadTimeReqVO { |
| 19 | 14 | ||
| 20 | @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00") | 15 | @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00") |
| 21 | @NotNull(message = "最后已读时间不能为空") | 16 | @NotNull(message = "最后已读时间不能为空") |
| 22 | private LocalDateTime lastReadTime; | 17 | private LocalDateTime lastReadTime; |
| 23 | 18 | ||
| 24 | - // TODO @anhaohao:userId 不用传递,因为 token 已经能解析出当前用户 | ||
| 25 | - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 26 | - private Long userId; | ||
| 27 | - | ||
| 28 | @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | 19 | @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 29 | private Long targetId; | 20 | private Long targetId; |
| 30 | 21 | ||
| 31 | - @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 32 | - private Integer type; // 枚举 ConversationTypeEnum TODO ,这里可以使用 @InEnum 校验,这样这个注释就不用写了 | 22 | + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 23 | + @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}") | ||
| 24 | + private Integer type; | ||
| 33 | 25 | ||
| 34 | } | 26 | } |
| 35 | \ No newline at end of file | 27 | \ 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/ConversationPinnedReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java
| 1 | package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; | 1 | package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; |
| 2 | 2 | ||
| 3 | -import com.alibaba.excel.annotation.ExcelProperty; | 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 4 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; | ||
| 4 | import io.swagger.v3.oas.annotations.media.Schema; | 5 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | -import jakarta.validation.constraints.NotEmpty; | ||
| 6 | import jakarta.validation.constraints.NotNull; | 6 | import jakarta.validation.constraints.NotNull; |
| 7 | import lombok.Data; | 7 | import lombok.Data; |
| 8 | 8 | ||
| 9 | -import java.time.LocalDateTime; | ||
| 10 | - | ||
| 11 | -// TODO @anhaohao:改成 ConversationUpdatePinnedReqVO,项目目前都是动名词哈。更新置顶 | ||
| 12 | @Schema(description = "管理后台 - 会话置顶 Request VO") | 9 | @Schema(description = "管理后台 - 会话置顶 Request VO") |
| 13 | @Data | 10 | @Data |
| 14 | -public class ConversationPinnedReqVO { | ||
| 15 | - | ||
| 16 | - // TODO @anhaohao:no 不用传递哈。因为 userId + targetId 可以推出来 | ||
| 17 | - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2") | ||
| 18 | - @NotEmpty(message = "会话标志不能为空") | ||
| 19 | - private String no; | 11 | +public class ImConversationUpdatePinnedReqVO { |
| 20 | 12 | ||
| 21 | @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 13 | @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 22 | @NotNull(message = "是否置顶不能为空") | 14 | @NotNull(message = "是否置顶不能为空") |
| 23 | private Boolean pinned; | 15 | private Boolean pinned; |
| 24 | 16 | ||
| 25 | - // TODO @anhaohao:userId 不用传递,因为 token 已经能解析出当前用户 | ||
| 26 | - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 27 | - private Long userId; | ||
| 28 | - | ||
| 29 | @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | 17 | @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 30 | private Long targetId; | 18 | private Long targetId; |
| 31 | 19 | ||
| 32 | - @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 33 | - private Integer type; // 枚举 ConversationTypeEnum TODO ,这里可以使用 @InEnum 校验,这样这个注释就不用写了 | 20 | + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 21 | + @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}") | ||
| 22 | + private Integer type; | ||
| 34 | 23 | ||
| 35 | } | 24 | } |
| 36 | \ No newline at end of file | 25 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java
| @@ -25,8 +25,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | @@ -25,8 +25,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | ||
| 25 | import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; | 25 | import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; |
| 26 | 26 | ||
| 27 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; | 27 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; |
| 28 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; | ||
| 29 | -import cn.iocoder.yudao.module.im.service.group.ImGroupService; | 28 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; |
| 29 | +import cn.iocoder.yudao.module.im.service.group.GroupService; | ||
| 30 | 30 | ||
| 31 | // TODO @芋艿:得看看 create、update、delete、get、page 这几个接口,要保留哪些 | 31 | // TODO @芋艿:得看看 create、update、delete、get、page 这几个接口,要保留哪些 |
| 32 | @Tag(name = "管理后台 - 群") | 32 | @Tag(name = "管理后台 - 群") |
| @@ -36,20 +36,20 @@ import cn.iocoder.yudao.module.im.service.group.ImGroupService; | @@ -36,20 +36,20 @@ import cn.iocoder.yudao.module.im.service.group.ImGroupService; | ||
| 36 | public class ImGroupController { | 36 | public class ImGroupController { |
| 37 | 37 | ||
| 38 | @Resource | 38 | @Resource |
| 39 | - private ImGroupService imGroupService; | 39 | + private GroupService groupService; |
| 40 | 40 | ||
| 41 | @PostMapping("/create") | 41 | @PostMapping("/create") |
| 42 | @Operation(summary = "创建群") | 42 | @Operation(summary = "创建群") |
| 43 | @PreAuthorize("@ss.hasPermission('im:group:create')") | 43 | @PreAuthorize("@ss.hasPermission('im:group:create')") |
| 44 | public CommonResult<Long> createGroup(@Valid @RequestBody ImGroupSaveReqVO createReqVO) { | 44 | public CommonResult<Long> createGroup(@Valid @RequestBody ImGroupSaveReqVO createReqVO) { |
| 45 | - return success(imGroupService.createGroup(createReqVO)); | 45 | + return success(groupService.createGroup(createReqVO)); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | @PutMapping("/update") | 48 | @PutMapping("/update") |
| 49 | @Operation(summary = "更新群") | 49 | @Operation(summary = "更新群") |
| 50 | @PreAuthorize("@ss.hasPermission('im:group:update')") | 50 | @PreAuthorize("@ss.hasPermission('im:group:update')") |
| 51 | public CommonResult<Boolean> updateGroup(@Valid @RequestBody ImGroupSaveReqVO updateReqVO) { | 51 | public CommonResult<Boolean> updateGroup(@Valid @RequestBody ImGroupSaveReqVO updateReqVO) { |
| 52 | - imGroupService.updateGroup(updateReqVO); | 52 | + groupService.updateGroup(updateReqVO); |
| 53 | return success(true); | 53 | return success(true); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| @@ -58,7 +58,7 @@ public class ImGroupController { | @@ -58,7 +58,7 @@ public class ImGroupController { | ||
| 58 | @Parameter(name = "id", description = "编号", required = true) | 58 | @Parameter(name = "id", description = "编号", required = true) |
| 59 | @PreAuthorize("@ss.hasPermission('im:group:delete')") | 59 | @PreAuthorize("@ss.hasPermission('im:group:delete')") |
| 60 | public CommonResult<Boolean> deleteGroup(@RequestParam("id") Long id) { | 60 | public CommonResult<Boolean> deleteGroup(@RequestParam("id") Long id) { |
| 61 | - imGroupService.deleteGroup(id); | 61 | + groupService.deleteGroup(id); |
| 62 | return success(true); | 62 | return success(true); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| @@ -67,7 +67,7 @@ public class ImGroupController { | @@ -67,7 +67,7 @@ public class ImGroupController { | ||
| 67 | @Parameter(name = "id", description = "编号", required = true, example = "1024") | 67 | @Parameter(name = "id", description = "编号", required = true, example = "1024") |
| 68 | @PreAuthorize("@ss.hasPermission('im:group:query')") | 68 | @PreAuthorize("@ss.hasPermission('im:group:query')") |
| 69 | public CommonResult<ImGroupRespVO> getGroup(@RequestParam("id") Long id) { | 69 | public CommonResult<ImGroupRespVO> getGroup(@RequestParam("id") Long id) { |
| 70 | - GroupDO group = imGroupService.getGroup(id); | 70 | + ImGroupDO group = groupService.getGroup(id); |
| 71 | return success(BeanUtils.toBean(group, ImGroupRespVO.class)); | 71 | return success(BeanUtils.toBean(group, ImGroupRespVO.class)); |
| 72 | } | 72 | } |
| 73 | 73 | ||
| @@ -75,22 +75,8 @@ public class ImGroupController { | @@ -75,22 +75,8 @@ public class ImGroupController { | ||
| 75 | @Operation(summary = "获得群分页") | 75 | @Operation(summary = "获得群分页") |
| 76 | @PreAuthorize("@ss.hasPermission('im:group:query')") | 76 | @PreAuthorize("@ss.hasPermission('im:group:query')") |
| 77 | public CommonResult<PageResult<ImGroupRespVO>> getGroupPage(@Valid ImGroupPageReqVO pageReqVO) { | 77 | public CommonResult<PageResult<ImGroupRespVO>> getGroupPage(@Valid ImGroupPageReqVO pageReqVO) { |
| 78 | - PageResult<GroupDO> pageResult = imGroupService.getGroupPage(pageReqVO); | 78 | + PageResult<ImGroupDO> pageResult = groupService.getGroupPage(pageReqVO); |
| 79 | return success(BeanUtils.toBean(pageResult, ImGroupRespVO.class)); | 79 | return success(BeanUtils.toBean(pageResult, ImGroupRespVO.class)); |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | - // TODO @anhaohao:导出可以先不做哈; | ||
| 83 | - @GetMapping("/export-excel") | ||
| 84 | - @Operation(summary = "导出群 Excel") | ||
| 85 | - @PreAuthorize("@ss.hasPermission('im:group:export')") | ||
| 86 | - @OperateLog(type = EXPORT) | ||
| 87 | - public void exportGroupExcel(@Valid ImGroupPageReqVO pageReqVO, | ||
| 88 | - HttpServletResponse response) throws IOException { | ||
| 89 | - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); | ||
| 90 | - List<GroupDO> list = imGroupService.getGroupPage(pageReqVO).getList(); | ||
| 91 | - // 导出 Excel | ||
| 92 | - ExcelUtils.write(response, "群.xls", "数据", ImGroupRespVO.class, | ||
| 93 | - BeanUtils.toBean(list, ImGroupRespVO.class)); | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | } | 82 | } |
| 97 | \ No newline at end of file | 83 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java
| @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | ||
| 9 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; | 9 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; |
| 10 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO; | 10 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO; |
| 11 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; | 11 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; |
| 12 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; | 12 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; |
| 13 | import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; | 13 | import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; |
| 14 | import io.swagger.v3.oas.annotations.Operation; | 14 | import io.swagger.v3.oas.annotations.Operation; |
| 15 | import io.swagger.v3.oas.annotations.Parameter; | 15 | import io.swagger.v3.oas.annotations.Parameter; |
| @@ -66,7 +66,7 @@ public class ImGroupMemberController { | @@ -66,7 +66,7 @@ public class ImGroupMemberController { | ||
| 66 | @Parameter(name = "id", description = "编号", required = true, example = "1024") | 66 | @Parameter(name = "id", description = "编号", required = true, example = "1024") |
| 67 | @PreAuthorize("@ss.hasPermission('im:group-member:query')") | 67 | @PreAuthorize("@ss.hasPermission('im:group-member:query')") |
| 68 | public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) { | 68 | public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) { |
| 69 | - GroupMemberDO groupMember = groupMemberService.getGroupMember(id); | 69 | + ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id); |
| 70 | return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class)); | 70 | return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class)); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| @@ -74,7 +74,7 @@ public class ImGroupMemberController { | @@ -74,7 +74,7 @@ public class ImGroupMemberController { | ||
| 74 | @Operation(summary = "获得群成员分页") | 74 | @Operation(summary = "获得群成员分页") |
| 75 | @PreAuthorize("@ss.hasPermission('im:group-member:query')") | 75 | @PreAuthorize("@ss.hasPermission('im:group-member:query')") |
| 76 | public CommonResult<PageResult<ImGroupMemberRespVO>> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) { | 76 | public CommonResult<PageResult<ImGroupMemberRespVO>> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) { |
| 77 | - PageResult<GroupMemberDO> pageResult = groupMemberService.getGroupMemberPage(pageReqVO); | 77 | + PageResult<ImGroupMemberDO> pageResult = groupMemberService.getGroupMemberPage(pageReqVO); |
| 78 | return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class)); | 78 | return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class)); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| @@ -85,7 +85,7 @@ public class ImGroupMemberController { | @@ -85,7 +85,7 @@ public class ImGroupMemberController { | ||
| 85 | public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO, | 85 | public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO, |
| 86 | HttpServletResponse response) throws IOException { | 86 | HttpServletResponse response) throws IOException { |
| 87 | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); | 87 | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| 88 | - List<GroupMemberDO> list = groupMemberService.getGroupMemberPage(pageReqVO).getList(); | 88 | + List<ImGroupMemberDO> list = groupMemberService.getGroupMemberPage(pageReqVO).getList(); |
| 89 | // 导出 Excel | 89 | // 导出 Excel |
| 90 | ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class, | 90 | ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class, |
| 91 | BeanUtils.toBean(list, ImGroupMemberRespVO.class)); | 91 | BeanUtils.toBean(list, ImGroupMemberRespVO.class)); |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import lombok.Data; | ||
| 5 | - | ||
| 6 | -import java.time.LocalDateTime; | ||
| 7 | - | ||
| 8 | -// TODO @anhaohao:im 前缀哈 | ||
| 9 | -@Schema(description = "管理后台 - 收件箱保存消息 Request VO") | ||
| 10 | -@Data | ||
| 11 | -public class InboxSaveMessageReqVO { | ||
| 12 | - | ||
| 13 | - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 14 | - private Integer conversationType; // 对应 ImConversationTypeEnum 枚举 | ||
| 15 | - | ||
| 16 | - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 17 | - private Long fromId; // 根据 conversationType 区分 | ||
| 18 | - | ||
| 19 | - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") | ||
| 20 | - private String senderNickname; | ||
| 21 | - | ||
| 22 | - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 23 | - private String senderAvatar; | ||
| 24 | - | ||
| 25 | - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") | ||
| 26 | - private Long receiverId; | ||
| 27 | - | ||
| 28 | - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") | ||
| 29 | - private Long messageId; | ||
| 30 | - | ||
| 31 | - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 32 | - private Integer contentType; // 参见 ImMessageTypeEnum 枚举 | ||
| 33 | - | ||
| 34 | - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 35 | - private String content; | ||
| 36 | - | ||
| 37 | - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 38 | - private LocalDateTime sendTime; | ||
| 39 | - | ||
| 40 | -// @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 41 | -// private Long sequence; | ||
| 42 | - | ||
| 43 | -} | ||
| 44 | \ No newline at end of file | 0 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java
0 → 100644
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
| @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.im.controller.admin.message; | @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.im.controller.admin.message; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO; | ||
| 9 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 5 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; |
| 6 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO; | ||
| 7 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendRespVO; | ||
| 9 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; | ||
| 10 | import cn.iocoder.yudao.module.im.service.message.MessageService; | 10 | import cn.iocoder.yudao.module.im.service.message.MessageService; |
| 11 | import io.swagger.v3.oas.annotations.Operation; | 11 | import io.swagger.v3.oas.annotations.Operation; |
| 12 | import io.swagger.v3.oas.annotations.Parameter; | 12 | import io.swagger.v3.oas.annotations.Parameter; |
| @@ -25,35 +25,33 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | @@ -25,35 +25,33 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | ||
| 25 | @RestController | 25 | @RestController |
| 26 | @RequestMapping("/im/message") | 26 | @RequestMapping("/im/message") |
| 27 | @Validated | 27 | @Validated |
| 28 | -public class MessageController { | 28 | +public class ImMessageController { |
| 29 | 29 | ||
| 30 | @Resource | 30 | @Resource |
| 31 | private MessageService messageService; | 31 | private MessageService messageService; |
| 32 | 32 | ||
| 33 | @PostMapping("/send") | 33 | @PostMapping("/send") |
| 34 | @Operation(summary = "发送消息") | 34 | @Operation(summary = "发送消息") |
| 35 | - public CommonResult<SendMessageRespVO> sendMessage(@Valid @RequestBody SendMessageReqVO message) { | ||
| 36 | - return success(messageService.sendMessage(getLoginUserId(), message)); | 35 | + public CommonResult<ImMessageSendRespVO> sendMessage(@Valid @RequestBody ImMessageSendReqVO imMessageSendReqVO) { |
| 36 | + ImMessageDO message = messageService.sendMessage(getLoginUserId(), imMessageSendReqVO); | ||
| 37 | + return success(BeanUtils.toBean(message, ImMessageSendRespVO.class)); | ||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | - // TODO @anhaohao:我在想,这个接口,改成叫 pullMessageList,会不会更好理解?拉取消息列表 | ||
| 40 | - @GetMapping("/list-by-sequence") | ||
| 41 | - @Operation(summary = "拉取大于 sequence 的消息列表") | 40 | + @GetMapping("/pull") |
| 41 | + @Operation(summary = "消息列表-拉取大于 sequence 的消息列表") | ||
| 42 | @Parameter(name = "sequence", description = "序号", required = true, example = "1") | 42 | @Parameter(name = "sequence", description = "序号", required = true, example = "1") |
| 43 | @Parameter(name = "size", description = "条数", required = true, example = "10") | 43 | @Parameter(name = "size", description = "条数", required = true, example = "10") |
| 44 | - public CommonResult<List<MessageReqVO>> getMessageListBySequence(@RequestParam("sequence") Long sequence, | ||
| 45 | - @RequestParam("size") Integer size) { | ||
| 46 | - List<MessageDO> messages = messageService.getMessageListBySequence(getLoginUserId(), sequence, size); | ||
| 47 | - return success(BeanUtils.toBean(messages, MessageReqVO.class)); | 44 | + public CommonResult<List<ImMessageRespVO>> pullMessageList(@RequestParam("sequence") Long sequence, |
| 45 | + @RequestParam("size") Integer size) { | ||
| 46 | + List<ImMessageDO> messages = messageService.pullMessageList(getLoginUserId(), sequence, size); | ||
| 47 | + return success(BeanUtils.toBean(messages, ImMessageRespVO.class)); | ||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | - // TODO @anhaohao:直接叫 getMessageList,不叫历史哈;因为它只是给用户叫历史,对系统来说,就是消息列表 | ||
| 51 | - @GetMapping("/history") | ||
| 52 | - @Operation(summary = "查询聊天记录-根据会话标志和发送时间进行分页查询") | ||
| 53 | - public CommonResult<List<MessageReqVO>> getHistoryMessage(@Valid MessagePageReqVO pageReqVO) { | ||
| 54 | - //根据会话标志和发送时间进行分页查询 | ||
| 55 | - List<MessageDO> messagePage = messageService.getHistoryMessage(pageReqVO); | ||
| 56 | - return success(BeanUtils.toBean(messagePage, MessageReqVO.class)); | 50 | + @GetMapping("/list") |
| 51 | + @Operation(summary = "消息列表-根据接收人和发送时间进行分页查询") | ||
| 52 | + public CommonResult<List<ImMessageRespVO>> getMessageList(@Valid ImMessageListReqVO listReqVO) { | ||
| 53 | + List<ImMessageDO> messagePage = messageService.getMessageList(getLoginUserId(), listReqVO); | ||
| 54 | + return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class)); | ||
| 57 | } | 55 | } |
| 58 | 56 | ||
| 59 | } | 57 | } |
| 60 | \ No newline at end of file | 58 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java
0 → 100755
| 1 | +package cn.iocoder.yudao.module.im.controller.admin.message.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 | +import lombok.ToString; | ||
| 9 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 10 | + | ||
| 11 | +import java.time.LocalDateTime; | ||
| 12 | + | ||
| 13 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; | ||
| 14 | + | ||
| 15 | +@Schema(description = "管理后台 - 消息列表 Request VO") | ||
| 16 | +@Data | ||
| 17 | +@ToString(callSuper = true) | ||
| 18 | +public class ImMessageListReqVO { | ||
| 19 | + | ||
| 20 | + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") | ||
| 21 | + @NotNull(message = "接收人编号不能为空") | ||
| 22 | + private Long receiverId; | ||
| 23 | + | ||
| 24 | + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | ||
| 25 | + @InEnum(value = ImConversationTypeEnum.class,message = "会话类型必须是 {value}") | ||
| 26 | + @NotNull(message = "会话类型不能为空") | ||
| 27 | + private Integer conversationType; | ||
| 28 | + | ||
| 29 | + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00") | ||
| 30 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) | ||
| 31 | + private LocalDateTime sendTime; | ||
| 32 | + | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java
100644 → 100755
| 1 | -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo; | 1 | +package cn.iocoder.yudao.module.im.controller.admin.message.vo; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; | ||
| 5 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum; | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | import lombok.Data; | 7 | import lombok.Data; |
| 5 | 8 | ||
| 6 | import java.time.LocalDateTime; | 9 | import java.time.LocalDateTime; |
| 7 | 10 | ||
| 8 | -@Schema(description = "管理后台 - 收件箱保存消息 Request VO") | 11 | +@Schema(description = "管理后台 - 消息 Response VO") |
| 9 | @Data | 12 | @Data |
| 10 | -public class InboxSendMessageReqVO { | 13 | +public class ImMessageRespVO { |
| 14 | + | ||
| 15 | + @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") | ||
| 16 | + private Long id; | ||
| 11 | 17 | ||
| 12 | @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 18 | @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 13 | - private Integer conversationType; // 对应 ImConversationTypeEnum 枚举 | 19 | + @InEnum(value = ImConversationTypeEnum.class) |
| 20 | + private Integer conversationType; | ||
| 14 | 21 | ||
| 15 | - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 16 | - private Long fromId; // 根据 conversationType 区分 | 22 | + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 23 | + private Long senderId; | ||
| 17 | 24 | ||
| 18 | @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") | 25 | @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") |
| 19 | private String senderNickname; | 26 | private String senderNickname; |
| 20 | 27 | ||
| 21 | - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) | 28 | + @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://www.iocoder.cn/xxx.jpg") |
| 22 | private String senderAvatar; | 29 | private String senderAvatar; |
| 23 | - | ||
| 24 | - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") | ||
| 25 | - private Long receiverId; | ||
| 26 | 30 | ||
| 27 | - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") | ||
| 28 | - private Long messageId; | 31 | + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 32 | + private Long receiverId; | ||
| 29 | 33 | ||
| 30 | @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 34 | @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 31 | - private Integer contentType; // 参见 ImMessageTypeEnum 枚举 | 35 | + @InEnum(value = ImMessageContentTypeEnum.class) |
| 36 | + private Integer contentType; | ||
| 32 | 37 | ||
| 33 | - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) | 38 | + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好") |
| 34 | private String content; | 39 | private String content; |
| 35 | 40 | ||
| 36 | - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) | 41 | + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00") |
| 37 | private LocalDateTime sendTime; | 42 | private LocalDateTime sendTime; |
| 38 | 43 | ||
| 39 | - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) | 44 | + @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 40 | private Long sequence; | 45 | private Long sequence; |
| 41 | 46 | ||
| 42 | } | 47 | } |
| 43 | \ No newline at end of file | 48 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
| 1 | package cn.iocoder.yudao.module.im.controller.admin.message.vo; | 1 | package cn.iocoder.yudao.module.im.controller.admin.message.vo; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.validation.InEnum; | 3 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 4 | -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum; | ||
| 5 | -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||
| 6 | -import com.alibaba.excel.annotation.ExcelProperty; | 4 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; |
| 5 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum; | ||
| 7 | import io.swagger.v3.oas.annotations.media.Schema; | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 7 | +import jakarta.validation.constraints.NotNull; | ||
| 8 | import lombok.Data; | 8 | import lombok.Data; |
| 9 | 9 | ||
| 10 | -// TODO @anhaohao:MessageSendReqVO,消息发送 | ||
| 11 | - | ||
| 12 | -// TODO @anhaohao:不应该有 excel 相关的注解 | ||
| 13 | - | ||
| 14 | @Schema(description = "管理后台 - 发送消息 Request VO") | 10 | @Schema(description = "管理后台 - 发送消息 Request VO") |
| 15 | @Data | 11 | @Data |
| 16 | -@ExcelIgnoreUnannotated | ||
| 17 | -public class SendMessageReqVO { | 12 | +public class ImMessageSendReqVO { |
| 18 | 13 | ||
| 19 | @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") | 14 | @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") |
| 20 | - @ExcelProperty("客户端消息编号 uuid,用于排重") | 15 | + @NotNull(message = "客户端消息编号不能为空") |
| 21 | private String clientMessageId; | 16 | private String clientMessageId; |
| 22 | 17 | ||
| 23 | @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") | 18 | @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") |
| 24 | - @ExcelProperty("接收人编号") | 19 | + @NotNull(message = "接收人编号不能为空") |
| 25 | private Long receiverId; | 20 | private Long receiverId; |
| 26 | 21 | ||
| 27 | @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | 22 | @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 28 | - @ExcelProperty("会话类型") | 23 | + @InEnum(value = ImConversationTypeEnum.class) |
| 24 | + @NotNull(message = "会话类型不能为空") | ||
| 29 | private Integer conversationType; | 25 | private Integer conversationType; |
| 30 | 26 | ||
| 31 | @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 27 | @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 32 | - @ExcelProperty("消息类型") | ||
| 33 | - @InEnum(MessageContentTypeEnum.class) | 28 | + @InEnum(ImMessageContentTypeEnum.class) |
| 29 | + @NotNull(message = "消息类型不能为空") | ||
| 34 | private Integer contentType; | 30 | private Integer contentType; |
| 35 | 31 | ||
| 36 | - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 37 | - @ExcelProperty("消息内容") | 32 | + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好") |
| 33 | + @NotNull(message = "消息内容不能为空") | ||
| 38 | private String content; | 34 | private String content; |
| 39 | 35 | ||
| 40 | } | 36 | } |
| 41 | \ No newline at end of file | 37 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java
| @@ -10,13 +10,11 @@ import java.time.LocalDateTime; | @@ -10,13 +10,11 @@ import java.time.LocalDateTime; | ||
| 10 | 10 | ||
| 11 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 11 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 12 | 12 | ||
| 13 | -// TODO @anhaohao:MessageSendRespVO,消息发送结果 | ||
| 14 | - | ||
| 15 | @Schema(description = "管理后台 - 发送消息 Response VO") | 13 | @Schema(description = "管理后台 - 发送消息 Response VO") |
| 16 | @Data | 14 | @Data |
| 17 | @AllArgsConstructor | 15 | @AllArgsConstructor |
| 18 | @NoArgsConstructor | 16 | @NoArgsConstructor |
| 19 | -public class SendMessageRespVO { | 17 | +public class ImMessageSendRespVO { |
| 20 | 18 | ||
| 21 | @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") | 19 | @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") |
| 22 | private Long id; | 20 | private Long id; |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.im.controller.admin.message.vo; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import lombok.Data; | ||
| 5 | -import lombok.ToString; | ||
| 6 | -import org.springframework.format.annotation.DateTimeFormat; | ||
| 7 | - | ||
| 8 | -import java.time.LocalDateTime; | ||
| 9 | - | ||
| 10 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; | ||
| 11 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 12 | - | ||
| 13 | -// TODO @anhaohao:这个类,不要交 Page,而是消息列表,MessageListReqVO | ||
| 14 | -@Schema(description = "管理后台 - 消息分页 Request VO") | ||
| 15 | -@Data | ||
| 16 | -@ToString(callSuper = true) | ||
| 17 | -public class MessagePageReqVO { | ||
| 18 | - | ||
| 19 | - // TODO @anhaohao:还是传递 targetId 和 conversationType,我们要弱化 no 的概念; | ||
| 20 | - | ||
| 21 | - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "g_1000") | ||
| 22 | - private String conversationNo; | ||
| 23 | - | ||
| 24 | - // TODO @anhaohao:应该不传递时间范围,而是传递分页的时间,然后根据时间,查询消息 | ||
| 25 | - | ||
| 26 | - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27") | ||
| 27 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 28 | - private LocalDateTime[] sendTime; | ||
| 29 | - | ||
| 30 | -} | ||
| 31 | \ No newline at end of file | 0 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.im.controller.admin.message.vo; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum; | ||
| 5 | -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||
| 6 | -import com.alibaba.excel.annotation.ExcelProperty; | ||
| 7 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 8 | -import lombok.Data; | ||
| 9 | -import org.springframework.format.annotation.DateTimeFormat; | ||
| 10 | - | ||
| 11 | -import java.time.LocalDateTime; | ||
| 12 | - | ||
| 13 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 14 | - | ||
| 15 | -// TODO @anhaohao:MessageRespVO 消息响应 Response VO | ||
| 16 | -// TODO @anahaohao:每个 example 都写下;啊哈,漏了地方,要补下;因为 http mock 的时候,可以根据它去生成 | ||
| 17 | -@Schema(description = "管理后台 - 消息 Request VO") | ||
| 18 | -@Data | ||
| 19 | -public class MessageReqVO { | ||
| 20 | - | ||
| 21 | - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") | ||
| 22 | - private Long id; | ||
| 23 | - | ||
| 24 | - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 25 | - private Integer conversationType; // 对应 ImConversationTypeEnum 枚举 | ||
| 26 | - | ||
| 27 | - // TODO @anhaohao:这个应该是 senderId | ||
| 28 | - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 29 | - private Long fromId; // 根据 conversationType 区分 | ||
| 30 | - | ||
| 31 | - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") | ||
| 32 | - private String senderNickname; | ||
| 33 | - | ||
| 34 | - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 35 | - private String senderAvatar; | ||
| 36 | - | ||
| 37 | - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") | ||
| 38 | - private Long receiverId; | ||
| 39 | - | ||
| 40 | - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 41 | - private Integer contentType; // 参见 ImMessageTypeEnum 枚举 | ||
| 42 | - | ||
| 43 | - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 44 | - private String content; | ||
| 45 | - | ||
| 46 | - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 47 | - private LocalDateTime sendTime; | ||
| 48 | - | ||
| 49 | - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 50 | - private Long sequence; | ||
| 51 | - | ||
| 52 | -} | ||
| 53 | \ No newline at end of file | 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/ConversationDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.conversation; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.conversation; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; | 4 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; |
| 5 | import com.baomidou.mybatisplus.annotation.KeySequence; | 5 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| 7 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| @@ -9,7 +9,6 @@ import lombok.*; | @@ -9,7 +9,6 @@ import lombok.*; | ||
| 9 | 9 | ||
| 10 | import java.time.LocalDateTime; | 10 | import java.time.LocalDateTime; |
| 11 | 11 | ||
| 12 | -// TODO @anhaohao:还是有 IM 前缀哈 | ||
| 13 | /** | 12 | /** |
| 14 | * IM 会话 DO | 13 | * IM 会话 DO |
| 15 | * | 14 | * |
| @@ -23,7 +22,7 @@ import java.time.LocalDateTime; | @@ -23,7 +22,7 @@ import java.time.LocalDateTime; | ||
| 23 | @Builder | 22 | @Builder |
| 24 | @NoArgsConstructor | 23 | @NoArgsConstructor |
| 25 | @AllArgsConstructor | 24 | @AllArgsConstructor |
| 26 | -public class ConversationDO extends BaseDO { | 25 | +public class ImConversationDO extends BaseDO { |
| 27 | 26 | ||
| 28 | /** | 27 | /** |
| 29 | * 编号 | 28 | * 编号 |
| @@ -39,7 +38,7 @@ public class ConversationDO extends BaseDO { | @@ -39,7 +38,7 @@ public class ConversationDO extends BaseDO { | ||
| 39 | /** | 38 | /** |
| 40 | * 会话类型 | 39 | * 会话类型 |
| 41 | * <p> | 40 | * <p> |
| 42 | - * 枚举 {@link ConversationTypeEnum} | 41 | + * 枚举 {@link ImConversationTypeEnum} |
| 43 | */ | 42 | */ |
| 44 | private Integer type; | 43 | private Integer type; |
| 45 | /** | 44 | /** |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java
| @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId; | @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId; | ||
| 6 | import com.baomidou.mybatisplus.annotation.TableName; | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
| 7 | import lombok.*; | 7 | import lombok.*; |
| 8 | 8 | ||
| 9 | -// TODO @anhaohao:还是要有 IM | ||
| 10 | /** | 9 | /** |
| 11 | * IM 群信息 DO | 10 | * IM 群信息 DO |
| 12 | * | 11 | * |
| @@ -20,7 +19,7 @@ import lombok.*; | @@ -20,7 +19,7 @@ import lombok.*; | ||
| 20 | @Builder | 19 | @Builder |
| 21 | @NoArgsConstructor | 20 | @NoArgsConstructor |
| 22 | @AllArgsConstructor | 21 | @AllArgsConstructor |
| 23 | -public class GroupDO extends BaseDO { | 22 | +public class ImGroupDO extends BaseDO { |
| 24 | 23 | ||
| 25 | /** | 24 | /** |
| 26 | * 编号 | 25 | * 编号 |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java
| @@ -4,7 +4,6 @@ import lombok.*; | @@ -4,7 +4,6 @@ import lombok.*; | ||
| 4 | import com.baomidou.mybatisplus.annotation.*; | 4 | import com.baomidou.mybatisplus.annotation.*; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 5 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 6 | 6 | ||
| 7 | -// TODO @anhaohao:还是要有 IM | ||
| 8 | /** | 7 | /** |
| 9 | * IM 群成员 DO | 8 | * IM 群成员 DO |
| 10 | * | 9 | * |
| @@ -18,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | @@ -18,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 18 | @Builder | 17 | @Builder |
| 19 | @NoArgsConstructor | 18 | @NoArgsConstructor |
| 20 | @AllArgsConstructor | 19 | @AllArgsConstructor |
| 21 | -public class GroupMemberDO extends BaseDO { | 20 | +public class ImGroupMemberDO extends BaseDO { |
| 22 | 21 | ||
| 23 | /** | 22 | /** |
| 24 | * 编号 | 23 | * 编号 |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.inbox; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.inbox; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 4 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 5 | import com.baomidou.mybatisplus.annotation.KeySequence; | 5 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| 7 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| 8 | import lombok.*; | 8 | import lombok.*; |
| 9 | 9 | ||
| 10 | -// TODO @anhaohao:还是要有 IM | ||
| 11 | // TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列; | 10 | // TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列; |
| 11 | + | ||
| 12 | /** | 12 | /** |
| 13 | * IM 收件箱 DO | 13 | * IM 收件箱 DO |
| 14 | * | 14 | * |
| @@ -22,7 +22,7 @@ import lombok.*; | @@ -22,7 +22,7 @@ import lombok.*; | ||
| 22 | @Builder | 22 | @Builder |
| 23 | @NoArgsConstructor | 23 | @NoArgsConstructor |
| 24 | @AllArgsConstructor | 24 | @AllArgsConstructor |
| 25 | -public class InboxDO extends BaseDO { | 25 | +public class ImInboxDO extends BaseDO { |
| 26 | 26 | ||
| 27 | /** | 27 | /** |
| 28 | * 编号 | 28 | * 编号 |
| @@ -31,14 +31,14 @@ public class InboxDO extends BaseDO { | @@ -31,14 +31,14 @@ public class InboxDO extends BaseDO { | ||
| 31 | private Long id; | 31 | private Long id; |
| 32 | /** | 32 | /** |
| 33 | * 用户编号 | 33 | * 用户编号 |
| 34 | - * | ||
| 35 | - * TODO @hao:写下 userId 和 messageId 的关联字段 | 34 | + * <p> |
| 35 | + * 关联 {@link ImMessageDO#getSenderId()} 或者 {@link ImMessageDO#getReceiverId()} | ||
| 36 | */ | 36 | */ |
| 37 | private Long userId; | 37 | private Long userId; |
| 38 | /** | 38 | /** |
| 39 | * 消息编号 | 39 | * 消息编号 |
| 40 | - * | ||
| 41 | - * 关联 {@link MessageDO#getId()} | 40 | + * <p> |
| 41 | + * 关联 {@link ImMessageDO#getId()} | ||
| 42 | */ | 42 | */ |
| 43 | private Long messageId; | 43 | private Long messageId; |
| 44 | /** | 44 | /** |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; | ||
| 5 | -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum; | ||
| 6 | -import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum; | ||
| 7 | -import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum; | 4 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; |
| 5 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum; | ||
| 6 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageSourceEnum; | ||
| 7 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum; | ||
| 8 | import com.baomidou.mybatisplus.annotation.KeySequence; | 8 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 9 | import com.baomidou.mybatisplus.annotation.TableId; | 9 | import com.baomidou.mybatisplus.annotation.TableId; |
| 10 | import com.baomidou.mybatisplus.annotation.TableName; | 10 | import com.baomidou.mybatisplus.annotation.TableName; |
| @@ -12,7 +12,6 @@ import lombok.*; | @@ -12,7 +12,6 @@ import lombok.*; | ||
| 12 | 12 | ||
| 13 | import java.time.LocalDateTime; | 13 | import java.time.LocalDateTime; |
| 14 | 14 | ||
| 15 | -// TODO @anhaohao:还是要有 IM | ||
| 16 | /** | 15 | /** |
| 17 | * IM 消息 DO | 16 | * IM 消息 DO |
| 18 | * | 17 | * |
| @@ -26,7 +25,7 @@ import java.time.LocalDateTime; | @@ -26,7 +25,7 @@ import java.time.LocalDateTime; | ||
| 26 | @Builder | 25 | @Builder |
| 27 | @NoArgsConstructor | 26 | @NoArgsConstructor |
| 28 | @AllArgsConstructor | 27 | @AllArgsConstructor |
| 29 | -public class MessageDO extends BaseDO { | 28 | +public class ImMessageDO extends BaseDO { |
| 30 | 29 | ||
| 31 | /** | 30 | /** |
| 32 | * 编号 | 31 | * 编号 |
| @@ -60,24 +59,24 @@ public class MessageDO extends BaseDO { | @@ -60,24 +59,24 @@ public class MessageDO extends BaseDO { | ||
| 60 | */ | 59 | */ |
| 61 | private String senderAvatar; | 60 | private String senderAvatar; |
| 62 | /** | 61 | /** |
| 63 | - * 会话类型 枚举 {@link ConversationTypeEnum} | 62 | + * 会话类型 枚举 {@link ImConversationTypeEnum} |
| 64 | */ | 63 | */ |
| 65 | private Integer conversationType; | 64 | private Integer conversationType; |
| 66 | /** | 65 | /** |
| 67 | * 会话标志 | 66 | * 会话标志 |
| 68 | - * | ||
| 69 | - * 生成规则:{@link ConversationTypeEnum#generateConversationNo(Long, Long, Integer)} 方法 | 67 | + * <p> |
| 68 | + * 生成规则:{@link ImConversationTypeEnum#generateConversationNo(Long, Long, Integer)} 方法 | ||
| 70 | */ | 69 | */ |
| 71 | private String conversationNo; | 70 | private String conversationNo; |
| 72 | /** | 71 | /** |
| 73 | * 消息类型 | 72 | * 消息类型 |
| 74 | - * | ||
| 75 | - * 枚举 {@link MessageContentTypeEnum} | 73 | + * <p> |
| 74 | + * 枚举 {@link ImMessageContentTypeEnum} | ||
| 76 | */ | 75 | */ |
| 77 | private Integer contentType; | 76 | private Integer contentType; |
| 78 | /** | 77 | /** |
| 79 | * 消息内容 | 78 | * 消息内容 |
| 80 | - * | 79 | + * <p> |
| 81 | * JSON 格式 对应 dal/dataobject/message/content 包 | 80 | * JSON 格式 对应 dal/dataobject/message/content 包 |
| 82 | */ | 81 | */ |
| 83 | private String content; | 82 | private String content; |
| @@ -87,14 +86,14 @@ public class MessageDO extends BaseDO { | @@ -87,14 +86,14 @@ public class MessageDO extends BaseDO { | ||
| 87 | private LocalDateTime sendTime; | 86 | private LocalDateTime sendTime; |
| 88 | /** | 87 | /** |
| 89 | * 消息来源 | 88 | * 消息来源 |
| 90 | - * | ||
| 91 | - * 枚举 {@link MessageSourceEnum} | 89 | + * <p> |
| 90 | + * 枚举 {@link ImMessageSourceEnum} | ||
| 92 | */ | 91 | */ |
| 93 | private Integer sendFrom; | 92 | private Integer sendFrom; |
| 94 | /** | 93 | /** |
| 95 | * 消息状态 | 94 | * 消息状态 |
| 96 | - * | ||
| 97 | - * 枚举 {@link MessageStatusEnum} | 95 | + * <p> |
| 96 | + * 枚举 {@link ImMessageStatusEnum} | ||
| 98 | */ | 97 | */ |
| 99 | private Integer messageStatus; | 98 | private Integer messageStatus; |
| 100 | 99 |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 6 | import lombok.NoArgsConstructor; |
| @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor; | @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor; | ||
| 8 | // TODO @anhaohao:要有 IM; | 8 | // TODO @anhaohao:要有 IM; |
| 9 | // TODO @芋艿:后续要挪到 api 包下,主要是给外部接口使用 | 9 | // TODO @芋艿:后续要挪到 api 包下,主要是给外部接口使用 |
| 10 | /** | 10 | /** |
| 11 | - * 语音消息的 {@link MessageDO 字段 content} 的内容 | 11 | + * 语音消息的 {@link ImMessageDO 字段 content} 的内容 |
| 12 | * | 12 | * |
| 13 | * @author 芋道源码 | 13 | * @author 芋道源码 |
| 14 | */ | 14 | */ |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 6 | import lombok.NoArgsConstructor; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | - * 名片消息的 {@link MessageDO 字段 content} 的内容 | 9 | + * 名片消息的 {@link ImMessageDO 字段 content} 的内容 |
| 10 | * | 10 | * |
| 11 | * @author anhaohao | 11 | * @author anhaohao |
| 12 | * @since 2024/3/23 下午5:53 | 12 | * @since 2024/3/23 下午5:53 |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 6 | import lombok.NoArgsConstructor; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | - * 文件消息的 {@link MessageDO 字段 content} 的内容 | 9 | + * 文件消息的 {@link ImMessageDO 字段 content} 的内容 |
| 10 | * | 10 | * |
| 11 | * @author 芋道源码 | 11 | * @author 芋道源码 |
| 12 | */ | 12 | */ |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 6 | import lombok.NoArgsConstructor; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | - * 图片消息的 {@link MessageDO 字段 content} 的内容 | 9 | + * 图片消息的 {@link ImMessageDO 字段 content} 的内容 |
| 10 | * | 10 | * |
| 11 | * @author 芋道源码 | 11 | * @author 芋道源码 |
| 12 | */ | 12 | */ |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 6 | import lombok.NoArgsConstructor; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | - * 地址位置消息的 {@link MessageDO 字段 content} 的内容 | 9 | + * 地址位置消息的 {@link ImMessageDO 字段 content} 的内容 |
| 10 | * | 10 | * |
| 11 | * @author 芋道源码 | 11 | * @author 芋道源码 |
| 12 | */ | 12 | */ |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 6 | import lombok.NoArgsConstructor; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | - * 文本消息的 {@link MessageDO 字段 content} 的内容 | 9 | + * 文本消息的 {@link ImMessageDO 字段 content} 的内容 |
| 10 | * | 10 | * |
| 11 | * @author 芋道源码 | 11 | * @author 芋道源码 |
| 12 | */ | 12 | */ |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java
| 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; | 1 | package cn.iocoder.yudao.module.im.dal.dataobject.message.content; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | import lombok.Data; | 4 | import lombok.Data; |
| 5 | 5 | ||
| 6 | /** | 6 | /** |
| 7 | - * 视频消息的 {@link MessageDO 字段 content} 的内容 | 7 | + * 视频消息的 {@link ImMessageDO 字段 content} 的内容 |
| 8 | * | 8 | * |
| 9 | * @author 芋道源码 | 9 | * @author 芋道源码 |
| 10 | */ | 10 | */ |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java
| 1 | package cn.iocoder.yudao.module.im.dal.mysql.conversation; | 1 | package cn.iocoder.yudao.module.im.dal.mysql.conversation; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 5 | -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; | 4 | +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; |
| 6 | import org.apache.ibatis.annotations.Mapper; | 5 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 6 | ||
| 8 | /** | 7 | /** |
| @@ -11,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper; | @@ -11,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper; | ||
| 11 | * @author 芋道源码 | 10 | * @author 芋道源码 |
| 12 | */ | 11 | */ |
| 13 | @Mapper | 12 | @Mapper |
| 14 | -public interface ConversationMapper extends BaseMapperX<ConversationDO> { | 13 | +public interface ConversationMapper extends BaseMapperX<ImConversationDO> { |
| 15 | 14 | ||
| 16 | - default ConversationDO selectByNo(String no){ | ||
| 17 | - return selectOne(ConversationDO::getNo, no); | 15 | + default ImConversationDO selectByNo(String no){ |
| 16 | + return selectOne(ImConversationDO::getNo, no); | ||
| 18 | } | 17 | } |
| 19 | } | 18 | } |
| 20 | \ No newline at end of file | 19 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java
| @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.group; | @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.group; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 6 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; | 6 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; |
| 7 | import org.apache.ibatis.annotations.Mapper; | 7 | import org.apache.ibatis.annotations.Mapper; |
| 8 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; | 8 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; |
| 9 | 9 | ||
| @@ -13,18 +13,18 @@ import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; | @@ -13,18 +13,18 @@ import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; | ||
| 13 | * @author 芋道源码 | 13 | * @author 芋道源码 |
| 14 | */ | 14 | */ |
| 15 | @Mapper | 15 | @Mapper |
| 16 | -public interface ImGroupMapper extends BaseMapperX<GroupDO> { | 16 | +public interface GroupMapper extends BaseMapperX<ImGroupDO> { |
| 17 | 17 | ||
| 18 | - default PageResult<GroupDO> selectPage(ImGroupPageReqVO reqVO) { | ||
| 19 | - return selectPage(reqVO, new LambdaQueryWrapperX<GroupDO>() | ||
| 20 | - .likeIfPresent(GroupDO::getGroupName, reqVO.getGroupName()) | ||
| 21 | - .eqIfPresent(GroupDO::getOwnerId, reqVO.getOwnerId()) | ||
| 22 | - .eqIfPresent(GroupDO::getHeadImage, reqVO.getHeadImage()) | ||
| 23 | - .eqIfPresent(GroupDO::getHeadImageThumb, reqVO.getHeadImageThumb()) | ||
| 24 | - .eqIfPresent(GroupDO::getNotice, reqVO.getNotice()) | ||
| 25 | - .eqIfPresent(GroupDO::getRemark, reqVO.getRemark()) | ||
| 26 | - .betweenIfPresent(GroupDO::getCreateTime, reqVO.getCreateTime()) | ||
| 27 | - .orderByDesc(GroupDO::getId)); | 18 | + default PageResult<ImGroupDO> selectPage(ImGroupPageReqVO reqVO) { |
| 19 | + return selectPage(reqVO, new LambdaQueryWrapperX<ImGroupDO>() | ||
| 20 | + .likeIfPresent(ImGroupDO::getGroupName, reqVO.getGroupName()) | ||
| 21 | + .eqIfPresent(ImGroupDO::getOwnerId, reqVO.getOwnerId()) | ||
| 22 | + .eqIfPresent(ImGroupDO::getHeadImage, reqVO.getHeadImage()) | ||
| 23 | + .eqIfPresent(ImGroupDO::getHeadImageThumb, reqVO.getHeadImageThumb()) | ||
| 24 | + .eqIfPresent(ImGroupDO::getNotice, reqVO.getNotice()) | ||
| 25 | + .eqIfPresent(ImGroupDO::getRemark, reqVO.getRemark()) | ||
| 26 | + .betweenIfPresent(ImGroupDO::getCreateTime, reqVO.getCreateTime()) | ||
| 27 | + .orderByDesc(ImGroupDO::getId)); | ||
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | } | 30 | } |
| 31 | \ No newline at end of file | 31 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java
| @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 6 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; | 6 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; |
| 7 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; | 7 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; |
| 8 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 9 | ||
| 10 | import java.util.List; | 10 | import java.util.List; |
| @@ -15,21 +15,21 @@ import java.util.List; | @@ -15,21 +15,21 @@ import java.util.List; | ||
| 15 | * @author 芋道源码 | 15 | * @author 芋道源码 |
| 16 | */ | 16 | */ |
| 17 | @Mapper | 17 | @Mapper |
| 18 | -public interface ImGroupMemberMapper extends BaseMapperX<GroupMemberDO> { | 18 | +public interface GroupMemberMapper extends BaseMapperX<ImGroupMemberDO> { |
| 19 | 19 | ||
| 20 | - default PageResult<GroupMemberDO> selectPage(ImGroupMemberPageReqVO reqVO) { | ||
| 21 | - return selectPage(reqVO, new LambdaQueryWrapperX<GroupMemberDO>() | ||
| 22 | - .eqIfPresent(GroupMemberDO::getGroupId, reqVO.getGroupId()) | ||
| 23 | - .eqIfPresent(GroupMemberDO::getUserId, reqVO.getUserId()) | ||
| 24 | - .likeIfPresent(GroupMemberDO::getNickname, reqVO.getNickname()) | ||
| 25 | - .eqIfPresent(GroupMemberDO::getAvatar, reqVO.getAvatar()) | ||
| 26 | - .likeIfPresent(GroupMemberDO::getAliasName, reqVO.getAliasName()) | ||
| 27 | - .eqIfPresent(GroupMemberDO::getRemark, reqVO.getRemark()) | ||
| 28 | - .betweenIfPresent(GroupMemberDO::getCreateTime, reqVO.getCreateTime()) | ||
| 29 | - .orderByDesc(GroupMemberDO::getId)); | 20 | + default PageResult<ImGroupMemberDO> selectPage(ImGroupMemberPageReqVO reqVO) { |
| 21 | + return selectPage(reqVO, new LambdaQueryWrapperX<ImGroupMemberDO>() | ||
| 22 | + .eqIfPresent(ImGroupMemberDO::getGroupId, reqVO.getGroupId()) | ||
| 23 | + .eqIfPresent(ImGroupMemberDO::getUserId, reqVO.getUserId()) | ||
| 24 | + .likeIfPresent(ImGroupMemberDO::getNickname, reqVO.getNickname()) | ||
| 25 | + .eqIfPresent(ImGroupMemberDO::getAvatar, reqVO.getAvatar()) | ||
| 26 | + .likeIfPresent(ImGroupMemberDO::getAliasName, reqVO.getAliasName()) | ||
| 27 | + .eqIfPresent(ImGroupMemberDO::getRemark, reqVO.getRemark()) | ||
| 28 | + .betweenIfPresent(ImGroupMemberDO::getCreateTime, reqVO.getCreateTime()) | ||
| 29 | + .orderByDesc(ImGroupMemberDO::getId)); | ||
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | - default List<GroupMemberDO> selectListByGroupId(Long groupId) { | ||
| 33 | - return selectList(new LambdaQueryWrapperX<GroupMemberDO>().eq(GroupMemberDO::getGroupId, groupId)); | 32 | + default List<ImGroupMemberDO> selectListByGroupId(Long groupId) { |
| 33 | + return selectList(new LambdaQueryWrapperX<ImGroupMemberDO>().eq(ImGroupMemberDO::getGroupId, groupId)); | ||
| 34 | } | 34 | } |
| 35 | } | 35 | } |
| 36 | \ No newline at end of file | 36 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java
| @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.inbox; | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.inbox; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 5 | -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; | 5 | +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; |
| 6 | import org.apache.ibatis.annotations.Mapper; | 6 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 7 | ||
| 8 | import java.util.List; | 8 | import java.util.List; |
| @@ -13,27 +13,14 @@ import java.util.List; | @@ -13,27 +13,14 @@ import java.util.List; | ||
| 13 | * @author 芋道源码 | 13 | * @author 芋道源码 |
| 14 | */ | 14 | */ |
| 15 | @Mapper | 15 | @Mapper |
| 16 | -public interface InboxMapper extends BaseMapperX<InboxDO> { | 16 | +public interface InboxMapper extends BaseMapperX<ImInboxDO> { |
| 17 | 17 | ||
| 18 | - // TODO @anhaohao:返回 List<InboxDO> ,转换成 messageId 交给上层;dao 尽量通用 | ||
| 19 | - default List<Long> selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) { | ||
| 20 | - return selectList(new LambdaQueryWrapperX<InboxDO>() | ||
| 21 | - .gt(InboxDO::getUserId, userId) | ||
| 22 | - .gt(InboxDO::getSequence, sequence) | ||
| 23 | - .orderByAsc(InboxDO::getSequence) | ||
| 24 | - .last("limit 0," + size)) // TODO @anhaohao:这里 limit 就可以了,不用从 limit 0 开始; | ||
| 25 | - .stream() | ||
| 26 | - .map(InboxDO::getMessageId) | ||
| 27 | - .toList(); | 18 | + default List<ImInboxDO> selectListByUserIdAndSequence(Long userId, Long sequence, Integer size) { |
| 19 | + return selectList(new LambdaQueryWrapperX<ImInboxDO>() | ||
| 20 | + .gt(ImInboxDO::getUserId, userId) | ||
| 21 | + .gt(ImInboxDO::getSequence, sequence) | ||
| 22 | + .orderByAsc(ImInboxDO::getSequence) | ||
| 23 | + .last("LIMIT " + size)); | ||
| 28 | } | 24 | } |
| 29 | 25 | ||
| 30 | -// default PageResult<InboxDO> selectPage(ImInboxPageReqVO reqVO) { | ||
| 31 | -// return selectPage(reqVO, new LambdaQueryWrapperX<InboxDO>() | ||
| 32 | -// .eqIfPresent(InboxDO::getUserId, reqVO.getUserId()) | ||
| 33 | -// .eqIfPresent(InboxDO::getMessageId, reqVO.getMessageId()) | ||
| 34 | -// .eqIfPresent(InboxDO::getSequence, reqVO.getSequence()) | ||
| 35 | -// .betweenIfPresent(InboxDO::getCreateTime, reqVO.getCreateTime()) | ||
| 36 | -// .orderByDesc(InboxDO::getId)); | ||
| 37 | -// } | ||
| 38 | - | ||
| 39 | } | 26 | } |
| 40 | \ No newline at end of file | 27 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java
| @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.message; | @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.message; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; | ||
| 7 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | ||
| 8 | -import com.github.yulichang.wrapper.MPJLambdaWrapper; | 5 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 9 | import org.apache.ibatis.annotations.Mapper; | 6 | import org.apache.ibatis.annotations.Mapper; |
| 10 | 7 | ||
| 11 | import java.util.List; | 8 | import java.util.List; |
| @@ -16,13 +13,12 @@ import java.util.List; | @@ -16,13 +13,12 @@ import java.util.List; | ||
| 16 | * @author 芋道源码 | 13 | * @author 芋道源码 |
| 17 | */ | 14 | */ |
| 18 | @Mapper | 15 | @Mapper |
| 19 | -public interface MessageMapper extends BaseMapperX<MessageDO> { | 16 | +public interface MessageMapper extends BaseMapperX<ImMessageDO> { |
| 20 | 17 | ||
| 21 | - default List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO) { | ||
| 22 | - return selectList(new LambdaQueryWrapperX<MessageDO>() | ||
| 23 | - .eqIfPresent(MessageDO::getConversationNo, pageReqVO.getConversationNo()) | ||
| 24 | - .betweenIfPresent(MessageDO::getSendTime, pageReqVO.getSendTime()) | ||
| 25 | - .orderByAsc(MessageDO::getSendTime)); | 18 | + default List<ImMessageDO> selectMessageList(ImMessageDO message) { |
| 19 | + return selectList(new LambdaQueryWrapperX<ImMessageDO>() | ||
| 20 | + .eqIfPresent(ImMessageDO::getConversationNo, message.getConversationNo()) | ||
| 21 | + .eqIfPresent(ImMessageDO::getSendTime, message.getSendTime()) | ||
| 22 | + .orderByAsc(ImMessageDO::getSendTime)); | ||
| 26 | } | 23 | } |
| 27 | - | ||
| 28 | } | 24 | } |
| 29 | \ No newline at end of file | 25 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java
| 1 | package cn.iocoder.yudao.module.im.dal.redis.inbox; | 1 | package cn.iocoder.yudao.module.im.dal.redis.inbox; |
| 2 | 2 | ||
| 3 | import jakarta.annotation.Resource; | 3 | import jakarta.annotation.Resource; |
| 4 | -import org.redisson.api.RedissonClient; | ||
| 5 | import org.springframework.data.redis.core.RedisTemplate; | 4 | import org.springframework.data.redis.core.RedisTemplate; |
| 6 | import org.springframework.stereotype.Repository; | 5 | import org.springframework.stereotype.Repository; |
| 7 | 6 | ||
| @@ -15,7 +14,7 @@ import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUE | @@ -15,7 +14,7 @@ import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUE | ||
| 15 | * @author anhaohao | 14 | * @author anhaohao |
| 16 | */ | 15 | */ |
| 17 | @Repository | 16 | @Repository |
| 18 | -public class SequenceRedisDao { | 17 | +public class SequenceRedisDAO { |
| 19 | 18 | ||
| 20 | @Resource | 19 | @Resource |
| 21 | private RedisTemplate<String, Long> redisTemplate; | 20 | private RedisTemplate<String, Long> redisTemplate; |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java
| 1 | package cn.iocoder.yudao.module.im.service.conversation; | 1 | package cn.iocoder.yudao.module.im.service.conversation; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; | ||
| 4 | -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; | 3 | +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO; |
| 4 | +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; | ||
| 6 | 6 | ||
| 7 | import java.util.List; | 7 | import java.util.List; |
| 8 | 8 | ||
| @@ -18,20 +18,22 @@ public interface ConversationService { | @@ -18,20 +18,22 @@ public interface ConversationService { | ||
| 18 | * | 18 | * |
| 19 | * @return 会话列表 | 19 | * @return 会话列表 |
| 20 | */ | 20 | */ |
| 21 | - List<ConversationDO> getConversationList(); | 21 | + List<ImConversationDO> getConversationList(); |
| 22 | 22 | ||
| 23 | /** | 23 | /** |
| 24 | * 置顶会话 | 24 | * 置顶会话 |
| 25 | * | 25 | * |
| 26 | + * @param loginUserId 登录用户编号 | ||
| 26 | * @param updateReqVO 更新信息 | 27 | * @param updateReqVO 更新信息 |
| 27 | */ | 28 | */ |
| 28 | - void updatePinned(ConversationPinnedReqVO updateReqVO); | 29 | + void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO); |
| 29 | 30 | ||
| 30 | /** | 31 | /** |
| 31 | * 更新最后已读时间 | 32 | * 更新最后已读时间 |
| 32 | * | 33 | * |
| 34 | + * @param loginUserId 登录用户编号 | ||
| 33 | * @param updateReqVO 更新信息 | 35 | * @param updateReqVO 更新信息 |
| 34 | */ | 36 | */ |
| 35 | - void updateLastReadTime(ConversationLastTimeReqVO updateReqVO); | 37 | + void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO); |
| 36 | 38 | ||
| 37 | } | 39 | } |
| 38 | \ No newline at end of file | 40 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java
| 1 | package cn.iocoder.yudao.module.im.service.conversation; | 1 | package cn.iocoder.yudao.module.im.service.conversation; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 4 | -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; | 3 | +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO; |
| 4 | +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; | ||
| 7 | import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; | 6 | import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; |
| 7 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; | ||
| 8 | import cn.iocoder.yudao.module.im.service.inbox.InboxService; | 8 | import cn.iocoder.yudao.module.im.service.inbox.InboxService; |
| 9 | import jakarta.annotation.Resource; | 9 | import jakarta.annotation.Resource; |
| 10 | import org.springframework.stereotype.Service; | 10 | import org.springframework.stereotype.Service; |
| @@ -27,50 +27,50 @@ public class ConversationServiceImpl implements ConversationService { | @@ -27,50 +27,50 @@ public class ConversationServiceImpl implements ConversationService { | ||
| 27 | private InboxService inboxService; | 27 | private InboxService inboxService; |
| 28 | 28 | ||
| 29 | @Override | 29 | @Override |
| 30 | - public List<ConversationDO> getConversationList() { | 30 | + public List<ImConversationDO> getConversationList() { |
| 31 | return conversationMapper.selectList(); | 31 | return conversationMapper.selectList(); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | @Override | 34 | @Override |
| 35 | - public void updatePinned(ConversationPinnedReqVO updateReqVO) { | ||
| 36 | - // TODO @hao:updateTop 和 updateLastReadTime 使用独立的逻辑实现,不使用统一的 ImConversationSaveReqVO; | ||
| 37 | - // TODO 大体步骤建议: | ||
| 38 | - // 1. 先 getOrderCreateConversation,查询会话,不存在则插入; | ||
| 39 | - // 2. 更新对应的字段 | ||
| 40 | - // 3. 做对应更新的 notify 推送 | ||
| 41 | - ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo()); | 35 | + public void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO) { |
| 36 | + // 1. 获得会话编号 | ||
| 37 | + String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType()); | ||
| 38 | + // 2. 查询会话 | ||
| 39 | + ImConversationDO conversation = conversationMapper.selectByNo(no); | ||
| 42 | if (conversation == null) { | 40 | if (conversation == null) { |
| 43 | - ConversationDO conversationDO = new ConversationDO(); | ||
| 44 | - // TODO @hao:no 不是前端传递哈,后端生成;另外,其实可以把 insert 写成一个公用方法;get会话,拿不到就 insert;接着处理 update 操作;首次多 update 一次,无所谓的;没多少量的 | ||
| 45 | - conversationDO.setNo(updateReqVO.getNo()); | ||
| 46 | - conversationDO.setPinned(updateReqVO.getPinned()); | ||
| 47 | - conversationDO.setUserId(updateReqVO.getUserId()); | ||
| 48 | - conversationDO.setTargetId(updateReqVO.getTargetId()); | ||
| 49 | - conversationDO.setType(updateReqVO.getType()); | ||
| 50 | - conversationMapper.insert(conversationDO); | ||
| 51 | - } else { | ||
| 52 | - // 更新 TODO @anhaohao:这里不要 toBean,因为这里逻辑偏 toc,new ConversationDO 对象,然后逐个 set 需要的值; | ||
| 53 | - ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class); | ||
| 54 | - conversationMapper.updateById(updateObj); | 41 | + // 2.1. 不存在,则插入 |
| 42 | + conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType()); | ||
| 55 | } | 43 | } |
| 44 | + // 3. 更新会话 | ||
| 45 | + conversation.setPinned(updateReqVO.getPinned()); | ||
| 46 | + conversationMapper.updateById(conversation); | ||
| 47 | + // 4. 做对应更新的 notify 推送 | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + private ImConversationDO insertConversation(String no, Long userId, Long targetId, Integer type) { | ||
| 51 | + ImConversationDO imConversationDO = new ImConversationDO(); | ||
| 52 | + imConversationDO.setNo(no); | ||
| 53 | + imConversationDO.setUserId(userId); | ||
| 54 | + imConversationDO.setTargetId(targetId); | ||
| 55 | + imConversationDO.setType(type); | ||
| 56 | + conversationMapper.insert(imConversationDO); | ||
| 57 | + return imConversationDO; | ||
| 56 | } | 58 | } |
| 57 | 59 | ||
| 58 | @Override | 60 | @Override |
| 59 | - public void updateLastReadTime(ConversationLastTimeReqVO updateReqVO) { | ||
| 60 | - ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo()); | 61 | + public void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO) { |
| 62 | + // 1. 获得会话编号 | ||
| 63 | + String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType()); | ||
| 64 | + // 2. 查询会话 | ||
| 65 | + ImConversationDO conversation = conversationMapper.selectByNo(no); | ||
| 61 | if (conversation == null) { | 66 | if (conversation == null) { |
| 62 | - ConversationDO conversationDO = new ConversationDO(); | ||
| 63 | - conversationDO.setNo(updateReqVO.getNo()); | ||
| 64 | - conversationDO.setLastReadTime(updateReqVO.getLastReadTime()); | ||
| 65 | - conversationDO.setUserId(updateReqVO.getUserId()); | ||
| 66 | - conversationDO.setTargetId(updateReqVO.getTargetId()); | ||
| 67 | - conversationDO.setType(updateReqVO.getType()); | ||
| 68 | - conversationMapper.insert(conversationDO); | ||
| 69 | - } else { | ||
| 70 | - // 更新 | ||
| 71 | - ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class); | ||
| 72 | - conversationMapper.updateById(updateObj); | 67 | + // 2.1. 不存在,则插入 |
| 68 | + conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType()); | ||
| 73 | } | 69 | } |
| 70 | + // 3. 更新会话 | ||
| 71 | + conversation.setLastReadTime(updateReqVO.getLastReadTime()); | ||
| 72 | + conversationMapper.updateById(conversation); | ||
| 73 | + // 4. 做对应更新的 notify 推送 | ||
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | } | 76 | } |
| 77 | \ No newline at end of file | 77 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java
| @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.service.group; | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.service.group; | ||
| 2 | 2 | ||
| 3 | import jakarta.validation.*; | 3 | import jakarta.validation.*; |
| 4 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; | 4 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; |
| 5 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; | 5 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| @@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 10 | * | 10 | * |
| 11 | * @author 芋道源码 | 11 | * @author 芋道源码 |
| 12 | */ | 12 | */ |
| 13 | -public interface ImGroupService { | 13 | +public interface GroupService { |
| 14 | 14 | ||
| 15 | /** | 15 | /** |
| 16 | * 创建群 | 16 | * 创建群 |
| @@ -40,7 +40,7 @@ public interface ImGroupService { | @@ -40,7 +40,7 @@ public interface ImGroupService { | ||
| 40 | * @param id 编号 | 40 | * @param id 编号 |
| 41 | * @return 群 | 41 | * @return 群 |
| 42 | */ | 42 | */ |
| 43 | - GroupDO getGroup(Long id); | 43 | + ImGroupDO getGroup(Long id); |
| 44 | 44 | ||
| 45 | /** | 45 | /** |
| 46 | * 获得群分页 | 46 | * 获得群分页 |
| @@ -48,6 +48,6 @@ public interface ImGroupService { | @@ -48,6 +48,6 @@ public interface ImGroupService { | ||
| 48 | * @param pageReqVO 分页查询 | 48 | * @param pageReqVO 分页查询 |
| 49 | * @return 群分页 | 49 | * @return 群分页 |
| 50 | */ | 50 | */ |
| 51 | - PageResult<GroupDO> getGroupPage(ImGroupPageReqVO pageReqVO); | 51 | + PageResult<ImGroupDO> getGroupPage(ImGroupPageReqVO pageReqVO); |
| 52 | 52 | ||
| 53 | } | 53 | } |
| 54 | \ No newline at end of file | 54 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java
| @@ -5,11 +5,11 @@ import jakarta.annotation.Resource; | @@ -5,11 +5,11 @@ import jakarta.annotation.Resource; | ||
| 5 | import org.springframework.validation.annotation.Validated; | 5 | import org.springframework.validation.annotation.Validated; |
| 6 | 6 | ||
| 7 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; | 7 | import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; |
| 8 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; | 8 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; |
| 9 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 9 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 10 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 10 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 11 | 11 | ||
| 12 | -import cn.iocoder.yudao.module.im.dal.mysql.group.ImGroupMapper; | 12 | +import cn.iocoder.yudao.module.im.dal.mysql.group.GroupMapper; |
| 13 | 13 | ||
| 14 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 14 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 15 | import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; | 15 | import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; |
| @@ -21,16 +21,16 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; | @@ -21,16 +21,16 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; | ||
| 21 | */ | 21 | */ |
| 22 | @Service | 22 | @Service |
| 23 | @Validated | 23 | @Validated |
| 24 | -public class ImGroupServiceImpl implements ImGroupService { | 24 | +public class GroupServiceImpl implements GroupService { |
| 25 | 25 | ||
| 26 | @Resource | 26 | @Resource |
| 27 | - private ImGroupMapper imGroupMapper; | 27 | + private GroupMapper groupMapper; |
| 28 | 28 | ||
| 29 | @Override | 29 | @Override |
| 30 | public Long createGroup(ImGroupSaveReqVO createReqVO) { | 30 | public Long createGroup(ImGroupSaveReqVO createReqVO) { |
| 31 | // 插入 | 31 | // 插入 |
| 32 | - GroupDO group = BeanUtils.toBean(createReqVO, GroupDO.class); | ||
| 33 | - imGroupMapper.insert(group); | 32 | + ImGroupDO group = BeanUtils.toBean(createReqVO, ImGroupDO.class); |
| 33 | + groupMapper.insert(group); | ||
| 34 | // 返回 | 34 | // 返回 |
| 35 | return group.getId(); | 35 | return group.getId(); |
| 36 | } | 36 | } |
| @@ -40,8 +40,8 @@ public class ImGroupServiceImpl implements ImGroupService { | @@ -40,8 +40,8 @@ public class ImGroupServiceImpl implements ImGroupService { | ||
| 40 | // 校验存在 | 40 | // 校验存在 |
| 41 | validateGroupExists(updateReqVO.getId()); | 41 | validateGroupExists(updateReqVO.getId()); |
| 42 | // 更新 | 42 | // 更新 |
| 43 | - GroupDO updateObj = BeanUtils.toBean(updateReqVO, GroupDO.class); | ||
| 44 | - imGroupMapper.updateById(updateObj); | 43 | + ImGroupDO updateObj = BeanUtils.toBean(updateReqVO, ImGroupDO.class); |
| 44 | + groupMapper.updateById(updateObj); | ||
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | @Override | 47 | @Override |
| @@ -49,23 +49,23 @@ public class ImGroupServiceImpl implements ImGroupService { | @@ -49,23 +49,23 @@ public class ImGroupServiceImpl implements ImGroupService { | ||
| 49 | // 校验存在 | 49 | // 校验存在 |
| 50 | validateGroupExists(id); | 50 | validateGroupExists(id); |
| 51 | // 删除 | 51 | // 删除 |
| 52 | - imGroupMapper.deleteById(id); | 52 | + groupMapper.deleteById(id); |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | private void validateGroupExists(Long id) { | 55 | private void validateGroupExists(Long id) { |
| 56 | - if (imGroupMapper.selectById(id) == null) { | 56 | + if (groupMapper.selectById(id) == null) { |
| 57 | throw exception(GROUP_NOT_EXISTS); | 57 | throw exception(GROUP_NOT_EXISTS); |
| 58 | } | 58 | } |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | @Override | 61 | @Override |
| 62 | - public GroupDO getGroup(Long id) { | ||
| 63 | - return imGroupMapper.selectById(id); | 62 | + public ImGroupDO getGroup(Long id) { |
| 63 | + return groupMapper.selectById(id); | ||
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | @Override | 66 | @Override |
| 67 | - public PageResult<GroupDO> getGroupPage(ImGroupPageReqVO pageReqVO) { | ||
| 68 | - return imGroupMapper.selectPage(pageReqVO); | 67 | + public PageResult<ImGroupDO> getGroupPage(ImGroupPageReqVO pageReqVO) { |
| 68 | + return groupMapper.selectPage(pageReqVO); | ||
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | } | 71 | } |
| 72 | \ No newline at end of file | 72 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java
| @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.groupmember; | @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.groupmember; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; | 4 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; |
| 5 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; | 5 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; |
| 6 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; | 6 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; |
| 7 | import jakarta.validation.Valid; | 7 | import jakarta.validation.Valid; |
| 8 | 8 | ||
| 9 | import java.util.List; | 9 | import java.util.List; |
| @@ -43,7 +43,7 @@ public interface GroupMemberService { | @@ -43,7 +43,7 @@ public interface GroupMemberService { | ||
| 43 | * @param id 编号 | 43 | * @param id 编号 |
| 44 | * @return 群成员 | 44 | * @return 群成员 |
| 45 | */ | 45 | */ |
| 46 | - GroupMemberDO getGroupMember(Long id); | 46 | + ImGroupMemberDO getGroupMember(Long id); |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | * 获得群成员分页 | 49 | * 获得群成员分页 |
| @@ -51,7 +51,7 @@ public interface GroupMemberService { | @@ -51,7 +51,7 @@ public interface GroupMemberService { | ||
| 51 | * @param pageReqVO 分页查询 | 51 | * @param pageReqVO 分页查询 |
| 52 | * @return 群成员分页 | 52 | * @return 群成员分页 |
| 53 | */ | 53 | */ |
| 54 | - PageResult<GroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO); | 54 | + PageResult<ImGroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO); |
| 55 | 55 | ||
| 56 | /** | 56 | /** |
| 57 | * 根据群组id查询群成员 | 57 | * 根据群组id查询群成员 |
| @@ -59,5 +59,5 @@ public interface GroupMemberService { | @@ -59,5 +59,5 @@ public interface GroupMemberService { | ||
| 59 | * @param groupId 群组id | 59 | * @param groupId 群组id |
| 60 | * @return 群成员列表 | 60 | * @return 群成员列表 |
| 61 | */ | 61 | */ |
| 62 | - List<GroupMemberDO> selectByGroupId(Long groupId); | 62 | + List<ImGroupMemberDO> selectByGroupId(Long groupId); |
| 63 | } | 63 | } |
| 64 | \ No newline at end of file | 64 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java
| @@ -5,11 +5,11 @@ import jakarta.annotation.Resource; | @@ -5,11 +5,11 @@ import jakarta.annotation.Resource; | ||
| 5 | import org.springframework.validation.annotation.Validated; | 5 | import org.springframework.validation.annotation.Validated; |
| 6 | 6 | ||
| 7 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.*; | 7 | import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.*; |
| 8 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; | 8 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; |
| 9 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 9 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 10 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 10 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 11 | 11 | ||
| 12 | -import cn.iocoder.yudao.module.im.dal.mysql.groupmember.ImGroupMemberMapper; | 12 | +import cn.iocoder.yudao.module.im.dal.mysql.groupmember.GroupMemberMapper; |
| 13 | 13 | ||
| 14 | import java.util.List; | 14 | import java.util.List; |
| 15 | 15 | ||
| @@ -26,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; | @@ -26,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; | ||
| 26 | public class GroupMemberServiceImpl implements GroupMemberService { | 26 | public class GroupMemberServiceImpl implements GroupMemberService { |
| 27 | 27 | ||
| 28 | @Resource | 28 | @Resource |
| 29 | - private ImGroupMemberMapper imGroupMemberMapper; | 29 | + private GroupMemberMapper groupMemberMapper; |
| 30 | 30 | ||
| 31 | @Override | 31 | @Override |
| 32 | public Long createGroupMember(ImGroupMemberSaveReqVO createReqVO) { | 32 | public Long createGroupMember(ImGroupMemberSaveReqVO createReqVO) { |
| 33 | // 插入 | 33 | // 插入 |
| 34 | - GroupMemberDO groupMember = BeanUtils.toBean(createReqVO, GroupMemberDO.class); | ||
| 35 | - imGroupMemberMapper.insert(groupMember); | 34 | + ImGroupMemberDO groupMember = BeanUtils.toBean(createReqVO, ImGroupMemberDO.class); |
| 35 | + groupMemberMapper.insert(groupMember); | ||
| 36 | // 返回 | 36 | // 返回 |
| 37 | return groupMember.getId(); | 37 | return groupMember.getId(); |
| 38 | } | 38 | } |
| @@ -42,8 +42,8 @@ public class GroupMemberServiceImpl implements GroupMemberService { | @@ -42,8 +42,8 @@ public class GroupMemberServiceImpl implements GroupMemberService { | ||
| 42 | // 校验存在 | 42 | // 校验存在 |
| 43 | validateGroupMemberExists(updateReqVO.getId()); | 43 | validateGroupMemberExists(updateReqVO.getId()); |
| 44 | // 更新 | 44 | // 更新 |
| 45 | - GroupMemberDO updateObj = BeanUtils.toBean(updateReqVO, GroupMemberDO.class); | ||
| 46 | - imGroupMemberMapper.updateById(updateObj); | 45 | + ImGroupMemberDO updateObj = BeanUtils.toBean(updateReqVO, ImGroupMemberDO.class); |
| 46 | + groupMemberMapper.updateById(updateObj); | ||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | @Override | 49 | @Override |
| @@ -51,28 +51,28 @@ public class GroupMemberServiceImpl implements GroupMemberService { | @@ -51,28 +51,28 @@ public class GroupMemberServiceImpl implements GroupMemberService { | ||
| 51 | // 校验存在 | 51 | // 校验存在 |
| 52 | validateGroupMemberExists(id); | 52 | validateGroupMemberExists(id); |
| 53 | // 删除 | 53 | // 删除 |
| 54 | - imGroupMemberMapper.deleteById(id); | 54 | + groupMemberMapper.deleteById(id); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | private void validateGroupMemberExists(Long id) { | 57 | private void validateGroupMemberExists(Long id) { |
| 58 | - if (imGroupMemberMapper.selectById(id) == null) { | 58 | + if (groupMemberMapper.selectById(id) == null) { |
| 59 | throw exception(GROUP_MEMBER_NOT_EXISTS); | 59 | throw exception(GROUP_MEMBER_NOT_EXISTS); |
| 60 | } | 60 | } |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | @Override | 63 | @Override |
| 64 | - public GroupMemberDO getGroupMember(Long id) { | ||
| 65 | - return imGroupMemberMapper.selectById(id); | 64 | + public ImGroupMemberDO getGroupMember(Long id) { |
| 65 | + return groupMemberMapper.selectById(id); | ||
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | @Override | 68 | @Override |
| 69 | - public PageResult<GroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO) { | ||
| 70 | - return imGroupMemberMapper.selectPage(pageReqVO); | 69 | + public PageResult<ImGroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO) { |
| 70 | + return groupMemberMapper.selectPage(pageReqVO); | ||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | @Override | 73 | @Override |
| 74 | - public List<GroupMemberDO> selectByGroupId(Long groupId) { | ||
| 75 | - return imGroupMemberMapper.selectListByGroupId(groupId); | 74 | + public List<ImGroupMemberDO> selectByGroupId(Long groupId) { |
| 75 | + return groupMemberMapper.selectListByGroupId(groupId); | ||
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | } | 78 | } |
| 79 | \ No newline at end of file | 79 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
| 1 | package cn.iocoder.yudao.module.im.service.inbox; | 1 | package cn.iocoder.yudao.module.im.service.inbox; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; | 3 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; |
| 4 | 4 | ||
| 5 | import java.util.List; | 5 | import java.util.List; |
| 6 | 6 | ||
| @@ -14,9 +14,9 @@ public interface InboxService { | @@ -14,9 +14,9 @@ public interface InboxService { | ||
| 14 | /** | 14 | /** |
| 15 | * 保存收件箱和发送消息 | 15 | * 保存收件箱和发送消息 |
| 16 | * | 16 | * |
| 17 | - * @param inboxSaveMessageReqVO 收件箱保存消息 Request VO | 17 | + * @param imMessageDO 收件箱保存消息 Request VO |
| 18 | */ | 18 | */ |
| 19 | - void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessageReqVO); | 19 | + void saveInboxAndSendMessage(ImMessageDO imMessageDO); |
| 20 | 20 | ||
| 21 | /** | 21 | /** |
| 22 | * 获得大于 sequence 的消息ids | 22 | * 获得大于 sequence 的消息ids |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
| @@ -2,18 +2,19 @@ package cn.iocoder.yudao.module.im.service.inbox; | @@ -2,18 +2,19 @@ package cn.iocoder.yudao.module.im.service.inbox; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | 3 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; |
| 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSendMessageReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; | ||
| 8 | -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; | 5 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO; |
| 6 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; | ||
| 7 | +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; | ||
| 8 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; | ||
| 9 | import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper; | 9 | import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper; |
| 10 | import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO; | 10 | import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO; |
| 11 | -import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao; | ||
| 12 | -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; | 11 | +import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDAO; |
| 12 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; | ||
| 13 | import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; | 13 | import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; |
| 14 | import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; | 14 | import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; |
| 15 | import jakarta.annotation.Resource; | 15 | import jakarta.annotation.Resource; |
| 16 | import org.dromara.hutool.core.date.DateUnit; | 16 | import org.dromara.hutool.core.date.DateUnit; |
| 17 | +import org.springframework.scheduling.annotation.Async; | ||
| 17 | import org.springframework.stereotype.Service; | 18 | import org.springframework.stereotype.Service; |
| 18 | import org.springframework.validation.annotation.Validated; | 19 | import org.springframework.validation.annotation.Validated; |
| 19 | 20 | ||
| @@ -33,50 +34,60 @@ public class InboxServiceImpl implements InboxService { | @@ -33,50 +34,60 @@ public class InboxServiceImpl implements InboxService { | ||
| 33 | 34 | ||
| 34 | @Resource | 35 | @Resource |
| 35 | private InboxMapper inboxMapper; | 36 | private InboxMapper inboxMapper; |
| 37 | + | ||
| 36 | @Resource | 38 | @Resource |
| 37 | - private SequenceRedisDao sequenceRedisDao; // 序列生成器Redis DAO | 39 | + private SequenceRedisDAO sequenceRedisDAO; |
| 38 | @Resource | 40 | @Resource |
| 39 | - private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO | 41 | + private InboxLockRedisDAO inboxLockRedisDAO; |
| 42 | + | ||
| 40 | @Resource | 43 | @Resource |
| 41 | private WebSocketSenderApi webSocketSenderApi; | 44 | private WebSocketSenderApi webSocketSenderApi; |
| 42 | @Resource | 45 | @Resource |
| 43 | private GroupMemberService groupMemberService; | 46 | private GroupMemberService groupMemberService; |
| 44 | 47 | ||
| 45 | - // TODO @anhaohao:下面的逻辑,最好是,1. 保存收件箱 + 发送消息给用户; 2. xxx;这样看的人,会更有感觉哈; | ||
| 46 | @Override | 48 | @Override |
| 47 | - public void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessage) { | ||
| 48 | - // 保存收件箱 + 发送消息给用户 | ||
| 49 | - saveInboxAndSendMessageForUser(inboxSaveMessage.getFromId(), inboxSaveMessage); | ||
| 50 | - | ||
| 51 | - if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) { | ||
| 52 | - saveInboxAndSendMessageForUser(inboxSaveMessage.getReceiverId(), inboxSaveMessage); | ||
| 53 | - } else if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) { | ||
| 54 | - List<GroupMemberDO> groupMembers = groupMemberService.selectByGroupId(inboxSaveMessage.getReceiverId()); | ||
| 55 | - groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), inboxSaveMessage)); | 49 | + public void saveInboxAndSendMessage(ImMessageDO message) { |
| 50 | + // 1. 保存收件箱 + 发送消息给发送人 | ||
| 51 | + saveInboxAndSendMessageForUser(message.getSenderId(), message); | ||
| 52 | + // 2. 保存收件箱 + 发送消息给接收人 | ||
| 53 | + if (message.getConversationType().equals(ImConversationTypeEnum.SINGLE.getType())) { | ||
| 54 | + // 2.1 如果是单聊,直接发送给接收人 | ||
| 55 | + saveInboxAndSendMessageForUser(message.getReceiverId(), message); | ||
| 56 | + } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) { | ||
| 57 | + // 2.2 如果是群聊,发送给群聊的所有人 | ||
| 58 | + List<ImGroupMemberDO> groupMembers = groupMemberService.selectByGroupId(message.getReceiverId()); | ||
| 59 | + groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), message)); | ||
| 56 | } | 60 | } |
| 57 | } | 61 | } |
| 58 | 62 | ||
| 59 | @Override | 63 | @Override |
| 60 | public List<Long> selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) { | 64 | public List<Long> selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) { |
| 61 | - return inboxMapper.selectMessageIdsByUserIdAndSequence(userId, sequence, size); | 65 | + List<ImInboxDO> imInboxDOS = inboxMapper.selectListByUserIdAndSequence(userId, sequence, size); |
| 66 | + return imInboxDOS.stream().map(ImInboxDO::getMessageId).toList(); | ||
| 62 | } | 67 | } |
| 63 | 68 | ||
| 64 | - private void saveInboxAndSendMessageForUser(Long userId, InboxSaveMessageReqVO inboxSaveMessage) { | 69 | + |
| 70 | + //TODO 多线程处理 | ||
| 71 | + public void saveInboxAndSendMessageForUser(Long userId, ImMessageDO message) { | ||
| 65 | inboxLockRedisDAO.lock(userId, INBOX_LOCK_TIMEOUT, () -> { | 72 | inboxLockRedisDAO.lock(userId, INBOX_LOCK_TIMEOUT, () -> { |
| 66 | - Long userSequence = sequenceRedisDao.generateSequence(userId); | ||
| 67 | - // TODO @anhaohao:链式调用; | ||
| 68 | - InboxDO inbox = new InboxDO(); | ||
| 69 | - inbox.setUserId(userId); | ||
| 70 | - inbox.setMessageId(inboxSaveMessage.getMessageId()); | ||
| 71 | - inbox.setSequence(userSequence); | 73 | + // 1. 生成序列号 |
| 74 | + Long userSequence = sequenceRedisDAO.generateSequence(userId); | ||
| 75 | + // 2. 保存收件箱 | ||
| 76 | + ImInboxDO inbox = new ImInboxDO() | ||
| 77 | + .setUserId(userId) | ||
| 78 | + .setMessageId(message.getId()) | ||
| 79 | + .setSequence(userSequence); | ||
| 72 | inboxMapper.insert(inbox); | 80 | inboxMapper.insert(inbox); |
| 73 | - | ||
| 74 | - // TODO @anhaohao:是不是 send 不用在加锁里面哈?! | ||
| 75 | - // TODO @anhaohao:再进一步,是不是用 spring @async 可以并发推送噢 | ||
| 76 | - InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class); | ||
| 77 | - message.setSequence(userSequence); | ||
| 78 | - webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message); | 81 | + // 3. 发送消息 |
| 82 | + sendAsyncMessage(userId, message, userSequence); | ||
| 79 | }); | 83 | }); |
| 80 | } | 84 | } |
| 81 | 85 | ||
| 86 | + @Async | ||
| 87 | + public void sendAsyncMessage(Long userId, ImMessageDO message, Long userSequence) { | ||
| 88 | + ImMessageRespVO messageRespVO = BeanUtils.toBean(message, ImMessageRespVO.class); | ||
| 89 | + messageRespVO.setSequence(userSequence); | ||
| 90 | + webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, messageRespVO); | ||
| 91 | + } | ||
| 92 | + | ||
| 82 | } | 93 | } |
| 83 | \ No newline at end of file | 94 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java
| 1 | package cn.iocoder.yudao.module.im.service.message; | 1 | package cn.iocoder.yudao.module.im.service.message; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; | ||
| 4 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO; | ||
| 6 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; |
| 4 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; | ||
| 7 | 6 | ||
| 8 | import java.util.List; | 7 | import java.util.List; |
| 9 | 8 | ||
| @@ -17,26 +16,28 @@ public interface MessageService { | @@ -17,26 +16,28 @@ public interface MessageService { | ||
| 17 | /** | 16 | /** |
| 18 | * 获得历史消息 | 17 | * 获得历史消息 |
| 19 | * | 18 | * |
| 20 | - * @param pageReqVO 分页查询 | 19 | + * @param loginUserId 登录用户编号 |
| 20 | + * @param listReqVO 分页查询 | ||
| 21 | * @return 消息分页 | 21 | * @return 消息分页 |
| 22 | */ | 22 | */ |
| 23 | - List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO); | 23 | + List<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO); |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| 26 | * 拉取消息-大于 seq 的消息 | 26 | * 拉取消息-大于 seq 的消息 |
| 27 | * | 27 | * |
| 28 | - * @param userId 用户id | ||
| 29 | - * @param sequence 序列号 | ||
| 30 | - * @param size 数量 | 28 | + * @param loginUserId 登录用户编号 |
| 29 | + * @param sequence 序列号 | ||
| 30 | + * @param size 数量 | ||
| 31 | * @return 消息列表 | 31 | * @return 消息列表 |
| 32 | */ | 32 | */ |
| 33 | - List<MessageDO> getMessageListBySequence(Long userId, Long sequence, Integer size); | 33 | + List<ImMessageDO> pullMessageList(Long loginUserId, Long sequence, Integer size); |
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | * 发送消息 | 36 | * 发送消息 |
| 37 | + * | ||
| 37 | * @param loginUserId 登录用户编号 | 38 | * @param loginUserId 登录用户编号 |
| 38 | - * @param message 消息 | 39 | + * @param message 消息 |
| 39 | * @return 消息编号 | 40 | * @return 消息编号 |
| 40 | */ | 41 | */ |
| 41 | - SendMessageRespVO sendMessage(Long loginUserId, SendMessageReqVO message); | 42 | + ImMessageDO sendMessage(Long loginUserId, ImMessageSendReqVO message); |
| 42 | } | 43 | } |
| 43 | \ No newline at end of file | 44 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java
| 1 | package cn.iocoder.yudao.module.im.service.message; | 1 | package cn.iocoder.yudao.module.im.service.message; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; | ||
| 4 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO; | ||
| 7 | -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; | ||
| 8 | -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; | 3 | +import cn.hutool.core.bean.BeanUtil; |
| 4 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; | ||
| 7 | +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; | ||
| 9 | import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper; | 8 | import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper; |
| 10 | -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; | ||
| 11 | -import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum; | ||
| 12 | -import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum; | 9 | +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; |
| 10 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageSourceEnum; | ||
| 11 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum; | ||
| 13 | import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; | 12 | import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; |
| 14 | import cn.iocoder.yudao.module.im.service.inbox.InboxService; | 13 | import cn.iocoder.yudao.module.im.service.inbox.InboxService; |
| 15 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | 14 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| @@ -38,92 +37,66 @@ public class MessageServiceImpl implements MessageService { | @@ -38,92 +37,66 @@ public class MessageServiceImpl implements MessageService { | ||
| 38 | @Resource | 37 | @Resource |
| 39 | private MessageMapper messageMapper; | 38 | private MessageMapper messageMapper; |
| 40 | @Resource | 39 | @Resource |
| 41 | - private InboxService inboxService; | ||
| 42 | - @Resource | ||
| 43 | private AdminUserApi adminUserApi; | 40 | private AdminUserApi adminUserApi; |
| 44 | @Resource | 41 | @Resource |
| 42 | + private InboxService inboxService; | ||
| 43 | + @Resource | ||
| 45 | private GroupMemberService groupMemberService; | 44 | private GroupMemberService groupMemberService; |
| 46 | 45 | ||
| 47 | @Override | 46 | @Override |
| 48 | - public List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO) { | ||
| 49 | - return messageMapper.getHistoryMessage(pageReqVO); | 47 | + public List<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO) { |
| 48 | + // 1. 获得会话编号 | ||
| 49 | + String no = ImConversationTypeEnum.generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType()); | ||
| 50 | + // 2. 查询历史消息 | ||
| 51 | + ImMessageDO message = new ImMessageDO() | ||
| 52 | + .setSendTime(listReqVO.getSendTime()) | ||
| 53 | + .setConversationNo(no); | ||
| 54 | + return messageMapper.selectMessageList(message); | ||
| 50 | } | 55 | } |
| 51 | 56 | ||
| 52 | @Override | 57 | @Override |
| 53 | - public List<MessageDO> getMessageListBySequence(Long userId, Long sequence, Integer size) { | 58 | + public List<ImMessageDO> pullMessageList(Long userId, Long sequence, Integer size) { |
| 54 | List<Long> messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size); | 59 | List<Long> messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size); |
| 55 | return messageMapper.selectBatchIds(messageIds); | 60 | return messageMapper.selectBatchIds(messageIds); |
| 56 | } | 61 | } |
| 57 | 62 | ||
| 58 | @Override | 63 | @Override |
| 59 | - public SendMessageRespVO sendMessage(Long fromUserId, SendMessageReqVO message) { | ||
| 60 | - // 保存消息 | ||
| 61 | - // TODO @anhaohao:InboxSaveMessageReqVO 不用 new 出来传递到 saveMessage 方法里; | ||
| 62 | - InboxSaveMessageReqVO inboxSaveMessageReqVO = new InboxSaveMessageReqVO(); | ||
| 63 | - SendMessageRespVO sendMessageRespVO = saveMessage(fromUserId, message, inboxSaveMessageReqVO); | ||
| 64 | - | ||
| 65 | - // 保存收件箱 + 发送消息给用户 | ||
| 66 | - // TODO @anhaohao:考虑到少定义一些 VO,直接传递 MessageDO 就完事了;反正这两者也是强耦合的; | ||
| 67 | - inboxService.saveInboxAndSendMessage(inboxSaveMessageReqVO); | ||
| 68 | - return sendMessageRespVO; | 64 | + public ImMessageDO sendMessage(Long fromUserId, ImMessageSendReqVO imMessageSendReqVO) { |
| 65 | + // 1. 保存消息 | ||
| 66 | + ImMessageDO message = saveMessage(fromUserId, imMessageSendReqVO); | ||
| 67 | + // 2. 保存到收件箱,并发送消息 | ||
| 68 | + inboxService.saveInboxAndSendMessage(message); | ||
| 69 | + return message; | ||
| 69 | } | 70 | } |
| 70 | 71 | ||
| 71 | - // TODO @anhaohao:这个方法,是不是定义成 private 哈;然后返回是 MessageDO 对象,设置最上面的 sendMessage 也是这个。最终 controller 转成 SendMessageRespVO | ||
| 72 | - public SendMessageRespVO saveMessage(Long fromUserId, SendMessageReqVO message, InboxSaveMessageReqVO inboxSaveMessageReqVO) { | ||
| 73 | - // 需要校验 receiverId 存在 | 72 | + private ImMessageDO saveMessage(Long fromUserId, ImMessageSendReqVO message) { |
| 73 | + // 1. 校验接收人是否存在 | ||
| 74 | validateReceiverIdExists(message); | 74 | validateReceiverIdExists(message); |
| 75 | - // 查询发送人昵称和发送人头像 | 75 | + // 2. 查询发送人信息 |
| 76 | AdminUserRespDTO fromUser = adminUserApi.getUser(fromUserId); | 76 | AdminUserRespDTO fromUser = adminUserApi.getUser(fromUserId); |
| 77 | - // 使用链式调用创建 MessageDO 对象 | ||
| 78 | - // TODO @anhaohao:一部分字段,可以 beanutils tobean 搞定; | ||
| 79 | - // TODO @anhaohao:链式 set 的时候,要把相同的放在一行;例如说,setSenderNickname、setSenderAvatar;本质上,就是为了“同类”在一行,阅读起来简单; | ||
| 80 | - MessageDO messageDO = new MessageDO() | ||
| 81 | - .setClientMessageId(message.getClientMessageId()) | 77 | + // 3. 保存消息 |
| 78 | + ImMessageDO imMessageDO = BeanUtil.copyProperties(message, ImMessageDO.class) | ||
| 79 | + .setSenderNickname(fromUser.getNickname()).setSenderAvatar(fromUser.getAvatar()) | ||
| 82 | .setSenderId(fromUserId) | 80 | .setSenderId(fromUserId) |
| 83 | - .setReceiverId(message.getReceiverId()) | ||
| 84 | - .setSenderNickname(fromUser.getNickname()) | ||
| 85 | - .setSenderAvatar(fromUser.getAvatar()) | ||
| 86 | - .setConversationType(message.getConversationType()) | ||
| 87 | - .setContentType(message.getContentType()) | ||
| 88 | - .setConversationNo(ConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType())) | ||
| 89 | - .setContent(message.getContent()) | ||
| 90 | - .setSendFrom(MessageSourceEnum.USER_SEND.getStatus()) | ||
| 91 | - .setSendTime(TimeUtil.now()) | ||
| 92 | - .setMessageStatus(MessageStatusEnum.SENDING.getStatus()); | ||
| 93 | - messageMapper.insert(messageDO); | ||
| 94 | - | ||
| 95 | - // 设置 InboxSaveMessageReqVO 对象 | ||
| 96 | - inboxSaveMessageReqVO.setConversationType(message.getConversationType()) | ||
| 97 | - .setFromId(fromUserId) | ||
| 98 | - .setReceiverId(message.getReceiverId()) | ||
| 99 | - .setMessageId(messageDO.getId()) | ||
| 100 | - .setContentType(message.getContentType()) | ||
| 101 | - .setContent(message.getContent()) | ||
| 102 | - .setSendTime(messageDO.getSendTime()) | ||
| 103 | - .setSenderNickname(fromUser.getNickname()) | ||
| 104 | - .setSenderAvatar(fromUser.getAvatar()); | ||
| 105 | - | ||
| 106 | - // 返回 SendMessageRespVO 对象 | ||
| 107 | - return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime()); | 81 | + .setConversationNo(ImConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType())) |
| 82 | + .setSendFrom(ImMessageSourceEnum.USER_SEND.getSource()) | ||
| 83 | + .setMessageStatus(ImMessageStatusEnum.SENDING.getStatus()) | ||
| 84 | + .setSendTime(TimeUtil.now()); | ||
| 85 | + messageMapper.insert(imMessageDO); | ||
| 86 | + return imMessageDO; | ||
| 108 | } | 87 | } |
| 109 | 88 | ||
| 110 | - // TODO @anhaohao:validateReceiver,更简单一点哈;不仅仅校验存在,未来还可以校验,自己是不是有好友关系、群聊是否在群聊里面等等 | ||
| 111 | - private void validateReceiverIdExists(SendMessageReqVO message) { | ||
| 112 | - // TODO @anhaohao:这个不要这里校验,交给 validator 校验掉 | ||
| 113 | - if (message.getReceiverId() == null) { | ||
| 114 | - throw exception(MESSAGE_RECEIVER_NOT_EXISTS); | ||
| 115 | - } | ||
| 116 | - if (message.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) { | ||
| 117 | - // TODO @anhaohao:// 之后要空一个空格,中英文协作习惯,中文和英文之间,不能连着;最后也不用 ;哈 | ||
| 118 | - //校验用户是否存在; | 89 | + private void validateReceiverIdExists(ImMessageSendReqVO message) { |
| 90 | + if (message.getConversationType().equals(ImConversationTypeEnum.SINGLE.getType())) { | ||
| 91 | + // 校验用户是否存在 | ||
| 119 | AdminUserRespDTO receiverUser = adminUserApi.getUser(message.getReceiverId()); | 92 | AdminUserRespDTO receiverUser = adminUserApi.getUser(message.getReceiverId()); |
| 120 | if (receiverUser == null) { | 93 | if (receiverUser == null) { |
| 121 | throw exception(MESSAGE_RECEIVER_NOT_EXISTS); | 94 | throw exception(MESSAGE_RECEIVER_NOT_EXISTS); |
| 122 | } | 95 | } |
| 123 | - } else if (message.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) { | ||
| 124 | - //校验群聊是否存在; | ||
| 125 | - List<GroupMemberDO> groupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId()); | ||
| 126 | - if (groupMemberDOS.isEmpty()) { | 96 | + } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) { |
| 97 | + // 校验群聊是否存在 | ||
| 98 | + List<ImGroupMemberDO> imGroupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId()); | ||
| 99 | + if (imGroupMemberDOS.isEmpty()) { | ||
| 127 | throw exception(MESSAGE_RECEIVER_NOT_EXISTS); | 100 | throw exception(MESSAGE_RECEIVER_NOT_EXISTS); |
| 128 | } | 101 | } |
| 129 | } | 102 | } |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java deleted
| 1 | -package cn.iocoder.yudao.module.im.websocket; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener; | ||
| 4 | -import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils; | ||
| 5 | -import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage; | ||
| 6 | -import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; | ||
| 7 | -import jakarta.annotation.Resource; | ||
| 8 | -import lombok.extern.slf4j.Slf4j; | ||
| 9 | -import org.springframework.stereotype.Component; | ||
| 10 | -import org.springframework.web.socket.WebSocketSession; | ||
| 11 | - | ||
| 12 | -// TODO @hao:消息发送,使用 http 上行。因为在 cloud 框架下,我们比较难去 Listener。因为 im-server 不会自己启动 websocket 路径 | ||
| 13 | - | ||
| 14 | -/** | ||
| 15 | - * WebSocket im | ||
| 16 | - * | ||
| 17 | - * @author 芋道源码 | ||
| 18 | - */ | ||
| 19 | -@Component | ||
| 20 | -@Slf4j | ||
| 21 | -public class ImWebSocketMessageListener implements WebSocketMessageListener<ImSendMessage> { | ||
| 22 | - | ||
| 23 | - public static final String IM_MESSAGE_RECEIVE = "im-message-receive"; | ||
| 24 | - @Resource | ||
| 25 | - private WebSocketSenderApi webSocketSenderApi; // WebSocket消息发送器 | ||
| 26 | - | ||
| 27 | - /** | ||
| 28 | - * 处理WebSocket消息 | ||
| 29 | - * | ||
| 30 | - * @param session WebSocket会话 | ||
| 31 | - * @param message 发送的IM消息 | ||
| 32 | - */ | ||
| 33 | - @Override | ||
| 34 | - public void onMessage(WebSocketSession session, ImSendMessage message) { | ||
| 35 | - Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); // 获取登录用户ID | ||
| 36 | - log.info(message.toString()); | ||
| 37 | - } | ||
| 38 | - | ||
| 39 | - /** | ||
| 40 | - * 获取类型 | ||
| 41 | - * | ||
| 42 | - * @return 类型 | ||
| 43 | - */ | ||
| 44 | - @Override | ||
| 45 | - public String getType() { | ||
| 46 | - return "im-message-send"; | ||
| 47 | - } | ||
| 48 | - | ||
| 49 | -} | ||
| 50 | \ No newline at end of file | 0 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java deleted
| 1 | -package cn.iocoder.yudao.module.im.websocket.message; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; | ||
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 6 | -import lombok.Data; | ||
| 7 | - | ||
| 8 | -import java.time.LocalDateTime; | ||
| 9 | - | ||
| 10 | -@Schema(description = "管理后台 - 消息发送 receive") | ||
| 11 | -@Data | ||
| 12 | -public class ImReceiveMessage { | ||
| 13 | - | ||
| 14 | - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 15 | - @InEnum(ConversationTypeEnum.class) | ||
| 16 | - private Integer conversationType; | ||
| 17 | - | ||
| 18 | - // TODO @anhaohao:我们应该是 senderId;因为它和 receiverId 是相对应的哈。 | ||
| 19 | - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 20 | - private Long fromId; // 根据 conversationType 区分 | ||
| 21 | - | ||
| 22 | - // TODO @hao:昵称和头像,也直接发给接收人好了; | ||
| 23 | - | ||
| 24 | - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") | ||
| 25 | - private Long messageId; | ||
| 26 | - | ||
| 27 | - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 28 | - private Integer contentType; // 参见 ImMessageTypeEnum 枚举 | ||
| 29 | - | ||
| 30 | - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 31 | - private String content; | ||
| 32 | - | ||
| 33 | - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 34 | - private LocalDateTime sendTime; | ||
| 35 | - | ||
| 36 | - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 37 | - private Long sequence; | ||
| 38 | - | ||
| 39 | -} | ||
| 40 | \ No newline at end of file | 0 | \ No newline at end of file |
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java deleted
| 1 | -package cn.iocoder.yudao.module.im.websocket.message; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; | ||
| 5 | -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum; | ||
| 6 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 7 | -import lombok.Data; | ||
| 8 | - | ||
| 9 | -@Schema(description = "管理后台 - IM 消息发送 send") | ||
| 10 | -@Data | ||
| 11 | -public class ImSendMessage { | ||
| 12 | - | ||
| 13 | - @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") | ||
| 14 | - private String clientMessageId; | ||
| 15 | - | ||
| 16 | - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 17 | - @InEnum(ConversationTypeEnum.class) | ||
| 18 | - private Integer conversationType; | ||
| 19 | - | ||
| 20 | - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 21 | - private Long receiverId; // 根据 conversationType 区分 | ||
| 22 | - | ||
| 23 | - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 24 | - @InEnum(MessageContentTypeEnum.class) | ||
| 25 | - private Integer contentType; | ||
| 26 | - | ||
| 27 | - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 28 | - private String content; | ||
| 29 | - | ||
| 30 | -} | ||
| 31 | \ No newline at end of file | 0 | \ No newline at end of file |