diff --git a/package.json b/package.json index 439c090..68a0475 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.5.110", + "version": "0.5.111", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/v2/server.js b/v2/server.js index f5213fe..fdb0f94 100644 --- a/v2/server.js +++ b/v2/server.js @@ -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')); diff --git a/v2/src/admin/index.js b/v2/src/admin/index.js index 6f26e07..65dbe91 100644 --- a/v2/src/admin/index.js +++ b/v2/src/admin/index.js @@ -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('
' + e.message + ''); } @@ -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('
' + e.message + ''); - } - }); - return router; } diff --git a/v2/src/config/index.js b/v2/src/config/index.js index a7dc3d7..a691ae8 100644 --- a/v2/src/config/index.js +++ b/v2/src/config/index.js @@ -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', diff --git a/views/v2/user.ejs b/views/v2/user.ejs index 11af65a..b428fe2 100644 --- a/views/v2/user.ejs +++ b/views/v2/user.ejs @@ -154,6 +154,7 @@ <% if (user.isAdmin) { %> Режим: Администратор + ⚙️ <% } %>