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_unitCRUD#3392 已放开
sys_business_unit_memberCRUD本 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

vercelBot commented Jul 21, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specBuildingBuildingPreview, CommentJul 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-sysforce-pushed the claude/charming-rosalind-231d99 branch from f56cc59 to 0f9d607CompareJuly 21, 2026 15:55
@github-actionsgithub-actionsBot 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 mainJul 21, 2026
14 checks passed
@os-zhuang
os-zhuang deleted the claude/charming-rosalind-231d99 branch July 21, 2026 16:04
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/steststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang