现象
在 iOS 客户端手工创建子区(thread)后,新建的子区不出现在创建者自己的「关注」Tab 里。web 端已通过 octo-web #293 (useFollowSidebar 客户端补 follow)缓解,但:
该修复是纯前端 web 的,iOS / Android / PC 无对应逻辑;
即便在 web 上,feat(incomingwebhook): cache the push hot-path lookups (#284 item 2) #293 也只在父频道已关注 时才补 follow,覆盖不到「创建者未关注父频道」这一场景。
因此这是一个跨端普遍存在的后端行为缺口,需要在 server 侧根治。
根因
子区能否进入某用户的关注 Tab,唯一依据是 user_conversation_ext 里是否有该子区的行。落这行的两条路径:
创建时 :modules/thread/service.go 的 CreateThread —— 只给创建者写 thread_member(IM 发消息权限)+ 把创建者加进 IM 频道 subscribers,没有为创建者写任何 user_conversation_ext 行 。
fanout :modules/conversation_ext/service.go 的 OnThreadCreated —— 只给满足 target_type=group AND auto_follow_threads=1(即已明确关注父频道 )的成员补子区行。创建者不被特殊对待 。
结论:只要创建者本人没有关注父频道,无论用哪个客户端建子区,这个子区都不会进创建者自己的关注 Tab。
期望行为(propriety)
创建者对自己刚创建的子区,天然应当可见——用户执行了「创建」这个动作,系统就应让结果对他可见,不应依赖他事先关注了父频道。
建议修复
在 server 的 thread 创建 hook(CreateThread / 触发 OnThreadCreated 的同一提交路径)里,无条件为创建者补一条子区 user_conversation_ext 行 (等价于把创建者视为该子区的 follower),与现有 fanout 写入走同一套 version bump / ext 落行逻辑,保证幂等。
优点:一处改动,iOS / web / PC / Android 全端统一生效,不必每个客户端各修一遍。
注意事项
关联
现象
在 iOS 客户端手工创建子区(thread)后,新建的子区不出现在创建者自己的「关注」Tab 里。web 端已通过 octo-web #293(
useFollowSidebar客户端补 follow)缓解,但:因此这是一个跨端普遍存在的后端行为缺口,需要在 server 侧根治。
根因
子区能否进入某用户的关注 Tab,唯一依据是
user_conversation_ext里是否有该子区的行。落这行的两条路径:modules/thread/service.go的CreateThread—— 只给创建者写thread_member(IM 发消息权限)+ 把创建者加进 IM 频道 subscribers,没有为创建者写任何user_conversation_ext行。modules/conversation_ext/service.go的OnThreadCreated—— 只给满足target_type=group AND auto_follow_threads=1(即已明确关注父频道)的成员补子区行。创建者不被特殊对待。结论:只要创建者本人没有关注父频道,无论用哪个客户端建子区,这个子区都不会进创建者自己的关注 Tab。
期望行为(propriety)
创建者对自己刚创建的子区,天然应当可见——用户执行了「创建」这个动作,系统就应让结果对他可见,不应依赖他事先关注了父频道。
建议修复
在 server 的 thread 创建 hook(
CreateThread/ 触发OnThreadCreated的同一提交路径)里,无条件为创建者补一条子区user_conversation_ext行(等价于把创建者视为该子区的 follower),与现有 fanout 写入走同一套 version bump / ext 落行逻辑,保证幂等。优点:一处改动,iOS / web / PC / Android 全端统一生效,不必每个客户端各修一遍。
注意事项
group_unfollowedflag 或把父群拉回关注(这是 octo-web feat(incomingwebhook): cache the push hot-path lookups (#284 item 2) #293 第一版被 reviewer 拒的 P1:不应因创建子区这个动作,副作用地把用户显式取关过的父群拖回关注 Tab)。OnThreadCreated现有写入口径一致,保证幂等(重复触发不产生脏行)。group_unfollowedflag 不被改动。关联