背景
メンバー管理 API が設計 SSOT から逸脱している。設計は §5.1 で /api/tenant/users/*(テナント暗黙・X-Tenant-Id 駆動)、§6.2.1 で SaaS Admin は当該 API に 403。実装は /api/tenants/{tenantId}/users/*(テナント明示)+hasAnyRole('APP_ADMIN','TENANT_ADMIN') で、X-Tenant-Id 不変則に反し(X-Tenant-Id == path tenantId の突き合わせが歪みの証拠)、SaaS Admin にメンバー管理権限を与えている。SaaS 画面(S-12/13/14)はメンバー管理を要しないため 403 が正。
スコープ(設計への是正)
- ロール変更: 実装
changeMemberRole(PATCH /api/tenants/{tenantId}/users/{userId})を A-10 設計へ是正 → PUT /api/tenant/users/{userId}/role、Tenant Admin 専用(APP_ADMIN 除去)。
- メンバー削除: 実装
removeMember を DELETE /api/tenant/users/{userId}・Tenant Admin 専用 にリパス(APP_ADMIN 除去)。membership ハード削除(Phase 2 の DISABLED 遷移とは別)。§5.1 に削除 endpoint を追記。
- 直接追加(
addMember, by userId): 廃止(招待 A-09 に一本化)。
- SaaS Admin アクセス: 全メンバー管理 API で 403(§6.2.1 準拠)。
- OpenAPI 整合: パス移動、
addTenantMember 削除、updateRole(A-10)を正式 operation 化、削除 op リパス。
- 設計書整合: §5.1(削除追記)/§6.2.1(整合確認)。招待のエラー契約是正は #(A-09) 側。
受け入れ条件
参照
設計書 §5.1 / §6.2.1 / 設計規約(X-Tenant-Id 不変則)
背景
メンバー管理 API が設計 SSOT から逸脱している。設計は §5.1 で
/api/tenant/users/*(テナント暗黙・X-Tenant-Id 駆動)、§6.2.1 で SaaS Admin は当該 API に 403。実装は/api/tenants/{tenantId}/users/*(テナント明示)+hasAnyRole('APP_ADMIN','TENANT_ADMIN')で、X-Tenant-Id 不変則に反し(X-Tenant-Id == path tenantIdの突き合わせが歪みの証拠)、SaaS Admin にメンバー管理権限を与えている。SaaS 画面(S-12/13/14)はメンバー管理を要しないため 403 が正。スコープ(設計への是正)
changeMemberRole(PATCH/api/tenants/{tenantId}/users/{userId})を A-10 設計へ是正 →PUT /api/tenant/users/{userId}/role、Tenant Admin 専用(APP_ADMIN 除去)。removeMemberをDELETE /api/tenant/users/{userId}・Tenant Admin 専用 にリパス(APP_ADMIN 除去)。membership ハード削除(Phase 2 の DISABLED 遷移とは別)。§5.1 に削除 endpoint を追記。addMember, by userId): 廃止(招待 A-09 に一本化)。addTenantMember削除、updateRole(A-10)を正式 operation 化、削除 op リパス。受け入れ条件
PUT /api/tenant/users/{userId}/role・Tenant Admin 専用に是正DELETE /api/tenant/users/{userId}・Tenant Admin 専用に是正addMember(直接追加)廃止参照
設計書 §5.1 / §6.2.1 / 設計規約(X-Tenant-Id 不変則)