141 lines
6.8 KiB
JavaScript
141 lines
6.8 KiB
JavaScript
// ═══════════════════════════════════════════════════════════════════════════════
|
|
// V2 — Единый фронтенд (Express + EJS) — юзеры и админы
|
|
//
|
|
// ЭТО: Express-роутер, рендерит EJS-шаблон views/v2/user.ejs.
|
|
// НЕ: работа с БД (только через crud/).
|
|
//
|
|
// ОДИН ИНТЕРФЕЙС для юзеров и админов:
|
|
// - Юзер: dropdown = свои профили из IAM, CRUD внутри выбранной компании.
|
|
// - Админ: dropdown = все компании из БД, CRUD внутри выбранной.
|
|
// - По умолчанию: активный профиль (is_active_profile=true).
|
|
//
|
|
// ПЕРЕКЛЮЧЕНИЕ КОМПАНИИ: ?switchTo=W*** → обновляет activeClientId в сессии.
|
|
// - Юзер: только свои профили.
|
|
// - Админ: любая компания.
|
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
const express = require('express');
|
|
const crud = require('../crud');
|
|
const q = require('../db/queries');
|
|
const config = require('../config');
|
|
|
|
function createUserRouter() {
|
|
const router = express.Router();
|
|
|
|
// ── GET / — список записей + форма ──────────────────────────────────
|
|
router.get('/', async (req, res) => {
|
|
try {
|
|
const isAdmin = req.canAdmin;
|
|
let clId = req.clientId;
|
|
|
|
// ── Компании для dropdown ───────────────────────────────────────
|
|
let companies;
|
|
if (isAdmin) {
|
|
const all = await q.getAllCompanies();
|
|
const ownIds = new Set(req.allClientIds || []);
|
|
companies = all.map(c => ({
|
|
client_id: c.client_id,
|
|
name: c.name || c.client_id,
|
|
active_count: c.active_count,
|
|
isPersonal: ownIds.has(c.client_id),
|
|
}));
|
|
} else {
|
|
companies = (req.profiles && req.profiles.length > 0)
|
|
? req.profiles.map(p => ({
|
|
client_id: p.client_id,
|
|
name: p.company_name || p.client_id,
|
|
is_active: p.is_active_profile,
|
|
}))
|
|
: [{ client_id: clId, name: req.companyName || clId, is_active: true }];
|
|
}
|
|
|
|
// ── Переключение компании (до crud.list — не грузить зря) ────
|
|
let switchDebug = null;
|
|
if (req.query.switchTo) {
|
|
const targetId = req.query.switchTo;
|
|
const allowed = isAdmin || (req.profiles || []).find(p => p.client_id === targetId);
|
|
if (allowed) {
|
|
req.session.user.activeClientId = targetId;
|
|
clId = targetId;
|
|
}
|
|
}
|
|
|
|
// ── Записи ──────────────────────────────────────────────────────
|
|
const includeDeleted = req.query.deleted === '1';
|
|
const { entries, used, limit } = await crud.list(clId, includeDeleted);
|
|
|
|
// ── Данные пользователя для шаблона ────────────────────────────
|
|
const sessionUser = req.session && req.session.user ? req.session.user : {};
|
|
const templateUser = {
|
|
email: req.email,
|
|
fio: sessionUser.fio || null,
|
|
isAdmin: req.canAdmin || false,
|
|
adminMode: isAdmin,
|
|
isImpersonated: req.isImpersonated || false,
|
|
originalUserEmail: sessionUser.originalUserEmail || '',
|
|
originalUserFullName: sessionUser.originalUserFullName || '',
|
|
originalUserCompany: sessionUser.originalUserCompany || '',
|
|
};
|
|
|
|
res.render('v2/user', {
|
|
entries, limit, used,
|
|
companies,
|
|
activeClientId: clId,
|
|
user: templateUser,
|
|
includeDeleted,
|
|
version: config.version,
|
|
});
|
|
} catch (e) {
|
|
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre><a href="/v2/app">Назад</a>');
|
|
}
|
|
});
|
|
|
|
// ── POST /add ───────────────────────────────────────────────────────
|
|
router.post('/add', async (req, res) => {
|
|
try {
|
|
const result = await crud.add(req.clientId, req.body.cidr || '', req.body.comment || '', req.email, req.impersonatedBy);
|
|
const msg = result.wasNormalized ? 'Добавлено (адрес нормализован)' : 'Добавлено';
|
|
res.redirect('/v2/app?msg=' + encodeURIComponent(msg));
|
|
} catch (e) {
|
|
res.redirect('/v2/app?error=' + encodeURIComponent(e.message));
|
|
}
|
|
});
|
|
|
|
// ── POST /edit/:id ──────────────────────────────────────────────────
|
|
router.post('/edit/:id', async (req, res) => {
|
|
try {
|
|
const result = await crud.edit(parseInt(req.params.id), req.clientId, req.body.cidr || '', req.body.comment || '', req.email, req.impersonatedBy);
|
|
const msg = result.wasNormalized ? 'Изменено (адрес нормализован)' : 'Изменено';
|
|
res.redirect('/v2/app?msg=' + encodeURIComponent(msg));
|
|
} catch (e) {
|
|
res.redirect('/v2/app?error=' + encodeURIComponent(e.message));
|
|
}
|
|
});
|
|
|
|
// ── POST /delete/:id ────────────────────────────────────────────────
|
|
router.post('/delete/:id', async (req, res) => {
|
|
const qs = (req.body && req.body.deleted === '1') ? '&deleted=1' : '';
|
|
try {
|
|
await crud.remove(parseInt(req.params.id), req.clientId, req.email, req.impersonatedBy);
|
|
res.redirect('/v2/app?msg=Удалено' + qs);
|
|
} catch (e) {
|
|
res.redirect('/v2/app?error=' + encodeURIComponent(e.message) + qs);
|
|
}
|
|
});
|
|
|
|
// ── POST /restore/:id ──────────────────────────────────────────────
|
|
router.post('/restore/:id', async (req, res) => {
|
|
const qs = (req.body && req.body.deleted === '1') ? '&deleted=1' : '';
|
|
try {
|
|
await crud.restore(parseInt(req.params.id), req.clientId, req.email, req.impersonatedBy);
|
|
res.redirect('/v2/app?msg=Восстановлено' + qs);
|
|
} catch (e) {
|
|
res.redirect('/v2/app?error=' + encodeURIComponent(e.message) + qs);
|
|
}
|
|
});
|
|
|
|
return router;
|
|
}
|
|
|
|
module.exports = { createUserRouter };
|