feat(permissions): C-3 — пер-ролевые права кастомных ролей (резолвер + конфиг)
Миграция 056: снят CHECK с role_permissions.role (пересборка) → можно хранить набор прав произвольной кастомной роли. isEnabled(uid,permRole,baseRole,key): user override → role_permissions[customRole] → фолбэк role_permissions[base] → дефолт реестра(base). requirePermission передаёт permRole=customRole||role. getMyPermissions/getUserPermissions: roleMap = база + наложение кастомной роли. Тест C-3: права кастомной роли перекрывают базу, фолбэк на базу. custom-roles 8/8, permissions 17/17, backend без регрессий. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -84,3 +84,25 @@ describe('custom roles — назначение пользователю (C-2)',
|
||||
assert.equal(bad.status, 400);
|
||||
});
|
||||
});
|
||||
|
||||
describe('custom roles — пер-ролевые права (C-3)', () => {
|
||||
let adminToken, mUser;
|
||||
before(async () => {
|
||||
adminToken = (await getToken('admin')).token;
|
||||
db.prepare("INSERT OR IGNORE INTO roles (name,label,base_roles,is_builtin) VALUES ('methodist2','Методист 2',?,0)")
|
||||
.run(JSON.stringify(['teacher']));
|
||||
mUser = await getToken('student');
|
||||
db.prepare("UPDATE users SET role='teacher', custom_role='methodist2' WHERE id=?").run(mUser.userId);
|
||||
// кастомная роль ВКЛЮЧАЕТ questions.manage (у teacher по умолчанию 0)
|
||||
db.prepare("INSERT OR REPLACE INTO role_permissions (role,permission,enabled) VALUES ('methodist2','questions.manage',1)").run();
|
||||
});
|
||||
|
||||
it('права кастомной роли перекрывают базу; фолбэк на базу для прочих ключей', async () => {
|
||||
const view = await inject('GET', `/api/permissions/users/${mUser.userId}`, null, adminToken);
|
||||
assert.equal(view.status, 200, JSON.stringify(view.body));
|
||||
const qm = view.body.permissions.find(p => p.key === 'questions.manage');
|
||||
const cm = view.body.permissions.find(p => p.key === 'classes.manage');
|
||||
assert.equal(qm.effective, true, 'questions.manage включён кастомной ролью (база teacher=0)');
|
||||
assert.equal(cm.effective, true, 'classes.manage — по фолбэку базы teacher=1');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user