Skip to content

compiler/validate: view searchableFields not validated against searchable field types — a declaration typo 400s the whole list at runtime #4830

Closed

Description

@baozhoutao

现象(17.0.0-rc.1,实测)

视图 searchableFields 里声明了「不可搜索类型」的字段(如 lookup)时:

  • objectstack compile / npm run validate 全程零告警(56 对象 46 视图 ✓ Validation passed);
  • 运行时 Console 工具栏搜索发 GET /api/v1/data/<object>?$search=<kw>&$searchFields=<视图声明>,服务端逐字段校验类型(只接受 text/email/phone/url/autonumber/textarea/markdown/select/status),命中 lookup 即整条查询 400 INVALID_FIELD,Console 映射成 errorKind='rejected',列表区整块红盾「该视图的查询被拒绝」——任何角色(含系统管理员)敲第一个字符必翻车。

一个纯声明层笔误可以让整张列表的搜索对全体用户彻底不可用,且 compile/validate/CI 三道关全放行,只能靠人肉点搜索框发现;报错文案还是面向管理员的(「需要管理员修正」)。

期望(任一)

  1. compile/validate 期就按与运行时同一套判定校验视图 searchableFields(把 400 前移到构建期,declared = enforced);
  2. 或运行时对不可搜索字段静默跳过 + warn,而不是整条查询 400——一个字段声明错误不应打掉整张列表。

附带:$searchFields 不支持 project.name 跨对象路径(400 Unknown field),「按关联对象名称做关键字搜索」目前无声明式落点,是否支持请一并考虑。

复现

任意对象视图 searchableFields: ['name', '<某lookup字段>'] → validate 全绿 → 列表工具栏搜索输 1 字符 → 整列表 400。

下游对策

os-project-titanwind-ehr 登记 PLAT-DEF-041,PR steedos-labs/os-project-titanwind-ehr#746:修正声明 + 自写 check-searchable-fields.cjs 全量扫描兜住(98 视图)。

Activity

  1. self-assigned this
    on Aug 3, 2026
  2. baozhoutao commented on Aug 3, 2026

    @baozhoutao
    ContributorAuthor

    Claim: PM loop round 1 (explicit dispatch)
    Branch: claude/issue-4830-searchablefields-type-validation
    Worktree: framework-issue-4830

    Triage note: packages/lint/validate-searchable-fields (#4328) already gates existence, but deliberately skips type — its premise ("an explicit searchableFields is authoritative, the engine scans exactly what it names") predates #4315's runtime per-field type allowlist. Scope = align authoring-time validation with the runtime allowlist (declared = enforced, one shared source of truth).

  3. baozhoutao commented on Aug 3, 2026

    @baozhoutao
    ContributorAuthor

    Takeover: the 09:27 claim's session ended with no remote branch and no PR — presumed dead. This PM session (worktree objectstack-pm-dispatch-issues-8b2071) takes over the claim per maintainer's explicit dispatch instruction, reusing branch claude/issue-4830-searchablefields-type-validation. Dispatching now.

  4. added
    bugSomething isn't working
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Aug 3, 2026
  5. baozhoutao commented on Aug 3, 2026

    @baozhoutao
    ContributorAuthor

    已交付并经 PM 审查通过:PR #4844(draft,维护者已确认开 PR)。实现为 issue 方案 1:新增 error 级 lint 规则 searchable-field-unsearchable,视图级 narrowing 面复用运行时同一个 resolveSearchFieldResolution 判定(单一事实源,declared = enforced)。跨对象路径搜索缺口另拆 #4840。CI 绿后再报队。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions