/** * src/config.js — общие константы и утилиты приложения. * * Вынесено из server.js чтобы: * 1. Роуты могли импортировать MOCK_USERS и backUrl без циклических зависимостей. * 2. Конфигурация была в одном месте — проще менять и тестировать. * * Этот файл не зависит ни от Express, ни от БД — чистые данные и функции. */ 'use strict'; // ── IAM API ─────────────────────────────────────────────────────────────────── // URL IAM-сервиса для получения профилей пользователя (GET /api/v1/auth/user) // и переключения активной компании (POST /api/v1/user/switch-profile). const IAM_API_URL = (process.env.IAM_API_URL || 'https://auth-api-dev.ngcloud.ru').replace(/\/$/, ''); // ── Мок-пользователи (только dev/staging) ───────────────────────────────────── // В продакшене этот список не используется — вход через Keycloak. // clientId соответствует WZ-номеру компании в Nubes. // companyId — UUID клиента (из Keycloak-токена в продакшене). const MOCK_USERS = [ { id: 'admin', label: 'АДМИН (WZ01112)', role: 'admin', isAdmin: true, clientId: 'WZ01112', companyId: 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee', companyName: 'Nubes', email: 'admin@nubes.ru', }, { id: 'alfa', label: 'АЛЬФА (WZ88888)', role: 'user', isAdmin: false, clientId: 'WZ88888', companyId: '11111111-aaaa-aaaa-aaaa-111111111111', companyName: 'АЛЬФА', email: 'alfa@example.com', }, { id: 'multi', label: 'АЛЬФА+БЕТА (WZ88888, WZ77777)', role: 'user', isAdmin: false, clientId: 'WZ88888, WZ77777', companyId: '11111111-aaaa-aaaa-aaaa-111111111111', companyName: 'АЛЬФА+БЕТА', email: 'multi@example.com', }, { id: 'beta', label: 'БЕТА (WZ77777)', role: 'user', isAdmin: false, clientId: 'WZ77777', companyId: '22222222-bbbb-bbbb-bbbb-222222222222', companyName: 'БЕТА', email: 'beta@example.com', }, ]; // ── backUrl — строит URL для редиректа после мутирующего действия ────────────── // // Логика: // • admin всегда видит страницу в контексте конкретной компании (?company=). // Поэтому после POST /add, /edit, /delete редиректим туда же. // • Обычный пользователь видит только свою страницу — просто /. // // extra — дополнительные query-параметры, например { message: 'Добавлено' } // или { error: 'Лимит исчерпан' }. // // Примеры: // backUrl(true, 42, { message: 'OK' }) → '/?company=42&message=OK' // backUrl(false, 42, { error: 'Err' }) → '/?error=Err' // backUrl(false, null, {}) → '/' function backUrl(isAdmin, companyId, extra = {}) { const qs = new URLSearchParams(); // Добавляем company только для admin и только если companyId задан if (isAdmin && companyId) qs.set('company', companyId); // Добавляем все дополнительные параметры (message, error, wasNormalized и др.) for (const [k, v] of Object.entries(extra)) qs.set(k, String(v)); const str = qs.toString(); return str ? '/?' + str : '/'; } // ── Версия приложения (из package.json) ────────────────────────────────────── // Читается один раз при загрузке модуля — require кешируется Node.js. // Передаётся в шаблоны через app.locals чтобы отображаться в UI. const { version: APP_VERSION } = require('../package.json'); module.exports = { MOCK_USERS, backUrl, APP_VERSION, IAM_API_URL };