Skip to content

fix(platform-objects): allow import/export on sys_business_unit_member (#3025 / #3391 P0)#3394

Merged
os-zhuang merged 1 commit into
mainfrom
claude/charming-rosalind-231d99
Jul 21, 2026
Merged

fix(platform-objects): allow import/export on sys_business_unit_member (#3025 / #3391 P0)#3394
os-zhuang merged 1 commit into
mainfrom
claude/charming-rosalind-231d99

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

背景

延续 #3025 / PR #3392#3392sys_business_unit 补上了 enable.apiMethods 白名单里的 'import'/'export',解掉了业务单元列表页 Import/Export 按钮的 405(OBJECT_API_METHOD_NOT_ALLOWED)。但 HRIS 组织树同步的完整场景是「单元表 + 成员表」两张一起批量导入——sys_business_unit_member 仍停在 CRUD-only 白名单上,成员导入/导出路径照样 405。#3391 的 P0 清单本就把两张表配对,本 PR 补上 #3392 漏掉的那一半。

改动

  • packages/platform-objects/src/identity/sys-business-unit-member.object.ts:104apiMethods 追加 'import', 'export'。导入复用对象已授予的 create/update affordance,导出是批量读。
  • 回归测试(platform-objects.test.ts):锁死 import/export 存在 + 保留 CRUD 五件套。已防假绿:回退对象改动后测试如实变红(expected [...] to include 'import')。
  • Reconcile 安全:该对象 managedBy:'platform',但 reconcileManagedApiMethods 只剥通用写动词(create/update/upsert/delete/purgeMANAGED_WRITE_VERB_AFFORDANCE);import/export 不在其中,永不被剥离,声明的白名单原样到达 REST gate(apiAccessDenialFromEnable),故静态测试断言即运行时行为,无假绿。

过渡态

#3391 P2,per-object 的 import/export 显式声明将被一张派生映射表替代(import ⊆ create/update、export ⊆ list),届时两张业务单元对象的显式条目一起回收。测试与对象注释均已写明此过渡语义,防止后续被当样板回退。

验证

  • pnpm -C packages/platform-objects exec vitest run → 214/214 全过。
  • tsc --noEmit → 0 错。

附:全仓「显式 apiMethods 白名单」对象盘点(#3026 §4 缺口盘点)

扫描 packages/**(cloud/ 在本仓无 apiMethods 声明;objectui 为独立仓,其 ImportWizard 405 兜底已由 #3391 P0 objectui 项跟踪)。判据:import ≈ 批量 create/upsert,export ≈ 批量 read;区分无意缺口(补)vs 刻意限制(留,通常带注释/测试锁死)。

✅ 本 PR 放开(无意缺口,#3391 P0 已授权)

对象 原白名单 处置
sys_business_unit CRUD #3392 已放开
sys_business_unit_member CRUD 本 PR 放开

⏸ 全 CRUD 但不宜现在显式加——等 #3391 P1/P2 派生契约统一处理

sys_user_positionsys_user_permission_setsys_position_permission_setsys_positionsys_capabilitysys_permission_set(RBAC 配置/授权)、sys_approval_delegationsys_user_preferencesys_view_definition(元数据走 metadata protocol)。

理由:#3391 已定稿契约明确「显式声明模式全仓 60+ 对象 100% 遗漏」,长期方案是派生而非继续堆显式声明;逐个加只会增加 #3391 P2 待回收的过渡债。#3025 开发计划把 sys_permission_set 用作反例控制项(必须继续 405)——现在给 RBAC 对象加 import/export 会与该反例冲突。这些留给 P1 派生表统一放开更稳。

🔒 刻意限制 / 天然不该导入——保持封死

  • 完全封死 apiMethods: []:sys_jwkssys_oauth_resourcesys_oauth_client_resourcesys_oauth_access_tokensys_oauth_consentsys_oauth_client_assertionsys_oauth_refresh_token(OAuth/密钥/令牌内部件)。
  • 凭据/认证敏感:sys_api_keysys_two_factorsys_secretsys_device_codesys_verificationsys_accountsys_sessionsys_scim_providersys_sso_provider
  • 身份走认证/邀请流:sys_user(get,list,update——创建/删除走邀请+auth,另有专用批量用户导入流 批量导入用户:默认走 invite,temporary(临时密码)降级为不可投递行的兜底 #3236,不走通用 data import)、sys_membersys_organizationsys_invitation
  • 运行时/作业记录:sys_jobsys_job_runsys_job_queuesys_automation_runsys_import_job(有 ADR-0103 引擎自持锁死注释,导入「导入作业」本身无意义)。
  • 审计/日志(只读):sys_emailsys_notificationsys_settingsys_setting_auditsys_audit_logsys_activitysys_metadata*
  • 消息 outbox:notification_receiptnotification_deliveryhttp_delivery
  • 其它运行时:sys_presencesys_record_sharesys_share_linksys_approval_request/approver/token/actionsys_audience_binding_suggestionsys_teamsys_team_member
  • OAuth 应用 sys_oauth_application:刻意锁死(注释 + platform-objects.test.ts 断言 not.toContain('create'/'update'/'delete'),所有写经 better-auth 包装器)。

通用「UI 按钮 ↔ apiMethods 前后端一致性」设计问题已有独立 issue #3391(契约 #3026)跟踪,本 PR 不撞车、只做具体对象白名单补齐。

Refs #3025, #3391.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jul 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Building Building Preview, Comment Jul 21, 2026 3:53pm

Request Review

#3025 / #3391 P0)

Completes the #3025 point-fix. #3392 added import/export to sys_business_unit
but left the sibling membership table on a CRUD-only whitelist, so the HRIS
org-tree sync scenario (units + memberships imported together) still 405'd on
the membership import/export path. #3391's P0 checklist pairs both tables; this
is the half #3392 missed.

- sys_business_unit_member enable.apiMethods gains 'import','export'.
- Reconcile-safe: import/export are not in MANAGED_WRITE_VERB_AFFORDANCE, so
  reconcileManagedApiMethods (managedBy:'platform') never strips them — the
  declared whitelist reaches apiAccessDenialFromEnable intact.
- Regression test locks import/export + CRUD, proven red-before-green.

Transitional per #3391 P2 (derived import/export mapping reclaims both objects).

Refs #3025, #3391.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@xuyushun441-sys
xuyushun441-sys force-pushed the claude/charming-rosalind-231d99 branch from f56cc59 to 0f9d607 Compare July 21, 2026 15:55
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tests tooling labels Jul 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/platform-objects.

2 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/plugins/packages.mdx (via @objectstack/platform-objects)
  • content/docs/ui/setup-app.mdx (via @objectstack/platform-objects)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang merged commit d10c4dc into main Jul 21, 2026
14 checks passed
@os-zhuang
os-zhuang deleted the claude/charming-rosalind-231d99 branch July 21, 2026 16:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant