v0.5.111: админка — лимиты и аудит (/v2/admin), кнопка ⚙️
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ipwhitelist",
|
"name": "ipwhitelist",
|
||||||
"version": "0.5.110",
|
"version": "0.5.111",
|
||||||
"description": "IP WhiteList microservice for cloud provider",
|
"description": "IP WhiteList microservice for cloud provider",
|
||||||
"main": "server.js",
|
"main": "server.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
+3
-2
@@ -28,6 +28,7 @@ const auth = require('./src/auth');
|
|||||||
const { resolveContext } = require('./src/router');
|
const { resolveContext } = require('./src/router');
|
||||||
const { enhanceImpersonation } = require('./src/impersonation');
|
const { enhanceImpersonation } = require('./src/impersonation');
|
||||||
const { createUserRouter } = require('./src/user');
|
const { createUserRouter } = require('./src/user');
|
||||||
|
const { createAdminRouter } = require('./src/admin');
|
||||||
const { pool } = require('./src/db');
|
const { pool } = require('./src/db');
|
||||||
const { ensureSchema } = require('./src/db/schema');
|
const { ensureSchema } = require('./src/db/schema');
|
||||||
|
|
||||||
@@ -52,8 +53,8 @@ function createV2Router() {
|
|||||||
// ── /v2/app — пользовательский CRUD (только с сессией) ──────────────
|
// ── /v2/app — пользовательский CRUD (только с сессией) ──────────────
|
||||||
router.use('/app', enhanceImpersonation, resolveContext, createUserRouter());
|
router.use('/app', enhanceImpersonation, resolveContext, createUserRouter());
|
||||||
|
|
||||||
// ── /v2/admin — редирект на единый интерфейс ───────────────────
|
// ── /v2/admin — админка: лимиты + аудит ──────────────────────────
|
||||||
router.get('/admin', (req, res) => res.redirect('/v2/app'));
|
router.use('/admin', enhanceImpersonation, resolveContext, createAdminRouter());
|
||||||
|
|
||||||
// ── GET /v2/ — редирект на /v2/app ──────────────────────────────────
|
// ── GET /v2/ — редирект на /v2/app ──────────────────────────────────
|
||||||
router.get('/', (req, res) => res.redirect('/v2/app'));
|
router.get('/', (req, res) => res.redirect('/v2/app'));
|
||||||
|
|||||||
+13
-24
@@ -1,33 +1,36 @@
|
|||||||
// ═══════════════════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════════════════
|
||||||
// V2 — Админка (Express + EJS)
|
// V2 — Админка: лимиты и аудит (Express + EJS)
|
||||||
//
|
//
|
||||||
// ЭТО: Express-роутер для админа, рендерит EJS-шаблоны.
|
// ЭТО: Express-роутер для админа.
|
||||||
// НЕ: доступно обычным юзерам (middleware: req.isAdmin).
|
// НЕ: доступно обычным юзерам (middleware: req.canAdmin).
|
||||||
//
|
//
|
||||||
// ШАБЛОНЫ:
|
// ШАБЛОНЫ:
|
||||||
// views/v2/admin.ejs — дашборд (companies, user, version)
|
// views/v2/admin.ejs — компании + лимиты
|
||||||
// views/v2/admin-audit.ejs — аудит (audit, company, version)
|
// views/v2/admin-audit.ejs — аудит
|
||||||
// views/v2/admin-entries.ejs — записи (entries, company, used, limit, ...)
|
|
||||||
// ═══════════════════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const q = require('../db/queries');
|
const q = require('../db/queries');
|
||||||
const crud = require('../crud');
|
|
||||||
const config = require('../config');
|
const config = require('../config');
|
||||||
|
|
||||||
function createAdminRouter() {
|
function createAdminRouter() {
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
router.use((req, res, next) => {
|
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();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── GET / — дашборд ─────────────────────────────────────────────────
|
// ── GET / — дашборд: компании + лимиты ─────────────────────────────
|
||||||
router.get('/', async (req, res) => {
|
router.get('/', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const companies = await q.getAllCompanies();
|
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) {
|
} catch (e) {
|
||||||
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
|
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;
|
return router;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
// ═══════════════════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
version: '0.5.110',
|
version: '0.5.111',
|
||||||
|
|
||||||
// ── IAM ──────────────────────────────────────────────────────────────────
|
// ── IAM ──────────────────────────────────────────────────────────────────
|
||||||
iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user',
|
iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user',
|
||||||
|
|||||||
@@ -154,6 +154,7 @@
|
|||||||
</label>
|
</label>
|
||||||
<% if (user.isAdmin) { %>
|
<% if (user.isAdmin) { %>
|
||||||
<span style="margin-left:auto;font-size:.8rem;color:var(--amber);">Режим: Администратор</span>
|
<span style="margin-left:auto;font-size:.8rem;color:var(--amber);">Режим: Администратор</span>
|
||||||
|
<a href="/v2/admin" class="btn btn-sm" title="Лимиты и аудит">⚙️</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user