From 1649d6c2ec6a5cd7d7083dec70dab5f802ba702c Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Tue, 23 Jun 2026 20:14:56 +0300 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE?= =?UTF-8?q?=D0=BA=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B9=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D1=91=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20(=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D1=88?= =?UTF-8?q?=D0=B8=D0=B5),=20+=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=3Fsta?= =?UTF-8?q?tus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Корень бага «зависший тест есть в алерте, но нет в списке»: getAllSessions жёстко фильтровал WHERE status='completed' → in_progress (зависшие) сессии в списке /admin#sessions не появлялись. Теперь по умолчанию показываются все статусы (UI sessions.js уже null-safe: percent/score/duration рисуются как «—»), плюс опциональный ?status=completed|in_progress|abandoned для сужения. Зависшая сессия теперь находится и в списке, и открывается по deep-link из алерта. admin-sessions.test.js 4/4; node --check OK. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/controllers/adminController.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/src/controllers/adminController.js b/backend/src/controllers/adminController.js index 8df3ff9..30cad04 100644 --- a/backend/src/controllers/adminController.js +++ b/backend/src/controllers/adminController.js @@ -295,13 +295,18 @@ function getUserSessions(req, res) { /* ── GET /api/admin/sessions ─────────────────────────────────────────── */ function getAllSessions(req, res) { - const { subject, user_id } = req.query; + const { subject, user_id, status } = req.query; const limit = Math.min(500, Math.max(1, Number(req.query.limit) || 200)); const offset = Math.max(0, Number(req.query.offset) || 0); - const where = ['ts.status = \'completed\'']; + // По умолчанию показываем и завершённые, и НЕзавершённые (in_progress) — иначе зависшие + // сессии не находились в списке (см. алерт «Зависла»). Опционально сужаем по ?status=. + const where = []; const params = []; + if (status && ['completed', 'in_progress', 'abandoned'].includes(status)) { + where.push('ts.status = ?'); params.push(status); + } if (subject) { where.push('s.slug = ?'); params.push(subject); } if (user_id) { where.push('ts.user_id = ?'); params.push(Number(user_id)); } @@ -317,7 +322,7 @@ function getAllSessions(req, res) { FROM test_sessions ts LEFT JOIN subjects s ON s.id = ts.subject_id JOIN users u ON u.id = ts.user_id - WHERE ${where.join(' AND ')} + ${where.length ? 'WHERE ' + where.join(' AND ') : ''} ORDER BY ts.started_at DESC LIMIT ? OFFSET ? `).all(...params);