Session Cookie
POST /api/auth/login 校验私人密码,签发带 HMAC 签名的长期 Cookie。Cookie 为 httpOnly、Secure、SameSite=Lax;密码不会进入前端。
AI0506 Calendar 是一个面向个人学习、科研、考试、项目与生活安排的私人日历系统。本文解释它的边界、数据如何流动、不同客户端如何接入,以及哪些规则必须在修改代码时保持不变。
用一份云端结构化数据管理事件和截止事项,并让网页、未来的 Android 客户端和 AI Agent 共享同一套 API。重点是可靠、简单、可维护,而不是构建一个面向大众的 SaaS。
个人日程、学习/科研安排、截止日期、AI 辅助管理
多用户、社交、公开分享、复杂权限、聊天、AI 自动规划
Android App、课程表、Days Matter、天气卡片
前端、API、MCP 和数据库位于同一个 Cloudflare Pages 项目中。客户端不直接访问 D1,所有业务写入都经过认证和领域逻辑校验。
functions/_middleware.js。浏览器携带 session cookie;App / Agent 携带 Authorization: Bearer ...;MCP 客户端使用 OAuth access token。
请求进入 functions/api/* 或 functions/mcp/index.js;REST 的 /api/* 由全局 middleware 保护。
校验凭据、JSON 字段、时间格式、分类存在性、提醒枚举和幂等键;失败返回统一错误信封。
事件、系列、Deadline 和提醒逻辑在 functions/_lib/ 中复用;多步系列变更用 D1 batch() 保持原子性。
成功返回 { ok: true, data };失败返回 { ok: false, error: { code, message } }。
这是私人单用户系统,但浏览器会话和 Agent/API 访问是两条概念上分离的路径。
POST /api/auth/login 校验私人密码,签发带 HMAC 签名的长期 Cookie。Cookie 为 httpOnly、Secure、SameSite=Lax;密码不会进入前端。
App 和 AI Agent 使用 Authorization: Bearer <API_TOKEN>。Phase 1 只有一个 token,不做 token 管理表。
/mcp 使用 OAuth 授权;动态注册、授权码、token 和 scope 由 Pages Functions 处理。
PASSWORD、API_TOKEN、SESSION_SECRET、ICS_SUBSCRIPTION_TOKEN 只存在于环境变量,不写入静态页、Git 或日志。时间字段使用带时区偏移的 ISO 8601 字符串,按客户端提交的偏移原样存储,不在 API 层强制转 UTC。
series_id 关联系列;deleted_at 软删除(source, external_id) → import idempotency
series_id → recurring membership
original_start_time → occurrence identity
idempotency_key → safe retry for series operationsevent_series 保存规则;每一次实际发生仍是一个 events 行。创建系列时服务端生成最多 366 个实例,并通过 D1 batch 原子写入。
系列 PATCH 会合并已存规则、重新生成实例;首版不承诺保留此前对单个 occurrence 的直接修改。
/api/event-seriesPATCH/api/event-series/:idPOST/api/event-series/:id/exceptionsPOST/api/event-series/:id/splitEvent 默认提前 60 和 10 分钟;可自定义最多两个,或显式关闭。
服务端写入 reminders;Deadline 根据 priority 生成计划,改期/完成/删除会取消或重建 pending 行。
网页打开时轮询触发到期提醒,notifications 以 reminder_id 去重。
通知中心显示 scheduled_at;系统提示是独立的可选渠道。
/api/events、/api/deadlines、/api/event-series、/api/export 等;JSON 响应信封稳定。
/mcp 暴露带 calendar_ 前缀的工具,复用 REST 的校验、优先级、软删除和重复规则。
只读 HTTPS 订阅不走 Cookie/Bearer,而使用高熵 URL token;只包含 Event,不包含 Deadline。
POST /api/events/import 按 (source, external_id) 幂等;重复提交更新而不是重复创建。
https://calendar.ai0506.com/apiLocalhttp://localhost:8788/apinpm ci
npm run db:local
npm run devnpm run test:deadlines
npm run test:reminders
npm run test:series-patch
npm run test:ics静态资源由 Pages 提供,Functions 提供 API;D1 绑定为 calendar-db。本地测试不等于生产验收,部署后必须检查 live domain。
public/Web shell、calendar UI、公开静态说明页functions/api/REST routesfunctions/_lib/auth、events、series、deadlines、reminders、ICS 等共享逻辑functions/mcp/Remote MCP tools 与 OAuth 接口migrations/D1 schema evolution;不随意改 API/数据库合同多用户、社交、公开分享、复杂权限、聊天、AI 自动规划、页面关闭后的可靠推送。
小步修改;不要硬编码密钥;不要提交 .env / .dev.vars;不要绕过 middleware;不要让 REST 与 MCP 出现两套校验规则。
先做静态检查,再做对应回归测试;涉及部署时,分别验证本地代码、D1 状态、Cloudflare 部署和正式域名。