fix(admin): список сессий показывает и незавершённые (зависшие), +фильтр ?status
Корень бага «зависший тест есть в алерте, но нет в списке»: 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) <noreply@anthropic.com>
This commit is contained in:
@@ -295,13 +295,18 @@ function getUserSessions(req, res) {
|
|||||||
|
|
||||||
/* ── GET /api/admin/sessions ─────────────────────────────────────────── */
|
/* ── GET /api/admin/sessions ─────────────────────────────────────────── */
|
||||||
function getAllSessions(req, res) {
|
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 limit = Math.min(500, Math.max(1, Number(req.query.limit) || 200));
|
||||||
const offset = Math.max(0, Number(req.query.offset) || 0);
|
const offset = Math.max(0, Number(req.query.offset) || 0);
|
||||||
|
|
||||||
const where = ['ts.status = \'completed\''];
|
// По умолчанию показываем и завершённые, и НЕзавершённые (in_progress) — иначе зависшие
|
||||||
|
// сессии не находились в списке (см. алерт «Зависла»). Опционально сужаем по ?status=.
|
||||||
|
const where = [];
|
||||||
const params = [];
|
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 (subject) { where.push('s.slug = ?'); params.push(subject); }
|
||||||
if (user_id) { where.push('ts.user_id = ?'); params.push(Number(user_id)); }
|
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
|
FROM test_sessions ts
|
||||||
LEFT JOIN subjects s ON s.id = ts.subject_id
|
LEFT JOIN subjects s ON s.id = ts.subject_id
|
||||||
JOIN users u ON u.id = ts.user_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
|
ORDER BY ts.started_at DESC
|
||||||
LIMIT ? OFFSET ?
|
LIMIT ? OFFSET ?
|
||||||
`).all(...params);
|
`).all(...params);
|
||||||
|
|||||||
Reference in New Issue
Block a user