-
私聊已读语义在 message.status 字段翻转,离线期间错过的 RECEIPT 推送没法 重放(与群聊不同——群聊已读在 message.readCount / receiptStatus 字段自带)。 新增此接口:客户端进入私聊会话或断线重连后,拿到对方已读到我发的最大消息 id,按 id <= maxReadId 翻转本地自发消息状态。 实现: - mapper 用 order by id desc + LIMIT 1 命中 (sender_id, receiver_id) 索引,无 max() 聚合开销; - 对方一条都没读过时返回 null(不做 0 兜底,避免与真实 id 混淆); - 补齐 hit / miss 两个单测。
-
原 readPrivateMessages 走 select-then-update 两步:先按 status=UNREAD 查未读,再按 id in 翻转,maxReadId 取已 update 行的 max(id)。该实现 有两个问题: 1. select 与 update 之间到达的消息会被一并标 READ,但 maxReadId 取的 是 select 时刻的最大值,对方端拿到的「已读到哪条」语义偏弱,前端按 maxReadId 卡边界时也会与实际状态错位。 2. 接口与群聊 readGroupMessages(userId, groupId, messageId) 不对称。 改造: - 接口签名增加 messageId(已读位置,含),与群聊接口对齐; - mapper 替换为单条 update SQL:id <= messageId AND status=UNREAD 直接 翻转,消除两步竞态窗口; - READ / RECEIPT 推送的已读位置直接采用前端上报的 messageId; - 落地 ImPrivateMessageServiceImpl 原 TODO; - 同步更新 testReadMessages_success / testReadMessages_noUnread。
-
- 修改获取当前用户群组列表的接口名称,提升语义清晰度 - 新增获取有效群成员 userId 列表的接口,支持缓存 - 优化群成员查询逻辑,确保历史消息可见性 - 更新相关文档,补充接口说明和使用示例
-
- ImFriendServiceImpl#addFriend0 捕获 DuplicateKeyException 并发插入冲突时忽略(另一方插入必然为 ENABLE 状态) - ImGroupMemberServiceImpl#addGroupMember 改为先查后写: 已存在 DISABLE 复活为 ENABLE,新记录 insert 失败降级 select 返回 - ImGroupMemberServiceImpl#addGroupMembers 批量 insert 触发 DuplicateKey 时降级为逐个 addGroupMember 走幂等兜底 - 依赖 im_friend.uk_user_friend 与 im_group_member.uk_group_user 唯一索引
-
- ImFriendServiceImpl#addFriend0 捕获 DuplicateKeyException 并发插入冲突时忽略(另一方插入必然为 ENABLE 状态) - ImGroupMemberServiceImpl#addGroupMember 改为先查后写: 已存在 DISABLE 复活为 ENABLE,新记录 insert 失败降级 select 返回 - ImGroupMemberServiceImpl#addGroupMembers 批量 insert 触发 DuplicateKey 时降级为逐个 addGroupMember 走幂等兜底 - 依赖 im_friend.uk_user_friend 与 im_group_member.uk_group_user 唯一索引
-
- 删除 ImUserController、ImUserRespVO(get-self 复用 UserProfileController#getUserProfile) - UserController 新增 /get-simple、/list-by-nickname 免鉴权接口(用于 IM 点头像弹名片、加好友搜索),整理到类末尾并用分隔注释标识 - UserSimpleRespVO 补充 avatar、sex 字段
-
- ImPrivateMessageDTO#ofFriendUpdate 移除 content 字段,删除 FriendUpdateMessage - 新增 ImMessageTypeEnum.GROUP_MEMBER_UPDATE(203) 和 ofGroupMemberUpdate 工厂方法 - ImGroupMemberServiceImpl#updateGroupMember 推送成员变更事件(多端同步,仅推自己)
-
- ImGroupServiceImpl#updateGroup 移除 displayUserName/displayGroupName 处理逻辑,交由 updateGroupMember 承接 - 去掉 hasGroupInfoChange 判断,群主校验前置 - ImGroupUpdateReqVO 清理 displayUserName/displayGroupName 字段
-
新增群聊成员人数限制,最大成员数为 500。实现邀请好友功能,确保被邀请人是当前用户的好友,若不是则返回相应错误提示。更新相关提示信息以提升用户体验。
-
实现群成员的邀请、退出和移除功能,支持群主对成员的管理操作。新增相关提示信息和错误码,优化群成员更新逻辑,确保群主无法退出群聊。 BREAKING CHANGE: 群解散相关逻辑已调整为群删除,更新了相关消息推送类型
-
实现群解散功能,允许群主解散群聊并通知所有成员。新增群解散提示消息格式,并在解散时推送给群成员。增加了校验用户是否为群主的方法,以确保操作的合法性。
-
重构 ImGroupMemberMapper 和 ImGroupMemberService,移除不再使用的方法,简化代码结构。同时新增群成员移除功能,以支持群解散场景。
-
新增删除用户在群中的已读位置和清理群所有用户已读位置的功能,支持成员退群和群解散场景。此功能提升了群消息管理的灵活性和用户体验。
-
新增群成员邀请接口,允许用户将其他用户加入群组。同时,更新群成员信息的接口也进行了调整,以支持群内昵称和群名备注的修改。这些改动提升了群组管理的灵活性和用户体验。
-
实现了在事务中推送 WebSocket 消息的功能,确保在事务提交后再发送消息,避免客户端在查询数据库时看到未提交的变更。新增了 executeAfterTransaction 方法来处理事务同步,优化了私聊和群聊消息的发送逻辑。
-
新增获取当前登录用户的群列表和指定群的成员列表接口,支持聚合用户昵称和头像信息。优化群组成员查询逻辑,确保返回有效的群成员数据。 - 实现用户侧接口 `/im/group/list-my` 和 `/im/group-member/list` - 聚合 AdminUser 的昵称和头像信息 - 过滤已封禁和解散的群组
-
新增 IM WebSocket 服务接口及实现,支持异步推送私聊和群聊消息。 同时,重构相关消息发送逻辑,提升代码可读性和维护性。 - 新增 ImWebSocketService 接口 - 实现 ImWebSocketServiceImpl 类 - 更新 ImPrivateMessageService 和 ImGroupMessageService 以使用 WebSocket 推送
-
实现了 IM 好友的增删改查功能,支持免打扰状态的更新。新增了相关的请求和响应对象,优化了好友列表的获取逻辑,并确保了好友关系的有效性校验。 - 新增 ImFriendRespVO 和 ImFriendUpdateReqVO 类 - 更新 ImFriendController,添加更新好友信息接口 - 实现 ImFriendService 中的好友管理逻辑