diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java index d36728e..3b00ebf 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java @@ -1,8 +1,6 @@ package cn.iocoder.yudao.module.im.controller.admin.message; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.*; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.group.ImGroupMessageReadReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.group.ImGroupMessageRespVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.group.ImGroupMessageSendReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImGroupMessageDO; @@ -35,40 +33,35 @@ public class ImGroupMessageController { @PostMapping("/send") @Operation(summary = "发送群聊消息") - public CommonResult sendMessage(@Valid @RequestBody ImGroupMessageSendReqVO reqVO) { - ImGroupMessageDO message = imGroupMessageService.sendMessage(getLoginUserId(), reqVO); + public CommonResult sendGroupMessage(@Valid @RequestBody ImGroupMessageSendReqVO reqVO) { + ImGroupMessageDO message = imGroupMessageService.sendGroupMessage(getLoginUserId(), reqVO); return success(toRespVO(message)); } - // DONE @AI:需要在评估下,是否需要 nextMinId。结论:需要,前端用 nextMinId 做增量拉取游标 @GetMapping("/pull") @Operation(summary = "拉取群聊消息(增量)") @Parameter(name = "minId", description = "最小消息 id", required = true, example = "0") @Parameter(name = "size", description = "拉取数量", required = true, example = "100") - public CommonResult> pullMessages( + public CommonResult> pullGroupMessages( @RequestParam("minId") Long minId, @RequestParam("size") Integer size) { - List messages = imGroupMessageService.pullMessages(getLoginUserId(), minId, size); - ImMessagePullRespVO resp = new ImMessagePullRespVO<>(); - resp.setList(messages.stream().map(this::toRespVO).collect(Collectors.toList())); - resp.setNextMinId(messages.isEmpty() ? minId - : messages.get(messages.size() - 1).getId()); - return success(resp); + List messages = imGroupMessageService.pullGroupMessages(getLoginUserId(), minId, size); + return success(messages.stream().map(this::toRespVO).collect(Collectors.toList())); } - // DONE @AI:它是不是不用 VO。结论:需要 ReqVO,承载 groupId 字段并做参数校验 @PutMapping("/read") @Operation(summary = "标记群聊消息已读") - public CommonResult readMessages(@Valid @RequestBody ImGroupMessageReadReqVO reqVO) { - imGroupMessageService.readMessages(getLoginUserId(), reqVO.getGroupId()); + @Parameter(name = "groupId", description = "群编号", required = true, example = "1") + public CommonResult readGroupMessages(@RequestParam("groupId") Long groupId) { + imGroupMessageService.readGroupMessages(getLoginUserId(), groupId); return success(true); } @DeleteMapping("/recall") @Operation(summary = "撤回群聊消息") @Parameter(name = "id", description = "消息编号", required = true, example = "1") - public CommonResult recallMessage(@RequestParam("id") Long id) { - imGroupMessageService.recallMessage(getLoginUserId(), id); + public CommonResult recallGroupMessage(@RequestParam("id") Long id) { + imGroupMessageService.recallGroupMessage(getLoginUserId(), id); return success(true); } @@ -77,10 +70,10 @@ public class ImGroupMessageController { @Operation(summary = "获取群消息已读用户列表") @Parameter(name = "groupId", description = "群编号", required = true, example = "1") @Parameter(name = "messageId", description = "消息编号", required = true, example = "1") - public CommonResult> getReadUsers( + public CommonResult> getGroupReadUsers( @RequestParam("groupId") Long groupId, @RequestParam("messageId") Long messageId) { - List readUserIds = imGroupMessageService.getReadUsers(getLoginUserId(), groupId, messageId); + List readUserIds = imGroupMessageService.getGroupReadUsers(getLoginUserId(), groupId, messageId); // Long -> String 转换 return success(readUserIds.stream().map(String::valueOf).collect(Collectors.toList())); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java index b5a5e90..2917f7e 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.im.controller.admin.message; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.*; import cn.iocoder.yudao.module.im.controller.admin.message.vo.privates.ImPrivateMessageRespVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.privates.ImPrivateMessageSendReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImPrivateMessageDO; @@ -34,8 +33,8 @@ public class ImPrivateMessageController { @PostMapping("/send") @Operation(summary = "发送私聊消息") - public CommonResult sendMessage(@Valid @RequestBody ImPrivateMessageSendReqVO reqVO) { - ImPrivateMessageDO message = imPrivateMessageService.sendMessage(getLoginUserId(), reqVO); + public CommonResult sendPrivateMessage(@Valid @RequestBody ImPrivateMessageSendReqVO reqVO) { + ImPrivateMessageDO message = imPrivateMessageService.sendPrivateMessage(getLoginUserId(), reqVO); return success(BeanUtils.toBean(message, ImPrivateMessageRespVO.class)); } @@ -43,30 +42,25 @@ public class ImPrivateMessageController { @Operation(summary = "拉取私聊消息(增量)") @Parameter(name = "minId", description = "最小消息 id", required = true, example = "0") @Parameter(name = "size", description = "拉取数量", required = true, example = "100") - public CommonResult> pullMessages( - @RequestParam("minId") Long minId, - @RequestParam("size") Integer size) { - List messages = imPrivateMessageService.pullMessages(getLoginUserId(), minId, size); - ImMessagePullRespVO resp = new ImMessagePullRespVO<>(); - resp.setList(BeanUtils.toBean(messages, ImPrivateMessageRespVO.class)); - resp.setNextMinId(messages.isEmpty() ? minId - : messages.get(messages.size() - 1).getId()); - return success(resp); + public CommonResult> pullPrivateMessages(@RequestParam("minId") Long minId, + @RequestParam("size") Integer size) { + List messages = imPrivateMessageService.pullPrivateMessages(getLoginUserId(), minId, size); + return success(BeanUtils.toBean(messages, ImPrivateMessageRespVO.class)); } @PutMapping("/read") @Operation(summary = "标记私聊消息已读") @Parameter(name = "friendId", description = "好友用户编号", required = true, example = "2") - public CommonResult readMessages(@RequestParam("friendId") Long friendId) { - imPrivateMessageService.readMessages(getLoginUserId(), friendId); + public CommonResult readPrivateMessages(@RequestParam("friendId") Long friendId) { + imPrivateMessageService.readPrivateMessages(getLoginUserId(), friendId); return success(true); } @DeleteMapping("/recall") @Operation(summary = "撤回私聊消息") @Parameter(name = "id", description = "消息编号", required = true, example = "1") - public CommonResult recallMessage(@RequestParam("id") Long id) { - imPrivateMessageService.recallMessage(getLoginUserId(), id); + public CommonResult recallPrivateMessage(@RequestParam("id") Long id) { + imPrivateMessageService.recallPrivateMessage(getLoginUserId(), id); return success(true); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePullRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePullRespVO.java deleted file mode 100644 index ec03f56..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePullRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -/** - * 消息拉取 Response VO - */ -@Schema(description = "管理后台 - 消息拉取 Response VO") -@Data -public class ImMessagePullRespVO { - - @Schema(description = "消息列表") - private List list; - - @Schema(description = "下次拉取的最小 id", example = "100") - private Long nextMinId; - -} diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/group/ImGroupMessageReadReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/group/ImGroupMessageReadReqVO.java deleted file mode 100644 index 6f0af25..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/group/ImGroupMessageReadReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo.group; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -/** - * 群聊已读 Request VO - */ -@Schema(description = "管理后台 - 群聊已读 Request VO") -@Data -public class ImGroupMessageReadReqVO { - - @Schema(description = "群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "群编号不能为空") - private Long groupId; - -} diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java index 1b00415..bc67977 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.im.dal.dataobject.message; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; import cn.iocoder.yudao.module.im.enums.message.ImGroupMessageReceiptStatusEnum; import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum; @@ -9,7 +10,6 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.*; import java.time.LocalDateTime; @@ -77,20 +77,20 @@ public class ImGroupMessageDO extends BaseDO { */ private LocalDateTime sendTime; /** - * 定向接收用户编号列表 + * 定向接收用户编号列表,以逗号分隔 *

* 为空表示全员可见 * * 关联 AdminUserDO 的 id 字段 */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List receiverUserIds; /** - * @ 目标用户编号列表 + * @ 目标用户编号列表,以逗号分隔 * * 关联 AdminUserDO 的 id 字段 */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List atUserIds; /** * 回执状态 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java index 41d88e3..8dbc512 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java @@ -19,7 +19,7 @@ public interface ImGroupMessageService { * @param reqVO 发送请求 * @return 消息 */ - ImGroupMessageDO sendMessage(Long senderId, ImGroupMessageSendReqVO reqVO); + ImGroupMessageDO sendGroupMessage(Long senderId, ImGroupMessageSendReqVO reqVO); /** * 拉取群聊消息(增量) @@ -29,7 +29,7 @@ public interface ImGroupMessageService { * @param size 拉取数量 * @return 消息列表 */ - List pullMessages(Long userId, Long minId, Integer size); + List pullGroupMessages(Long userId, Long minId, Integer size); /** * 标记群聊消息已读 @@ -37,7 +37,7 @@ public interface ImGroupMessageService { * @param userId 当前用户编号 * @param groupId 群编号 */ - void readMessages(Long userId, Long groupId); + void readGroupMessages(Long userId, Long groupId); /** * 撤回群聊消息 @@ -45,7 +45,7 @@ public interface ImGroupMessageService { * @param userId 当前用户编号 * @param messageId 消息编号 */ - void recallMessage(Long userId, Long messageId); + void recallGroupMessage(Long userId, Long messageId); /** * 获取群消息的已读用户列表 @@ -55,6 +55,6 @@ public interface ImGroupMessageService { * @param messageId 消息编号 * @return 已读用户编号列表 */ - List getReadUsers(Long userId, Long groupId, Long messageId); + List getGroupReadUsers(Long userId, Long groupId, Long messageId); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java index 8a23fdd..20b3dbc 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java @@ -55,7 +55,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { private WebSocketMessageSender webSocketMessageSender; @Override - public ImGroupMessageDO sendMessage(Long senderId, ImGroupMessageSendReqVO reqVO) { + public ImGroupMessageDO sendGroupMessage(Long senderId, ImGroupMessageSendReqVO reqVO) { // 1. 幂等校验 ImGroupMessageDO existing = imGroupMessageMapper.selectBySenderIdAndClientMessageId( senderId, reqVO.getClientMessageId()); @@ -100,7 +100,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { } @Override - public List pullMessages(Long userId, Long minId, Integer size) { + public List pullGroupMessages(Long userId, Long minId, Integer size) { if (size > MAX_PULL_SIZE) { throw exception(MESSAGE_PULL_SIZE_EXCEEDED); } @@ -145,7 +145,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { } @Override - public void readMessages(Long userId, Long groupId) { + public void readGroupMessages(Long userId, Long groupId) { // 1. 校验用户在群中(权限校验) ImGroupMemberDO member = imGroupMemberService.getGroupMember(groupId, userId); if (member == null || CommonStatusEnum.DISABLE.getStatus().equals(member.getStatus())) { @@ -173,7 +173,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { } @Override - public void recallMessage(Long userId, Long messageId) { + public void recallGroupMessage(Long userId, Long messageId) { // 1. 校验消息存在 ImGroupMessageDO message = imGroupMessageMapper.selectById(messageId); if (message == null) { @@ -210,7 +210,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { } @Override - public List getReadUsers(Long userId, Long groupId, Long messageId) { + public List getGroupReadUsers(Long userId, Long groupId, Long messageId) { // 1. 校验用户在群中(权限校验) ImGroupMemberDO currentMember = imGroupMemberService.getGroupMember(groupId, userId); if (currentMember == null || CommonStatusEnum.DISABLE.getStatus().equals(currentMember.getStatus())) { diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java index 64a6b4b..c4e5d24 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java @@ -19,7 +19,7 @@ public interface ImPrivateMessageService { * @param reqVO 发送请求 * @return 消息 */ - ImPrivateMessageDO sendMessage(Long senderId, ImPrivateMessageSendReqVO reqVO); + ImPrivateMessageDO sendPrivateMessage(Long senderId, ImPrivateMessageSendReqVO reqVO); /** * 拉取私聊消息(增量) @@ -29,7 +29,7 @@ public interface ImPrivateMessageService { * @param size 拉取数量 * @return 消息列表 */ - List pullMessages(Long userId, Long minId, Integer size); + List pullPrivateMessages(Long userId, Long minId, Integer size); /** * 标记私聊消息已读 @@ -37,7 +37,7 @@ public interface ImPrivateMessageService { * @param userId 当前用户编号 * @param friendId 好友用户编号 */ - void readMessages(Long userId, Long friendId); + void readPrivateMessages(Long userId, Long friendId); /** * 撤回私聊消息 @@ -45,6 +45,6 @@ public interface ImPrivateMessageService { * @param userId 当前用户编号 * @param messageId 消息编号 */ - void recallMessage(Long userId, Long messageId); + void recallPrivateMessage(Long userId, Long messageId); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java index 9f4f2f7..b9c8941 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java @@ -50,7 +50,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { private WebSocketMessageSender webSocketMessageSender; @Override - public ImPrivateMessageDO sendMessage(Long senderId, ImPrivateMessageSendReqVO reqVO) { + public ImPrivateMessageDO sendPrivateMessage(Long senderId, ImPrivateMessageSendReqVO reqVO) { // 1.1 幂等校验:根据 senderId + clientMessageId 查重 ImPrivateMessageDO existing = imPrivateMessageMapper.selectBySenderIdAndClientMessageId( senderId, reqVO.getClientMessageId()); @@ -80,7 +80,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { } @Override - public List pullMessages(Long userId, Long minId, Integer size) { + public List pullPrivateMessages(Long userId, Long minId, Integer size) { if (size > MAX_PULL_SIZE) { throw exception(MESSAGE_PULL_SIZE_EXCEEDED); } @@ -89,7 +89,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { // DONE @芋艿:已 review,逻辑正确 @Override - public void readMessages(Long userId, Long friendId) { + public void readPrivateMessages(Long userId, Long friendId) { // 1. 批量更新消息状态为已读 int updated = imPrivateMessageMapper.updateStatusToRead(userId, friendId); if (updated == 0) { @@ -114,7 +114,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { // DONE @芋艿:已 review,逻辑正确 @Override - public void recallMessage(Long userId, Long messageId) { + public void recallPrivateMessage(Long userId, Long messageId) { // 1.1 校验消息存在 ImPrivateMessageDO message = imPrivateMessageMapper.selectById(messageId); if (message == null) { diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java index 3a4f497..fa3baf0 100644 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java @@ -96,7 +96,7 @@ public class ImGroupMessageServiceImplTest { }); // 调用 - ImGroupMessageDO result = groupMessageService.sendMessage(1L, reqVO); + ImGroupMessageDO result = groupMessageService.sendGroupMessage(1L, reqVO); // 断言 assertNotNull(result); @@ -121,7 +121,7 @@ public class ImGroupMessageServiceImplTest { .thenReturn(existing); // 调用 - ImGroupMessageDO result = groupMessageService.sendMessage(1L, reqVO); + ImGroupMessageDO result = groupMessageService.sendGroupMessage(1L, reqVO); // 断言 assertEquals(100L, result.getId()); @@ -141,7 +141,7 @@ public class ImGroupMessageServiceImplTest { // 调用并断言 ServiceException exception = assertThrows(ServiceException.class, - () -> groupMessageService.sendMessage(1L, reqVO)); + () -> groupMessageService.sendGroupMessage(1L, reqVO)); assertEquals(GROUP_MEMBER_NOT_IN_GROUP.getCode(), exception.getCode()); } @@ -168,7 +168,7 @@ public class ImGroupMessageServiceImplTest { .thenReturn(List.of(beforeJoin, afterJoin)); // 调用 - List result = groupMessageService.pullMessages(1L, 0L, 100); + List result = groupMessageService.pullGroupMessages(1L, 0L, 100); // 断言:入群前消息不可见 assertEquals(1, result.size()); @@ -197,7 +197,7 @@ public class ImGroupMessageServiceImplTest { .thenReturn(List.of(beforeQuit, afterQuit)); // 调用 - List result = groupMessageService.pullMessages(1L, 0L, 100); + List result = groupMessageService.pullGroupMessages(1L, 0L, 100); // 断言:退群后消息不可见 assertEquals(1, result.size()); @@ -216,7 +216,7 @@ public class ImGroupMessageServiceImplTest { // 定向接收消息:只给用户 2 和 3 ImGroupMessageDO directedMsg = ImGroupMessageDO.builder() .id(1L).groupId(10L).senderId(5L) - .receiverUserIds("2,3") + .receiverUserIds(List.of(2L, 3L)) .sendTime(LocalDateTime.of(2026, 4, 12, 10, 0, 0)).build(); // 全员消息 ImGroupMessageDO allMsg = ImGroupMessageDO.builder() @@ -226,7 +226,7 @@ public class ImGroupMessageServiceImplTest { .thenReturn(List.of(directedMsg, allMsg)); // 调用 - List result = groupMessageService.pullMessages(1L, 0L, 100); + List result = groupMessageService.pullGroupMessages(1L, 0L, 100); // 断言:定向接收的消息用户 1 看不到,只能看到全员消息 assertEquals(1, result.size()); @@ -244,17 +244,17 @@ public class ImGroupMessageServiceImplTest { ImGroupMessageDO atMsg = ImGroupMessageDO.builder() .id(1L).groupId(10L).senderId(2L) - .atUserIds("1,3") + .atUserIds(List.of(1L, 3L)) .sendTime(LocalDateTime.of(2026, 4, 12, 10, 0, 0)).build(); when(imGroupMessageMapper.selectListByMinId(List.of(10L), 0L, 100)) .thenReturn(List.of(atMsg)); // 调用 - List result = groupMessageService.pullMessages(1L, 0L, 100); + List result = groupMessageService.pullGroupMessages(1L, 0L, 100); // 断言:@ 字段正确返回 assertEquals(1, result.size()); - assertEquals("1,3", result.get(0).getAtUserIds()); + assertEquals(List.of(1L, 3L), result.get(0).getAtUserIds()); } // ========== 撤回测试 ========== @@ -279,7 +279,7 @@ public class ImGroupMessageServiceImplTest { when(imGroupMemberService.selectByGroupId(10L)).thenReturn(members); // 调用 - groupMessageService.recallMessage(1L, 50L); + groupMessageService.recallGroupMessage(1L, 50L); // 断言:只给 2 个活跃成员发送 RECALL 事件(userId=3 已退群) verify(webSocketMessageSender, times(2)).sendObject(anyInt(), anyLong(), anyString(), any()); @@ -294,7 +294,7 @@ public class ImGroupMessageServiceImplTest { // 调用并断言:越权校验 ServiceException exception = assertThrows(ServiceException.class, - () -> groupMessageService.readMessages(1L, 10L)); + () -> groupMessageService.readGroupMessages(1L, 10L)); assertEquals(GROUP_MEMBER_NOT_IN_GROUP.getCode(), exception.getCode()); } @@ -340,7 +340,7 @@ public class ImGroupMessageServiceImplTest { when(groupReadPositionRedisDAO.getAllReadPositions(10L)).thenReturn(positions); // 调用:查询 messageId=80 的已读用户 - List readUsers = groupMessageService.getReadUsers(1L, 10L, 80L); + List readUsers = groupMessageService.getGroupReadUsers(1L, 10L, 80L); // 断言: // 用户 1: 可见 + readMaxId=100>=80 → 已读 ✓(但排除发送者?不是发送者,所以算入) @@ -361,7 +361,7 @@ public class ImGroupMessageServiceImplTest { // 调用并断言:越权校验 ServiceException exception = assertThrows(ServiceException.class, - () -> groupMessageService.getReadUsers(99L, 10L, 80L)); + () -> groupMessageService.getGroupReadUsers(99L, 10L, 80L)); assertEquals(GROUP_MEMBER_NOT_IN_GROUP.getCode(), exception.getCode()); } diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImplTest.java index 6abb416..eda0d54 100644 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImplTest.java +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImplTest.java @@ -66,7 +66,7 @@ public class ImPrivateMessageServiceImplTest { }); // 调用 - ImPrivateMessageDO result = privateMessageService.sendMessage(1L, reqVO); + ImPrivateMessageDO result = privateMessageService.sendPrivateMessage(1L, reqVO); // 断言 assertNotNull(result); @@ -95,7 +95,7 @@ public class ImPrivateMessageServiceImplTest { .thenReturn(existingMessage); // 调用 - ImPrivateMessageDO result = privateMessageService.sendMessage(1L, reqVO); + ImPrivateMessageDO result = privateMessageService.sendPrivateMessage(1L, reqVO); // 断言:返回已存在的消息 assertEquals(100L, result.getId()); @@ -114,7 +114,7 @@ public class ImPrivateMessageServiceImplTest { // 调用并断言 ServiceException exception = assertThrows(ServiceException.class, - () -> privateMessageService.sendMessage(1L, reqVO)); + () -> privateMessageService.sendPrivateMessage(1L, reqVO)); assertEquals(FRIEND_NOT_FRIEND.getCode(), exception.getCode()); } @@ -130,7 +130,7 @@ public class ImPrivateMessageServiceImplTest { when(imPrivateMessageMapper.selectListByMinId(1L, 0L, 100)).thenReturn(mockMessages); // 调用 - List result = privateMessageService.pullMessages(1L, 0L, 100); + List result = privateMessageService.pullPrivateMessages(1L, 0L, 100); // 断言 assertEquals(2, result.size()); @@ -140,7 +140,7 @@ public class ImPrivateMessageServiceImplTest { public void testPullMessages_sizeExceeded() { // 调用并断言 ServiceException exception = assertThrows(ServiceException.class, - () -> privateMessageService.pullMessages(1L, 0L, 1001)); + () -> privateMessageService.pullPrivateMessages(1L, 0L, 1001)); assertEquals(MESSAGE_PULL_SIZE_EXCEEDED.getCode(), exception.getCode()); } @@ -152,7 +152,7 @@ public class ImPrivateMessageServiceImplTest { when(imPrivateMessageMapper.updateStatusToRead(1L, 2L)).thenReturn(3); // 调用 - privateMessageService.readMessages(1L, 2L); + privateMessageService.readPrivateMessages(1L, 2L); // 断言:发送了 READ 和 RECEIPT 事件 verify(webSocketMessageSender, times(2)).sendObject(anyInt(), anyLong(), anyString(), any()); @@ -170,7 +170,7 @@ public class ImPrivateMessageServiceImplTest { when(imPrivateMessageMapper.updateById(any(ImPrivateMessageDO.class))).thenReturn(1); // 调用 - privateMessageService.recallMessage(1L, 10L); + privateMessageService.recallPrivateMessage(1L, 10L); // 断言 verify(imPrivateMessageMapper).updateById(any(ImPrivateMessageDO.class)); @@ -188,7 +188,7 @@ public class ImPrivateMessageServiceImplTest { // 调用并断言 ServiceException exception = assertThrows(ServiceException.class, - () -> privateMessageService.recallMessage(1L, 10L)); + () -> privateMessageService.recallPrivateMessage(1L, 10L)); assertEquals(MESSAGE_RECALL_DENIED.getCode(), exception.getCode()); } @@ -202,7 +202,7 @@ public class ImPrivateMessageServiceImplTest { // 调用并断言 ServiceException exception = assertThrows(ServiceException.class, - () -> privateMessageService.recallMessage(1L, 10L)); + () -> privateMessageService.recallPrivateMessage(1L, 10L)); assertEquals(MESSAGE_ALREADY_RECALLED.getCode(), exception.getCode()); } diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImWebSocketEventTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImWebSocketEventTest.java index 23ffa94..266fce7 100644 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImWebSocketEventTest.java +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImWebSocketEventTest.java @@ -60,7 +60,7 @@ public class ImWebSocketEventTest { }); // 调用 - privateMessageService.sendMessage(1L, reqVO); + privateMessageService.sendPrivateMessage(1L, reqVO); // 捕获 WebSocket 调用 ArgumentCaptor typeCaptor = ArgumentCaptor.forClass(String.class); @@ -87,7 +87,7 @@ public class ImWebSocketEventTest { when(imPrivateMessageMapper.updateStatusToRead(1L, 2L)).thenReturn(1); // 调用 - privateMessageService.readMessages(1L, 2L); + privateMessageService.readPrivateMessages(1L, 2L); // 捕获 ArgumentCaptor typeCaptor = ArgumentCaptor.forClass(String.class); @@ -112,7 +112,7 @@ public class ImWebSocketEventTest { when(imPrivateMessageMapper.updateById(any(ImPrivateMessageDO.class))).thenReturn(1); // 调用 - privateMessageService.recallMessage(1L, 10L); + privateMessageService.recallPrivateMessage(1L, 10L); // 捕获 ArgumentCaptor typeCaptor = ArgumentCaptor.forClass(String.class);