const express = require('express'); const router = express.Router(); const { query } = require('../config/db'); // GET /api/stats — публичная статистика блога router.get('/', async (_, res) => { try { const { rows: countRow } = await query( `SELECT COUNT(*)::int as articles_count, COALESCE(SUM(LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1), 0)::int as total_words, COALESCE(SUM(reading_time), 0)::int as total_reading_min, COALESCE(SUM(views), 0)::int as total_views FROM articles WHERE status='published'` ); const { rows: jobsRow } = await query( `SELECT COALESCE(SUM(tokens_in), 0)::int as tokens_in, COALESCE(SUM(tokens_out), 0)::int as tokens_out, COUNT(*)::int as jobs_done FROM generation_jobs WHERE status='done' AND type='article'` ); const { rows: latestRow } = await query( `SELECT MAX(published_at) as latest FROM articles WHERE status='published'` ); res.json({ ...countRow[0], ...jobsRow[0], latest_published: latestRow[0]?.latest || null, }); } catch (err) { res.status(500).json({ error: err.message }); } }); // GET /api/stats/live — «прямо сейчас»: текущая активность и активность за 7 дней router.get('/live', async (_, res) => { try { // Последняя опубликованная статья const { rows: latestRow } = await query( `SELECT a.id, a.slug, a.title, a.published_at, j.tokens_in, j.tokens_out FROM articles a LEFT JOIN generation_jobs j ON j.id=a.job_id WHERE a.status='published' ORDER BY a.published_at DESC LIMIT 1` ); // Сейчас обрабатывается? const { rows: processing } = await query( `SELECT id, type, topic, created_at FROM generation_jobs WHERE status IN ('pending','processing') ORDER BY created_at DESC LIMIT 1` ); // Активность по дням за 7 дней const { rows: byDay } = await query( `SELECT DATE_TRUNC('day', published_at) as day, COUNT(*)::int as cnt FROM articles WHERE status='published' AND published_at > NOW() - INTERVAL '7 days' GROUP BY day ORDER BY day ASC` ); // Запоняем пропущенные дни нулями const week = []; for (let i = 6; i >= 0; i--) { const d = new Date(); d.setDate(d.getDate() - i); d.setHours(0, 0, 0, 0); const dayStr = d.toISOString().slice(0, 10); const found = byDay.find(r => r.day && new Date(r.day).toISOString().slice(0, 10) === dayStr); week.push({ day: dayStr, cnt: found ? found.cnt : 0 }); } res.json({ latest: latestRow[0] || null, processing: processing[0] || null, week, }); } catch (err) { res.status(500).json({ error: err.message }); } }); module.exports = router;