待办事项
ToDo 子域提供当前用户的待办 CRUD、完成状态、批量操作、拖拽排序和一次性提醒。HTTP 接入位于 FreeKit.Platform.HttpApi/ToDo,核心实体与服务位于 FreeKit.Platform/ToDo。
业务能力
- 个人数据隔离:列表按
CreateUserId过滤;详情、修改、删除、完成和排序都会调用ToDo.CanBeAccessedBy。 - 完成态:
MarkDone(isDone)维护IsDone与完成时间。 - 拖拽排序:
SortAsync按传入 Id 顺序写入Sort。 - 提醒:更新待办且
NotificationTime晚于当前时间时,登记todo-notification-{todoId}一次性任务。
当前实现中,CreateAsync 只写入待办,不会登记提醒;提醒调度发生在 UpdateAsync。调用方如需创建后提醒,应在创建成功后再执行一次带未来 NotificationTime 的更新,或先调整应用服务实现并补测试。
提醒链路
FreeSchedulerNotificationAdapter 自身会把过去时间转换为 delaySeconds = 0,但 ToDoService.UpdateAsync 当前只在时间大于 DateTime.Now 时调用它。因此通过现有 HTTP 更新提交过去时间不会创建任务。
Job 端处理器位于 src/Services/Host/FreeKit.Job.Host/Extensions/JobExtensions.cs。它在发送前把待办标记为已提醒,避免任务重放造成重复通知;最终调用的是 CmsKit INotificationService,不是 Platform 消息渠道服务。
API
基础路由:/api/plat/todo,Controller 继承 FreeKitController,默认需要认证。
| 方法 | 路由 | 用途 |
|---|---|---|
| GET | /api/plat/todo | 当前用户分页列表 |
| GET | /api/plat/todo/{id} | 详情(当前 Action 标记了 AllowAnonymous,服务仍检查资源所有者) |
| POST | /api/plat/todo | 创建 |
| PUT | /api/plat/todo/{id} | 更新并可能登记提醒 |
| DELETE | /api/plat/todo/{id} | 软删除 |
| PUT | /api/plat/todo/done/{id}/{isDone} | 单条完成/取消完成 |
| PUT | /api/plat/todo/dones | 批量完成/取消完成 |
| PUT | /api/plat/todo/sort | 保存拖拽顺序 |
时间约定
仓库新代码约定数据库时间写入使用 DateTime.UtcNow。ToDo 现有 CreateAsync 和提醒延迟计算仍使用 DateTime.Now,属于存量行为;扩展时不要复制这一写法,修正时需要同时明确 API 输入时区和既有数据语义。
关键源码
src/Services/Platform/FreeKit.Platform/ToDo/Application/ToDoService.cssrc/Services/Platform/FreeKit.Platform/ToDo/Application/FreeSchedulerNotificationAdapter.cssrc/Services/Platform/FreeKit.Platform.HttpApi/ToDo/Controllers/ToDoController.cssrc/Services/Host/FreeKit.Job.Host/Extensions/JobExtensions.cs