-
- 后端群列表返回历史群成员状态 joinStatus,用于区分当前群和历史退群群 - 群消息拉取支持基于 receiver_user_ids 快照过滤可见消息 - 补充群消息 pull、群成员候选、私聊 pull 相关索引与 SQL 脚本 - 前端接入 joinStatus,并封装历史退群群判断 - 历史退群群禁发、隐藏群操作入口,并从通讯录、转发、推荐名片候选中排除 - 保留历史群会话展示能力,用于查看退群前历史消息
-
- 固化群消息 receiver_user_ids 快照,并按快照过滤离线拉取和历史查询 - 新增 im_conversation_read,统一私聊、群聊、频道的已读位置存储 - 移除群聊、频道已读位置的 Redis 存储 - 补充群消息、群成员、私聊拉取相关索引 - 调整群回执统计、引用消息可见性和退群历史查询口径 - 补充消息拉取与会话已读位置相关测试
-
- 移除 IM 对 websocket starter 的直接依赖 - 改为通过 infra WebSocketSenderApi 发送推送消息 - 同步调整已有 WebSocket 推送单测
-
- 复用好友申请、群申请和群邀请唯一键冲突后的旧记录,并补充测试 - 收敛 RTC 旁观者加入、忙线校验、追加邀请超员和群通话通知逻辑 - 为 RTC 参与者补充房间用户唯一约束与 MySQL 迁移 - 统一群本体管理请求的 id 字段,并同步前端调用 - 修复前端来电活跃态守卫和 LiveKit 重连前断开旧房间 - 清理群成员通知基类命名和相关注释
-
- 修复群管理行锁、管理员角色更新、群主转让、置顶消息并发问题 - 修复好友申请 maxId 游标、重复申请排序、通知类型校验和消息内容结构校验 - 修复消息统计口径、RTC token 鉴权、离会通知、前端拉取取消和媒体重试 - 优化表情批量删除、WebSocket 推送注释、群 READ 字段和相关单测 - 更新 bug_todo、bug_done 和 bug_rejected,剩余 9 个待修
-
- 校验群资料字段长度,并在同意好友申请时复验双方用户 - 仅向双向有效好友推送资料更新通知 - WebSocket 推送收件人去重,并忽略空用户编号 - 群聊和私聊历史保留撤回消息记录 - 校验群通话排除发起人后仍需存在被邀请人 - 统一 IM 前端接口参数传递方式 - 抽取全局 URL 安全打开工具,并复用到消息预览 - 防止好友申请同意和拒绝按钮重复操作 - 补充好友、消息、RTC、WebSocket 相关测试
-
- 拒绝匿名 WebSocket 握手,收紧 RTC 接听和入会忙线校验 - 支持封禁群解散,管理端解散改为独立权限码 - 增加个人表情数量配置、唯一约束和并发重复兜底 - 修复 RTC 异常断开上报、视频远端音频和好友选择大列表渲染 - 让个人表情添加失败透出后端业务错误 - 流转 P0 bug 文档,并按产品取舍记录 apiSecret 默认值不强制拦截
-
- 校验敏感词、表情包、表情项状态枚举和批量删除数量上限 - 限制私聊、群聊增量拉取 size 最小值 - 收紧表情包项 Mapper 的 in 查询并在 Service 层处理空好友集合 - 兼容统计聚合数值类型并明确当前有效群总数口径 - 固定 LiveKit token 签名编码和 IM web 包说明 - 修正群禁言权限错误码顺序并补充封禁、踢人、禁言回归测试 - 流转 IM bug 文档并记录本轮不修项语义
-
- 清理好友重加时的 deleteTime 和历史备注残留 - 清理群成员重入时的 quitTime、muteEndTime 和邀请来源残留 - 允许封禁群成员主动退群,仍拦截已解散群 - 校验群已读游标的消息归属和可见性 - 收窄群消息置顶通知为专用展示对象并同步前端展示 - 回填群成员单查接口的昵称和头像 - 补充相关回归测试并流转 IM bug 状态文档
-
- 拦截对方已拉黑时的静默恢复好友关系 - 入群申请通过前复核群状态和申请人成员状态 - 群消息撤回保留定向可见范围 - 过滤群历史消息和已读用户查询中的定向消息 - 敏感词缓存刷新补充租户上下文 - 补充 IM 测试表约束和好友申请回归用例
-
- 群主 / 管理员可撤回他人违规消息;治理他人消息时不受撤回时间窗限制,撤回自己的仍受限 - banGroup 校验群未解散(已解散抛 GROUP_DISSOLVED)+ banned 幂等,避免重复封禁广播 - 踢人跳过已退群的失效目标,只踢有效成员,不再因混入历史管理员整批失败 - 退群成员离线 pull 去掉撤回消息过滤,与在群成员的 selectListByMinId 对齐 - 补 removeGroupMember 单测 status 字段 + 新增「跳过失效目标」混合用例
-
✨ feat(im): 处理 RTC_CALL(NO_ANSWER) 信令;私聊气泡显示「未接听」
-
优化好友状态的获取和验证逻辑,将 ImFriendStateEnum 的使用改为整型状态值,简化了好友关系的校验过程。新增 validateFriend 方法,统一处理好友和黑名单的校验,提升代码可读性和维护性。
-
ImProperties.message 新增 privateReadEnabled / groupReadEnabled,前端 config.ts 同步镜像。关闭后: - 后端:read 系列接口(read / getMaxReadMessageId / getGroupReadUserIds)抛业务异常;sendGroupMessage 强制 NO_RECEIPT 忽略 receipt=true;pull 群消息跳过 Redis 已读游标读取与 readCount 补齐 - 前端:气泡已读标签 / 群回执 popover / 「发送回执消息」下拉入口 / admin 列表「状态」「回执」列与详情对应字段按开关隐藏;自动上报 / 冷启动同步对方已读位置 / WS READ & RECEIPT handler 全部按开关短路兜底,避免打到禁用接口 - 单测:补 @Spy ImProperties 修复原本就在的 NPE,加 disabled 分支断言
-
后端 - createInviteRequestList N+1 → 3 SQL:批量 select IN + update IN + insertBatch;20 人邀请从 40 RTT 降到 3 RTT - service 不再出现 mybatis:复用记录的 update(null, wrapper) 下沉到 Im{Group,Friend}RequestMapper.update*Reset helper - inviteGroupMember 入参去重切 hutool:CollUtil.subtractToList(CollUtil.distinct(...), activeMemberUserIds) - 删除 dead 字段 inviterUserId(GroupRequestApprovedNotification / GroupRequestRejectedNotification):前端不再消费 前端 - 1505 / 1506 通知改静默:同意走群事件 1509 / 1510 渲染系统提示,拒绝不再打扰 - 修竞态:addByRequestId 校验 handleResult === UNHANDLED,避免 1503 在途时被 1505 / 1506 抢先后又把已处理记录塞回未处理列表 - 修复 dialog 复用记录刷新:watch key 含 inviterUserId / applyContent,同 id 不同内容也触发 refetch;actingId 期间跳过避免本端动作多余 RTT - 修复 willGoApproval 误报:group.ownerUserId 兜底群主;members 未到位时保守按非审批处理 - unhandledCountMap memoized getter:O(N) 扫一次缓存到 Map,ConversationItem 直读 Map 消除 O(N×M) 重复 filter -
- 邀请路径写 addSource=INVITE;群主 / 管理员邀请绕过审批;inviteGroupMember 入参去重 - getGroupRequest 越权校验加成员有效状态判断;新增 list-by-group 接口 - 申请列表按 update_time 倒序,update(null, wrapper) 路径手动刷 updateTime - addByRequestId 不再 skip 同 id,复用记录刷新并置顶 - GroupRequestListDialog 单群模式订阅 store 增量同步;GroupMemberAddDialog 审批分支文案区分 - ConversationItem 增加 [X 条进群申请] 红字前缀;MessagePanel 顶部胶囊横幅 - 1505 / 1506 通知改静默:同意走群事件渲染系统提示,拒绝不再打扰;清掉 dead inviterUserId 字段
-
- ImPrivateMessageServiceImplTest 用 getFriendState 替换已删除的 isFriend mock;返回 ImFriendStateEnum.FRIEND / NONE - ImFriendServiceImplTest 删 stale 测试(isFriend / addFriend / deleteFriend 二参版本均已不存在);addFriend0 测试参数补齐 null displayName / addSource 凑齐 4 参签名 - 修复后 mvn -pl yudao-module-im test-compile 通过 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
…ore/组件/管理后台),为后续 mute 禁言功能腾出词族
-
私聊已读语义在 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。
-
2. 优化 trace 相关的逻辑