v2: роутер по роли + пустышки user/admin — resolveContext middleware
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
// V2 — админка (пустышка)
|
||||
// Будет: аудит, лимиты, список всех компаний, toggle «Администратор»
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
const express = require('express');
|
||||
|
||||
function createAdminRouter() {
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.send(`<h2>Admin panel</h2>
|
||||
<p>email: ${req.v2_email}</p>
|
||||
<p>clientId: ${req.v2_clientId}</p>
|
||||
<p>Все компании: ${(req.v2_allClientIds || []).join(', ') || '—'}</p>
|
||||
<p><a href="/v2/app">Пользовательский CRUD</a> | <a href="/v2/logout">Выйти</a></p>
|
||||
`);
|
||||
});
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
module.exports = { createAdminRouter };
|
||||
@@ -6,7 +6,7 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
module.exports = {
|
||||
version: '0.5.74',
|
||||
version: '0.5.75',
|
||||
iamUrl: process.env.V2_IAM_API_URL || 'https://auth-api.ngcloud.ru',
|
||||
appUrl: process.env.V2_APP_URL || 'https://whitelist.nodejsk8s.services.ngcloud.ru',
|
||||
};
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
// V2 — роутер по роли
|
||||
// Определяет контекст (admin/user/impersonation) и направляет куда нужно.
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* middleware — извлекает контекст из сессии и кладёт в req.v2_*
|
||||
* Вызывается перед всеми маршрутами v2.
|
||||
*/
|
||||
function resolveContext(req, res, next) {
|
||||
const u = req.session && req.session.v2_user;
|
||||
if (!u) return res.redirect('/v2/login');
|
||||
|
||||
const isAdmin = !!(u.isAdmin && req.session.v2_adminMode);
|
||||
const isImpersonated = !!u.isImpersonated;
|
||||
|
||||
// Контекст для CRUD
|
||||
req.v2_email = isImpersonated ? (u.originalUserEmail || u.email) : u.email;
|
||||
req.v2_clientId = isImpersonated ? (u.impersonatedCompanyId || u.activeClientId || u.clientId) : (u.activeClientId || u.clientId);
|
||||
req.v2_isAdmin = isAdmin;
|
||||
req.v2_isImpersonated = isImpersonated;
|
||||
req.v2_impersonatedBy = isImpersonated ? u.email : null; // кто реально (для аудита)
|
||||
req.v2_user = u;
|
||||
req.v2_allClientIds = u.allClientIds || [];
|
||||
req.v2_profiles = u.profiles || [];
|
||||
req.v2_companyName = u.companyName || u.clientId;
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
module.exports = { resolveContext };
|
||||
@@ -0,0 +1,24 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
// V2 — пользовательский CRUD (пустышка)
|
||||
// Будет: таблица записей, форма добавления, выбор компании из дропдауна
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
const express = require('express');
|
||||
|
||||
function createUserRouter() {
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.send(`<h2>User CRUD</h2>
|
||||
<p>email: ${req.v2_email}</p>
|
||||
<p>clientId: ${req.v2_clientId}</p>
|
||||
<p>isAdmin: ${req.v2_isAdmin}</p>
|
||||
<p>isImpersonated: ${req.v2_isImpersonated}</p>
|
||||
<p><a href="/v2/admin">Админка</a> | <a href="/v2/logout">Выйти</a></p>
|
||||
`);
|
||||
});
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
module.exports = { createUserRouter };
|
||||
Reference in New Issue
Block a user