/
Krams
/
nodemon2
Обзор
Документация
Войти
/
Krams
/
nodemon2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/services/AnalyzerService.js
88 строк
3 KB
Иван Новиков
final
25 май 2026, 17:46
25 май 2026, 17:46
2c76ffd
Код
Авторство
О чём код?
import db from '../database.js'; import { safeJsonParse } from './DebugDump.js'; import { analyzeNodeSnapshots } from './AnalyzerEngine.js'; function nowSec() { return Math.floor(Date.now() / 1000); } function normalizeIds(value) { const ids = Array.isArray(value) ? value : []; return [...new Set( ids .map((v) => Number.parseInt(v, 10)) .filter((n) => Number.isFinite(n) && n > 0) )]; } export async function getAnalyzerSnapshots(options = {}) { const nodeIds = normalizeIds(options.nodeIds); const limitRaw = Number.parseInt(options.limit, 10); const safeLimit = Number.isFinite(limitRaw) ? Math.min(5000, Math.max(1, limitRaw)) : 5000; const where = nodeIds.length > 0 ? `WHERE n.id IN (${nodeIds.map(() => '?').join(', ')})` : ''; const params = nodeIds.length > 0 ? nodeIds : []; const sql = ` SELECT n.id AS node_id, n.name AS node_name, COALESCE(n.monitoring_enabled, 1) AS monitoring_enabled, COALESCE(n.state_manual, 0) AS state_manual, n.state AS current_state, n.system_comment AS current_system_comment, ns.json_data AS status_json, ns.updated_at AS node_status_updated_at FROM node n LEFT JOIN node_status ns ON ns.node_id = n.id ${where} ORDER BY n.id ASC LIMIT ? `; return new Promise((resolve, reject) => { db.all(sql, [...params, safeLimit], (err, rows) => { if (err) return reject(err); const snapshots = (rows || []).map((row) => { let status = {}; try { if (typeof row?.status_json === 'string' && row.status_json.trim()) { status = safeJsonParse(`analyzer_snapshot_${row.node_id}`, row.status_json) || {}; } } catch { status = {}; } if (String(status?.reason || '').trim() === 'SCC_SYSTEM') { return null; } return { node_id: Number(row.node_id), node_name: String(row.node_name || '').trim(), monitoring_enabled: Number(row.monitoring_enabled) !== 0 ? 1 : 0, state_manual: Number(row.state_manual) === 1 ? 1 : 0, current_state: row.current_state ? String(row.current_state) : null, current_system_comment: row.current_system_comment ? String(row.current_system_comment) : null, node_status_updated_at: row.node_status_updated_at ? Number(row.node_status_updated_at) : null, status, }; }).filter(Boolean); resolve(snapshots); }); }); } export async function runAnalyzerOnce(options = {}) { const freshnessWindowSec = Number(options.freshnessWindowSec) || 120; const snapshots = await getAnalyzerSnapshots({ nodeIds: options.nodeIds, limit: options.limit, }); const results = analyzeNodeSnapshots(snapshots, { freshnessWindowSec }); return { computed_at: nowSec(), node_count: snapshots.length, results, }; }