feat(permissions): A3 — история изменений прав (endpoint + UI)
GET /api/permissions/log (admin-only) — последние изменения ролевых прав (или ?user_id= для личных оверрайдов) из admin_audit_log; читаемый текст («включил «X» для роли «учитель»») с резолвом меток через registry. Клиент LS.permissionsLog. Вкладка «Доступ · роли»: блок «История изменений прав ролей» с кнопкой «Показать». Тест: admin видит записи, не-админу 403. permissions 13/13. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -191,4 +191,17 @@ describe('Permissions', () => {
|
||||
await inject('POST', '/api/permissions',
|
||||
{ role: 'student', permission: 'simulations.access', enabled: true }, adminToken);
|
||||
});
|
||||
|
||||
// ── 11. A3: история изменений прав ─────────────────────────────────────────
|
||||
it('GET /api/permissions/log — история (admin видит записи; не-админу 403)', async () => {
|
||||
await inject('POST', '/api/permissions',
|
||||
{ role: 'teacher', permission: 'shop.manage', enabled: true }, adminToken);
|
||||
const log = await inject('GET', '/api/permissions/log', null, adminToken);
|
||||
assert.equal(log.status, 200);
|
||||
assert.ok(Array.isArray(log.body) && log.body.length >= 1, 'есть записи истории');
|
||||
assert.ok('text' in log.body[0] && 'actor' in log.body[0], 'формат записи');
|
||||
const fresh = await getToken('student');
|
||||
const denied = await inject('GET', '/api/permissions/log', null, fresh.token);
|
||||
assert.equal(denied.status, 403, 'не-админу недоступно');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user