feat(admin): сброс системы «чистый запуск» в веб-панели

Добавлено такое же действие, как [Z] в control-panel: POST /api/admin/reset-system
(+ /reset-system/plan для предпросмотра), только admin. Общая логика вынесена в
src/services/systemReset.js (classify/pickKeptAdmin/runReset) — реюзится CLI и эндпоинтом.

Веб-эндпоинт безопаснее CLI: сохраняет ТЕКУЩЕГО админа (оператор остаётся залогинен),
делает бэкап БД ДО сброса (wal_checkpoint + копия в data/backups/), требует body.confirm='СБРОС'.
UI — «Опасная зона» в overview-секции: предпросмотр плана + ввод «СБРОС» + результат с именем бэкапа.

db.js: добавлен db._path (нужен бэкапу при сбросе). Логика проверена смоуком на копии живой БД
(16 юзеров удалено, контент сохранён, REASSIGN на админа, гейм-счётчики обнулены, 0 висячих FK).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-23 11:45:13 +03:00
parent 205290139d
commit 22c7b38e9a
6 changed files with 353 additions and 140 deletions
+4
View File
@@ -13,6 +13,10 @@ router.patch('/free-student-features', requireRole('admin'), ctrl.updateF
/* Everything below is admin-only */
router.use(requireRole('admin'));
/* ⚠️ Сброс системы «чистый запуск» — деструктивно, только admin */
router.get('/reset-system/plan', requireRole('admin'), ctrl.getResetPlan);
router.post('/reset-system', requireRole('admin'), ctrl.resetSystem);
router.get('/assistant', ctrl.getAssistant);
router.put('/assistant', ctrl.saveAssistant);
router.post('/assistant/test', ctrl.testAssistant);