# TickTick Integration

当前 Python 项目里的 TickTick 迁移先恢复 legacy 的最核心能力，不额外扩成更大的集成层。

## 当前已支持

- 运行时从 config 表读取 TickTick 配置，缺失时仍可 fallback `.env`
- `GET /ticktick/auth/start`
  - 需要已登录 session
  - 生成 OAuth `state`
  - 直接重定向到 TickTick 授权页
- `GET /ticktick/auth/code`
  - 校验进程内保存的 `state`
  - 用 authorization code 换取 access token
  - 将 `TICKTICK_TOKEN` 持久化到 `app_config` 表
- TickTick Open API 基础调用：
  - 列 project
  - 列 project 下 task
  - 创建 task
  - 按 title 精确匹配做重复创建保护
- Home Assistant inbound 已重新接回 `ticktick / create_action_task`

## 当前配置项

- `APP_HOSTNAME`
- `TICKTICK_CLIENT_ID`
- `TICKTICK_CLIENT_SECRET`
- `TICKTICK_TOKEN`
- `HOME_ASSISTANT_ACTION_TASK_PROJECT_ID`

## 兼容性说明

- 仍保留 legacy 的 OAuth authorization code flow
- OAuth callback URI 现在由 `APP_HOSTNAME` 和当前环境自动推导：`development` 使用 `http`，其他环境使用 `https`
- `state` 仍是进程内临时状态；如果服务在 start 和 callback 之间重启，本轮实现下授权需要重新开始
- 不再把 token 写回 `.env` 或其他配置文件，统一写入 config 表
- 当前没有引入 legacy 的第三方 TickTick 库，先用标准库完成兼容行为

## 后续适合单独拆分的工作

- 给 config 页面增加明确的 TickTick 授权入口
- 增加 project 探测或选择能力，减少手工填写 `HOME_ASSISTANT_ACTION_TASK_PROJECT_ID`
- 如果后续发现 OAuth/token 生命周期需要更强健，再补 refresh token 或持久化 auth state