// ═══════════════════════════════════════════════════════════════════════════════ // V2 — Админка: лимиты и аудит (Express + EJS) // // ЭТО: Express-роутер для админа. // НЕ: доступно обычным юзерам (middleware: req.canAdmin). // // ШАБЛОНЫ: // views/v2/admin.ejs — компании + лимиты // views/v2/admin-audit.ejs — аудит // ═══════════════════════════════════════════════════════════════════════════════ const express = require('express'); const q = require('../db/queries'); const config = require('../config'); function createAdminRouter({ generateCsrfToken } = {}) { const router = express.Router(); router.use((req, res, next) => { if (!req.canAdmin) return res.redirect('/v2/app'); // user для шаблонов req.adminUser = { email: req.email, fio: (req.session && req.session.user && req.session.user.fio) || null, }; next(); }); // ── GET / — дашборд: компании + лимиты ───────────────────────────── router.get('/', async (req, res) => { try { const companies = await q.getAllCompanies(); res.render('v2/admin', { companies, user: req.adminUser, version: config.version, csrfToken: generateCsrfToken ? generateCsrfToken(req, res) : '', }); } catch (e) { res.status(500).send('
' + e.message + ''); } }); // ── GET /audit — журнал операций с пагинацией и фильтром по дате ─── router.get('/audit', async (req, res) => { try { const companyId = req.query.companyId ? parseInt(req.query.companyId) : null; // days=null → все записи (без фильтра по дате) const days = req.query.days ? Math.min(Math.max(parseInt(req.query.days), 1), 365) : null; const page = Math.max(parseInt(req.query.page) || 1, 1); const perPage = 100; const result = await q.getAudit({ companyId, days, page, limit: perPage }); const company = companyId ? await q.getCompanyById(companyId) : null; res.render('v2/admin-audit', { audit: result.rows, total: result.total, page, pages: Math.ceil(result.total / perPage) || 1, days, company, version: config.version, }); } catch (e) { res.status(500).send('
' + e.message + ''); } }); // ── POST /limit ───────────────────────────────────────────────────── router.post('/limit', async (req, res) => { try { const companyId = parseInt(req.body.companyId); const newLimit = parseInt(req.body.limit); if (!companyId || !newLimit || newLimit < 1) throw new Error('Неверные параметры'); await q.setLimit(companyId, newLimit); res.redirect('/v2/admin?msg=' + encodeURIComponent('Лимит установлен: ' + newLimit)); } catch (e) { res.redirect('/v2/admin?error=' + encodeURIComponent(e.message)); } }); return router; } module.exports = { createAdminRouter };