-
- 新增会话读位置持久化接口与前端同步逻辑 - 增加好友、好友申请、加群申请的增量拉取补偿 - 统一前端 pull 编排,增加回扫窗口、落库等待和账号切换守卫 - 调整群成员为按群懒加载缓存,并移除全局成员增量链路 - 修复消息落库、读位置补偿、READ 事件乱序下的未读状态一致性 - 完善群申请红点快照刷新和管理员角色变化补偿 - 更新消息存储设计与修复记录文档
-
- 新增 im_conversation_read 会话读位置表,并补充消息存储推拉相关索引 - 群消息固化 receiver_user_ids 快照,按可见成员快照拉取和统计回执 - 统一消息 status 为 NORMAL/RECALL,新增私聊 receipt_status 并复用统一回执状态 - 前端改用 receiptStatus 展示私聊已读、群回执和频道已读态 - 补齐私聊、群聊、频道 WebSocket 已读同步和离线补偿逻辑 - 更新 IM 消息状态、回执状态字典和管理后台展示 - 调整相关单测和测试建表脚本
-
- 后端群列表返回历史群成员状态 joinStatus,用于区分当前群和历史退群群 - 群消息拉取支持基于 receiver_user_ids 快照过滤可见消息 - 补充群消息 pull、群成员候选、私聊 pull 相关索引与 SQL 脚本 - 前端接入 joinStatus,并封装历史退群群判断 - 历史退群群禁发、隐藏群操作入口,并从通讯录、转发、推荐名片候选中排除 - 保留历史群会话展示能力,用于查看退群前历史消息
-
- 固化群消息 receiver_user_ids 快照,并按快照过滤离线拉取和历史查询 - 新增 im_conversation_read,统一私聊、群聊、频道的已读位置存储 - 移除群聊、频道已读位置的 Redis 存储 - 补充群消息、群成员、私聊拉取相关索引 - 调整群回执统计、引用消息可见性和退群历史查询口径 - 补充消息拉取与会话已读位置相关测试
-
Merge pull request !1557 from 芋道源码/master-jdk17
-
- 调整 MyBatisUtils.findInSet 使用 MyBatis-Plus 参数绑定 - 增加 columnName 白名单校验,避免列名被注入 - 补充 H2 兼容实现,恢复相关单测覆盖 - 替换各模块动态 FIND_IN_SET 字符串拼接写法 - 补充单参数、多参数绑定场景单测
-
- 移除 IM 对 websocket starter 的直接依赖 - 改为通过 infra WebSocketSenderApi 发送推送消息 - 同步调整已有 WebSocket 推送单测
-
- 复用好友申请、群申请和群邀请唯一键冲突后的旧记录,并补充测试 - 收敛 RTC 旁观者加入、忙线校验、追加邀请超员和群通话通知逻辑 - 为 RTC 参与者补充房间用户唯一约束与 MySQL 迁移 - 统一群本体管理请求的 id 字段,并同步前端调用 - 修复前端来电活跃态守卫和 LiveKit 重连前断开旧房间 - 清理群成员通知基类命名和相关注释
-
- 修复群管理行锁、管理员角色更新、群主转让、置顶消息并发问题 - 修复好友申请 maxId 游标、重复申请排序、通知类型校验和消息内容结构校验 - 修复消息统计口径、RTC token 鉴权、离会通知、前端拉取取消和媒体重试 - 优化表情批量删除、WebSocket 推送注释、群 READ 字段和相关单测 - 更新 bug_todo、bug_done 和 bug_rejected,剩余 9 个待修
-
- 修复管理端消息内容搜索和私聊双向查询 - 加强 RTC 通话并发状态保护,去除重复接口错误提示 - 支持成员永久禁言 - 脱敏群消息 WebSocket 定向收件人字段 - 更新 IM bug 台账,剩余 P1/P2 共 35 个
-
- 校验群资料字段长度,并在同意好友申请时复验双方用户 - 仅向双向有效好友推送资料更新通知 - 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_START / END 文案
-
✨ feat(im): 处理 RTC_CALL(NO_ANSWER) 信令;私聊气泡显示「未接听」
-
✨ feat(im): 处理 RTC_CALL(NO_ANSWER) 信令;私聊气泡显示「未接听」
-
- refactor: inviteCall 拆成 createCall(创建新通话)/ inviteCall(追加邀请);VO `ImRtcCallInviteReqVO`(统一版)→ git mv 为 `ImRtcCallCreateReqVO`;恢复 + git mv `ImRtcCallInviteMoreReqVO` → `ImRtcCallInviteReqVO`(room + inviteeIds);Controller 端点 `/invite` → `/create` + 新 `/invite`;Service 内部拆 createGroupCall / createPrivateCall / createCall0 - refactor: VO 字段 `scene` → `conversationType`(CreateReqVO / RespVO 同步),与 ImConversationTypeEnum 对齐;`peerUserId` 融合进 `inviteeIds`,私聊必传 1 个对端从集合派生 - feat: 群通话关房语义升级;shouldCloseGroupRoom 改 `(JOINED==0) || (JOINED==1 && INVITING==0)`,1 人独守 + 无后续即关;endSessionIfTerminal 按 call.status 自动推 reason(CREATED→CANCEL 没真接通过 / RUNNING→HANGUP);rejectCall 群分支末尾触发关房判定,全员拒接自动收敛 - chore: 错误码新增 RTC_GROUP_INVITEE_REQUIRED;validateInviteScene → validateCreateCall;Controller `getLoginUserId` 抽局部变量;resolveDisplayName 抽私有 helper 复用 displayName 派生 - fix: pushCallInviteNotification 加 NPE 防御(getUserMap 缺键时降级为 userId 字符串);pushCallEndNotification 私聊 receiverId 去掉错误的 senderId 兜底 - chore: handleLiveKitEvent 改回传统 switch 兼容 JDK8;其它若干 Javadoc 补齐 / 注释精简 / typo 修复
-
✨ feat(im): RTC 通话逻辑收口(displayName / inviteeIds 校验 / 配置化阈值) - fix: pushCallInviteNotification 给被邀请人签 token 时 displayName 改用 invitee 自己的昵称(原来错用 inviter) - feat: 群通话发起 / 追加邀请均强制 inviteeIds 非空,对齐微信交互;超量改抛 RTC_GROUP_INVITEE_OVER_LIMIT,不再静默截断 - refactor: ImGroupMemberService 抽 validateMembersInGroup(groupId, ids) 批量校验,inviteMoreCall / resolveInvitees 复用 - refactor: 僵尸通话清理阈值从 ImRtcCallCleanupJob 静态常量挪到 ImProperties.rtc.cleanupZombieThresholdMinutes - perf: createCall / inviteMoreCall 推 INVITE 前一次 getUserMap 批量拉用户,省 N 次 RPC - refactor: inviteMoreCall 参与者构造改 CollectionUtils.convertList;trim 多余注释 - docs: 补齐 RTC service / controller / job / LiveKitClient 私有方法的 @param / @return - chore: 错误码新增 RTC_GROUP_INVITEE_REQUIRED / RTC_GROUP_INVITEE_OVER_LIMIT ```
-
✨ feat(im): RTC 通话逻辑收口(displayName / inviteeIds 校验 / 配置化阈值) - fix: pushCallInviteNotification 给被邀请人签 token 时 displayName 改用 invitee 自己的昵称(原来错用 inviter) - feat: 群通话发起 / 追加邀请均强制 inviteeIds 非空,对齐微信交互;超量改抛 RTC_GROUP_INVITEE_OVER_LIMIT,不再静默截断 - refactor: ImGroupMemberService 抽 validateMembersInGroup(groupId, ids) 批量校验,inviteMoreCall / resolveInvitees 复用 - refactor: 僵尸通话清理阈值从 ImRtcCallCleanupJob 静态常量挪到 ImProperties.rtc.cleanupZombieThresholdMinutes - perf: createCall / inviteMoreCall 推 INVITE 前一次 getUserMap 批量拉用户,省 N 次 RPC - refactor: inviteMoreCall 参与者构造改 CollectionUtils.convertList;trim 多余注释 - docs: 补齐 RTC service / controller / job / LiveKitClient 私有方法的 @param / @return - chore: 错误码新增 RTC_GROUP_INVITEE_REQUIRED / RTC_GROUP_INVITEE_OVER_LIMIT ```