Files
ipwhitelist-app/v2/src/admin/index.js
T
naeel fc5aa7ca09 fix(audit): убрано ограничение по дате — по умолчанию ВСЕ записи
- getAudit(): days=null → без фильтра WHERE по дате
- days передаётся только если явно выбран фильтр 30/90/365
- admin-audit.ejs: кнопка «Всё» (активна по умолчанию), заголовок «(всё время)»

v0.1.9 → v0.1.10
2026-07-01 18:39:49 +04:00

79 lines
3.5 KiB
JavaScript

// ═══════════════════════════════════════════════════════════════════════════════
// 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('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
}
});
// ── 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('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
}
});
// ── 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 };