portal-auth P4:最後一個 active admin 鎖死保護(停用/降級 → 409)
系統至少保留一個 active admin——bootstrap 只能跑一次(已有 admin 409), 若最後一個 admin 被停用/降級,帳號管理即永久鎖死。只在「目標是 active admin 且 patch 會使其失格」時多打一次 list(平時零成本)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -631,6 +631,21 @@ portalRouter.patch('/portal/admin/users/:id', (c) =>
|
||||
patch.libraries = JSON.stringify(body.libraries);
|
||||
}
|
||||
if (Object.keys(patch).length === 0) return c.json({ error: '沒有可更新的欄位(status/role/libraries)' }, 400);
|
||||
|
||||
// 鎖死保護(P4,總管派工明定):**不可停用/降級最後一個 active admin**——
|
||||
// 否則系統再無人能管帳號(bootstrap 只能跑一次,409),變成鎖死狀態。
|
||||
// 只在「目標現在是 active admin 且 patch 會使它不再是」時才多打一次 list(平時零成本)。
|
||||
const isActiveAdmin = (rec.values.role ?? '') === 'admin' && (rec.values.status ?? '') === 'active';
|
||||
const wouldLoseAdmin = patch.status === 'disabled' || patch.role === 'user';
|
||||
if (isActiveAdmin && wouldLoseAdmin) {
|
||||
const all = await listRecordsByTemplate(c.env, USER_TEMPLATE);
|
||||
const otherActiveAdmins = all.filter(
|
||||
(u) => u.record_id !== recordId && (u.values.role ?? '') === 'admin' && (u.values.status ?? '') === 'active',
|
||||
);
|
||||
if (otherActiveAdmins.length === 0) {
|
||||
return c.json({ error: '不可停用或降級最後一個管理員——系統至少要保留一個 active admin' }, 409);
|
||||
}
|
||||
}
|
||||
patch.updated_at = new Date().toISOString();
|
||||
|
||||
const updated = await patchRecordValues(c.env, recordId, patch);
|
||||
|
||||
Reference in New Issue
Block a user