✨ feat(timing): 实现 ListCalendarView 日历视图查询 - #171
Conversation
为提醒规则管理提供原子批量写入,避免逐条保存造成部分更新。 服务校验 weak/strong snooze、日程归属和准点 strong 唯一性;内存 fake 与主机测试覆盖成功、冲突和写入失败路径。 Host、架构、Profile、Python 检查及 Node 24 Gateway CI 已通过;本机缺少 GNU GCC,gcov 覆盖率由 CI 确认。 Closes 1024XEngineer#141
服务层基于旧快照校验后写入时,多个并发请求可能绕过准点强提醒唯一性。 Store Port 现在要求在同一原子写入边界复核该不变量;内存 fake 和 Store 合同测试覆盖第二个 writer 被拒绝的场景。 ./scripts/run_checks.sh 已通过。 Refs 1024XEngineer#141
实现左闭右开时间范围内的用户可见 occurrence 查询,支持日程和状态过滤、排序与分页。通过 Store Port 查询任务和已物化实例,并在不引入 RFC 5545/IANA tzdb 的前提下展开基础周期规则,使用 modified/completed/skipped 例外覆盖基础 occurrence。 RED:ListCalendarView 合法范围测试在原 kUnavailable stub 上失败。GREEN:补充最小查询 Port 和内存 fake 后通过一次性、周期展开、例外覆盖、过滤分页及非法输入测试。REFACTOR:将查询实现独立到日历翻译单元。 Refs 1024XEngineer#143
| return remainder < 0 ? quotient - 1 : quotient; | ||
| } | ||
|
|
||
| // Gregorian conversion is deliberately UTC-only; timezone database expansion is outside this issue. |
There was a problem hiding this comment.
TimingTask stores a time_zone, and registration preserves it, but calendar expansion derives weekdays/month days/year days using UTC civil dates only. For a non-UTC task such as Asia/Shanghai, a weekly Sunday 00:30 local occurrence is Saturday in UTC, so by_weekdays, monthly day matching, and yearly matching can include or skip the wrong local date. This should either expand in the task timezone or reject/normalize non-UTC tasks before using these calendar rules.
| return planned_times; | ||
| } | ||
|
|
||
| for (int64_t day = first_day; day <= last_day_start && day <= std::numeric_limits<int64_t>::max() - kSecondsPerDay; |
There was a problem hiding this comment.
ListCalendarView accepts any valid [range_start, range_end) and then scans one day at a time for every active task before pagination. A large but valid request, for example a multi-century or accidental INT64_MAX range, can tie up the service despite a small page_size. Please cap the query window or seek directly to the first candidate occurrence per recurrence type and stop after enough rows for the requested page.
…ar-view # Conflicts: # tests/host/timing_task_service_test.cc
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
补充周、月、年周期展开,Store 查询失败、分页参数和过滤分支的公开 Service 测试,满足 C++ patch 覆盖率门禁。 Refs 1024XEngineer#143
周期规则使用 UTC 民用日期展开;对其他时区返回明确的不可用错误,避免静默产生错误的星期、月日和年月日匹配。补充 Host 失败路径测试。\n\nRefs 1024XEngineer#143
|
@fennoai 你是资深后端/全栈架构师 + 嵌入式硬件工程师复合型专家,执行严格、客观、不留情面的代码仓库Review,请遵循下面所有评审规则,逐条输出审查结果,禁止敷衍、禁止只说空话、禁止笼统概括。 评审维度
输出要求
现在开始对提供的仓库代码/PR变更、硬件资料、结构模型进行评审 |
Review 结论本次按固定范围 已验证: 顶层设计问题
逐项问题清单
整体仓库风险总结核心风险集中在 Timing 领域层和 Store Port 边界:当前实现适合作为 Host fake 上的功能切片,但还不是可直接承载真实持久化和长期运行设备的查询设计。安全上未发现密钥提交,但缺少用户/范围过滤入口和提醒通道白名单;性能上全量扫描、N+1 查询、无范围上限会在嵌入式设备上造成阻塞;硬件专项未发现直接烧毁外设或机构失控风险,因为本 PR 未触碰硬件驱动、引脚、电气参数或结构模型。 优先级整改清单
长期架构与软硬件协同优化方案
|
Reference: 对 2026-08-06 汇总 Review 的逐项范围判断评审范围应以 Issue 143 为准,并受 parent Issue 137 约束:本切片只实现 本 PR 已处理
适用的长期风险,但不属于 Issue 143 的可安全修复范围
不适用或已有合同定义
不属于本 PR:PR 161 / Issue 141 的提醒规则项
结论:Issue 143 的阻断性问题已按最小可验证方式修复;其余适用风险已留在正确的后续设计边界,而不以未定义的生产策略、时区语义或依赖 PR 行为阻断本切片。 |
软删除任务不再返回到用户日历;拒绝无法安全对齐日边界的 INT64_MIN 邻近范围,避免 FloorDiv 后的乘法溢出。\n\n明确 ListInstances 需提供软删除记录供 Service 决定可见性,并补齐降序、第二页、实际触发时间和精确月规则覆盖。\n\nRefs 1024XEngineer#143
132a935 to
b3d35cc
Compare
同步 upstream/main 的定时任务更新、提醒规则删除、语音和 IM Gateway 能力,并在冲突处保留 Issue 143 的 ListCalendarView 实现。补齐 ListTasks Port、日历构建目标与 fake 行为,明确软删除实例由 Service 过滤。 已通过 clang-format 18、Ruff 0.12.7、主机 30 项测试、架构与固件配置检查,以及 Node.js 24 下 IM Gateway 145 项测试;PostgreSQL 契约按门禁规则因本机未启动跳过。 Refs 1024XEngineer#143
upstream/main 引入的 vendored cJSON 不属于 VoiceLife 业务源码,也不应成为 C++ patch 覆盖率门槛的一部分。将 third_party 目录加入 Codecov ignore,保留业务组件覆盖率要求。 已验证 codecov.yml YAML 语法和 git diff 检查。
third_party 排除规则未影响 C++ patch 覆盖率失败,根因是日历查询分支覆盖不足。恢复原有 Codecov 范围,避免无效地改变全局统计口径。
覆盖周期规则筛选、effective_until、软删除实例、非法分页与越界分页,验证 ListCalendarView 在 Issue 143 边界内的展开、过滤和分页行为。 Refs 1024XEngineer#143
结论
完成 Issue #143:
TimingTaskService::ListCalendarView已按时间范围返回用户可见 occurrence,并合并已物化例外。本 PR 依赖开放 PR #161(Issue #141);由于 GitHub 不允许以个人 fork 分支作为 base,PR diff 会包含该依赖提交。请按“先看 #161,再看本 PR 最后一个提交 a14bd8b”的顺序评审。背景
TimingTaskService 的日历查询仍由
kUnavailablestub 占位,调用方无法按范围读取一次性或周期日程,也无法观察 modified/completed/skipped 例外。改动范围
TimingTaskStorePort::ListTasks与ListInstances查询边界,并同步内存 fake。接口与依赖影响
新增两个 Store Port 纯虚查询方法;未改变公开 Service DTO、Profile Schema、持久化格式、协议或组件依赖方向。生产 Adapter 尚未进入本 Issue 范围。
测试与构建证据
./scripts/run_pre_submit_checks.sh:通过。已知风险
周期展开使用秒级 Gregorian/UTC 规则,不处理 IANA 时区和完整 RFC 5545 语义;大范围查询的生产数据库性能留给后续 Issue。
兼容窗口与回退
新增 Port 目前只有 Host 内存实现,未引入生产迁移。回退本 PR 即可恢复
ListCalendarView的 stub 行为,无持久化迁移步骤。Closes #143
Refs #137
Refs #161