// ═══════════════════════════════════════════════════════════════════════════════ // 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.isAdmin; const clId = req.clientId; // ── Переключение компании ────────────────────────────────────── if (req.query.switchTo) { const targetId = req.query.switchTo; if (isAdmin) { // Админ может переключиться на любую компанию req.session.user.activeClientId = targetId; req.session.save(() => res.redirect('/v2/app')); return; } else { // Юзер — только свои профили const allowed = (req.profiles || []).find(p => p.client_id === targetId); if (allowed) { req.session.user.activeClientId = targetId; req.session.save(() => res.redirect('/v2/app')); return; } } } // ── Компании для dropdown ─────────────────────────────────────── let companies; if (isAdmin) { const all = await q.getAllCompanies(); companies = all.map(c => ({ client_id: c.client_id, name: c.name || c.client_id, active_count: c.active_count, })); } 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 }]; } // ── Записи ────────────────────────────────────────────────────── 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('
' + e.message + 'Назад'); } }); // ── 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) => { try { await crud.remove(parseInt(req.params.id), req.clientId, req.email, req.impersonatedBy); res.redirect('/v2/app?msg=Удалено'); } catch (e) { res.redirect('/v2/app?error=' + encodeURIComponent(e.message)); } }); return router; } module.exports = { createUserRouter };