fix: три бага — CSRF в админке, пагинация аудита, скрыта кнопка выхода
1. Изменение лимитов (Баг 1): добавлен CSRF-токен в форму /v2/admin/limit
- v2/src/admin/index.js: createAdminRouter принимает {generateCsrfToken},
передаёт csrfToken в шаблон admin.ejs
- views/v2/admin.ejs: скрытое поле <input name=_csrf> в форме лимита
2. Журнал операций (Баг 2): пагинация + фильтр по дате вместо хардкод LIMIT 500
- v2/src/db/queries.js: getAudit({companyId,days,page,limit}) —
COUNT(*) OVER() для пагинации, WHERE created_at > NOW() - INTERVAL
- v2/src/admin/index.js: чтение days/page из query string, limit=100
- views/v2/admin-audit.ejs: фильтр 30/90/365 дней, prev/next пагинация
3. Кнопка Выйти (Баг 3): скрыта, т.к. /v2/logout не разлогинивает из Keycloak
- views/v2/user.ejs: кнопка закомментирована с пояснением
v0.1.8 → v0.1.9
This commit is contained in:
+15
-5
@@ -13,7 +13,7 @@ const express = require('express');
|
||||
const q = require('../db/queries');
|
||||
const config = require('../config');
|
||||
|
||||
function createAdminRouter() {
|
||||
function createAdminRouter({ generateCsrfToken } = {}) {
|
||||
const router = express.Router();
|
||||
|
||||
router.use((req, res, next) => {
|
||||
@@ -30,19 +30,29 @@ function createAdminRouter() {
|
||||
router.get('/', async (req, res) => {
|
||||
try {
|
||||
const companies = await q.getAllCompanies();
|
||||
res.render('v2/admin', { companies, user: req.adminUser, version: config.version });
|
||||
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 ──────────────────────────────────────────────────────
|
||||
// ── GET /audit — журнал операций с пагинацией и фильтром по дате ───
|
||||
router.get('/audit', async (req, res) => {
|
||||
try {
|
||||
const companyId = req.query.companyId ? parseInt(req.query.companyId) : null;
|
||||
const audit = await q.getAudit(companyId);
|
||||
const days = Math.min(Math.max(parseInt(req.query.days) || 365, 1), 365);
|
||||
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, company, version: config.version });
|
||||
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>');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user