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:
Maxim Dolgolyov
2026-06-03 14:14:56 +03:00
parent 1b78f675f8
commit 7d474b40c0
5 changed files with 71 additions and 3 deletions
+13
View File
@@ -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, 'не-админу недоступно');
});
});