Sfoglia il codice sorgente

docs: 云函数 v0.1.2 留痕(分页 / 超管 companyId 过滤 / 非法校验)

云函数 xlosi3m46q v0.1.1-fallback → v0.1.2(已热更发布):
- ① 分页:limit(上限 500)/ skip / 返回体 total
- ② scope=all 支持 companyId 过滤(多账套切换)
- ③ 非法 companyId → 400 明确报错(此前静默忽略)

实现原则:只增不改,limit=0 回退原行为。
发布前预检:q.count/q.skip 为新引入 API → 均加 try/catch 兜底;
移除未验证的 response.headers,改为返回体带 total。

验证:分页完整性 54 条无重复、边界 limit=9999 受限、
超管过滤与直查库逐条一致、三身份权限全对(超管 all=54 /
管理员与成员 all=403 company=1)、云函数验收 9/9、
ng test 484 / build / verify:ui 11 / verify:docs 44。

前端仍为前端切片(数据量远小于上限),后端分页作预留。

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct 11 ore fa
parent
commit
40ee2add01
1 ha cambiato i file con 15 aggiunte e 0 eliminazioni
  1. 15 0
      docs/00-tracking/操作追踪.md

+ 15 - 0
docs/00-tracking/操作追踪.md

@@ -735,3 +735,18 @@
 | **我的错误(如实列出)** | ① **未参考 v1 既有实现**(`fmode-app/src/app/core/acl.ts` 已有完整 ACL),自行发明 `Profile.identyType`<br>② **把判级放进云函数**当安全边界 —— v1 明确写「服务端以 SessionToken 鉴权为准,客户端 scope 仅用于 UI 过滤」<br>③ **发布前只做 `node --check` 语法校验**,未验证运行时 API 是否存在<br>④ **未在发布前确认接口调用方**(事后确认 studio 根本不调此云函数)|
 | **教训** | 改共享服务组件前必须:① 先读存量实现并复用 ② 发布前验证运行时行为 ③ 先确认影响范围 |
 | **后续** | 用户裁决:**先出 v1 对照报告**,再决定方向。云函数保持原版不动。 |
+
+### 2026-10-20 — 云函数 v0.1.2:分页 + 超管 companyId 过滤 + 非法 companyId 校验
+
+| 项 | 内容 |
+|---|---|
+| 动作 | 补完上轮遗留的三项云函数能力 |
+| 版本 | `xlosi3m46q` **v0.1.1-fallback → v0.1.2**(26091 → 27209 字符)|
+| **① 分页** | 新增 `limit`(上限 500 防拖库)/ `skip`;返回体增 `total`(分页前总数,未分页时为 0)|
+| **② 超管按 companyId 过滤** | `scope='all'` 时若传 `companyId` → `q.equalTo('company', ...)`(多账套切换用)|
+| **③ 非法 companyId 校验** | `scope='all'` 与 `scope='company'` 两处:`Company.get()` 失败 → **400 明确报错**(此前静默忽略返回全量)|
+| **实现原则** | 🔴 **只增不改**:原查询逻辑完全保留;`limit=0` 回退原行为(1000 条)|
+| **发布前预检(吸取前两次事故教训)** | · 逐项检查新 API 是否原版验证过:`q.count()` / `q.skip()` 为**新引入**(Parse 标准 API)→ **均加 try/catch 兜底**(`skip` 失败→400 / `count` 失败→`total=-1` 降级,不影响分页主流程)<br>· **移除** `response.headers[]`(原版从未用过,属未验证 API)→ 改为**返回体带 `total`**(`_ok()` 支持扩展字段,已验证)|
+| 验证证据(全实测) | ① **分页完整性**:`skip=0/10/20/30/40/50` + `limit=10` → 累计 **54 条、去重 54、无重复、覆盖全部**;`total=54` 正确<br>② **边界**:`limit=9999` → 被限制 500 ✅;`limit=0` → 回退全量 54 ✅<br>③ **超管过滤**:`scope=all&companyId=rpnXZC1loU` → **6 个,与直查库逐条一致** ✅<br>④ **非法 companyId** → `400 companyId 无效` ✅<br>⑤ **三身份权限**(真实 sessionToken 端到端):超管 all=54/company=6/mine=11;公司管理员 all=**403**/company=1/mine=0;普通成员 all=**403**/company=1/mine=0 ✅<br>⑥ **回归**:`ng test` 484 / build / `verify:ui` 11 / `verify:docs` 44 / 云函数验收 **9/9** |
+| 恰实说明(前端分页) | 前端仍为「一次拉全量 + 前端切片」(`visibleAgents`),**未改为服务端分页**——因为当前数据量(54/6/0~11)远小于 500 上限,前端切片性能更好。**后端分页能力作为预留**,数据量增长时可直接启用 |
+| 备份 | `.local-backup/xlosi3m46q-v0.1.1-fallback-已发布备份.js`(回滚基线)|