v0.5.111: админка — лимиты и аудит (/v2/admin), кнопка ⚙️

This commit is contained in:
2026-06-15 14:24:20 +04:00
parent 6bff095a67
commit 8fe89f3a0a
5 changed files with 19 additions and 28 deletions
+3 -2
View File
@@ -28,6 +28,7 @@ const auth = require('./src/auth');
const { resolveContext } = require('./src/router');
const { enhanceImpersonation } = require('./src/impersonation');
const { createUserRouter } = require('./src/user');
const { createAdminRouter } = require('./src/admin');
const { pool } = require('./src/db');
const { ensureSchema } = require('./src/db/schema');
@@ -52,8 +53,8 @@ function createV2Router() {
// ── /v2/app — пользовательский CRUD (только с сессией) ──────────────
router.use('/app', enhanceImpersonation, resolveContext, createUserRouter());
// ── /v2/admin — редирект на единый интерфейс ───────────────────
router.get('/admin', (req, res) => res.redirect('/v2/app'));
// ── /v2/admin — админка: лимиты + аудит ──────────────────────────
router.use('/admin', enhanceImpersonation, resolveContext, createAdminRouter());
// ── GET /v2/ — редирект на /v2/app ──────────────────────────────────
router.get('/', (req, res) => res.redirect('/v2/app'));
+13 -24
View File
@@ -1,33 +1,36 @@
// ═══════════════════════════════════════════════════════════════════════════════
// V2 — Админка (Express + EJS)
// V2 — Админка: лимиты и аудит (Express + EJS)
//
// ЭТО: Express-роутер для админа, рендерит EJS-шаблоны.
// НЕ: доступно обычным юзерам (middleware: req.isAdmin).
// ЭТО: Express-роутер для админа.
// НЕ: доступно обычным юзерам (middleware: req.canAdmin).
//
// ШАБЛОНЫ:
// views/v2/admin.ejs — дашборд (companies, user, version)
// views/v2/admin-audit.ejs — аудит (audit, company, version)
// views/v2/admin-entries.ejs — записи (entries, company, used, limit, ...)
// views/v2/admin.ejs — компании + лимиты
// views/v2/admin-audit.ejs — аудит
// ═══════════════════════════════════════════════════════════════════════════════
const express = require('express');
const q = require('../db/queries');
const crud = require('../crud');
const config = require('../config');
function createAdminRouter() {
const router = express.Router();
router.use((req, res, next) => {
if (!req.isAdmin) return res.redirect('/v2/app');
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 / — дашборд ─────────────────────────────────────────────────
// ── GET / — дашборд: компании + лимиты ─────────────────────────────
router.get('/', async (req, res) => {
try {
const companies = await q.getAllCompanies();
res.render('v2/admin', { companies, user: req.user || {}, version: config.version });
res.render('v2/admin', { companies, user: req.adminUser, version: config.version });
} catch (e) {
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
}
@@ -58,20 +61,6 @@ function createAdminRouter() {
}
});
// ── GET /entries ────────────────────────────────────────────────────
router.get('/entries', async (req, res) => {
try {
const companyId = parseInt(req.query.companyId);
const company = companyId ? await q.getCompanyById(companyId) : null;
if (!company) return res.redirect('/v2/admin');
const includeDeleted = req.query.deleted === '1';
const { entries, used, limit } = await crud.list(company.client_id, includeDeleted);
res.render('v2/admin-entries', { entries, company, used, limit, includeDeleted, version: config.version });
} catch (e) {
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
}
});
return router;
}
+1 -1
View File
@@ -9,7 +9,7 @@
// ═══════════════════════════════════════════════════════════════════════════════
module.exports = {
version: '0.5.110',
version: '0.5.111',
// ── IAM ──────────────────────────────────────────────────────────────────
iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user',