- chat_sessions 增 read_at(毫秒,与 chat_messages.created_at 同单位);迁移 0010 并把既有会话回填为各自最新消息时间(升级当天不误报)
- ListSessions 单查询派生 unreadCount(无 N+1,复用 idx_chat_msgs_session_created 覆盖索引)
- MarkSessionRead 只前进 MAX(read_at, ?);未知会话 ErrSessionNotFound;游标方法挂在网关消费侧窄接口(沿用 GetMessage/messageLookup 先例,避免污染 runtime 接口与其 fake)
- POST /api/v1/sessions/{id}/read:writeAuth + 400/404/501,成功广播 session_read、失败路径不广播
- Docs/api-client v0.37(§1 unreadCount / 新行 8a / §3.9 session_read / §4.2 用法)
- 含迁移回填测试、store/handler 测试与变异验证;顺带把 migrate_pinned_test 的「回退一步=0009」硬编码改为对迁移数量免疫
10 lines
600 B
SQL
10 lines
600 B
SQL
-- 0010_chat_session_read_at down: drop the read cursor added by the up migration.
|
|
-- SQLite DROP COLUMN (3.35+) is already relied on by 0006/0007/0009, and read_at is
|
|
-- not referenced by any index, view or constraint, so a plain drop is safe. The
|
|
-- rolled-back state is the pre-D4 one: no unread badge data at all (the cursor is
|
|
-- derived display state, not data a session needs to stay valid). The backfilled
|
|
-- values cannot be restored by a re-up beyond the newest-message rule, which is
|
|
-- exactly the upgrade default the up migration applies.
|
|
|
|
ALTER TABLE chat_sessions DROP COLUMN read_at;
|