v2: export слой — GET /v2/export, агрегация CIDR
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
module.exports = {
|
||||
version: '0.5.95',
|
||||
version: '0.5.96',
|
||||
|
||||
// ── IAM ──────────────────────────────────────────────────────────────────
|
||||
iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user',
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
// V2 — Экспорт CIDR (отдельный слой)
|
||||
//
|
||||
// ЭТО: выгрузка разрешённых CIDR в текстовом виде.
|
||||
// НЕ: CRUD, валидация (использует db + validators).
|
||||
//
|
||||
// ЗАЧЕМ:
|
||||
// 1. Отдать CIDR для firewall/nginx белого списка.
|
||||
// 2. Агрегировать соседние CIDR в минимальный набор (экономия правил).
|
||||
// 3. Поддержка фильтрации по компании (?companyId=X).
|
||||
//
|
||||
// ЦЕПОЧКА: GET /v2/export → q.getExportCIDRs → aggregateCIDRs → text/plain
|
||||
//
|
||||
// ПАРАМЕТРЫ:
|
||||
// ?companyId=X — фильтр по компании (внутренний id)
|
||||
// ?view=1 — показать в браузере (иначе — скачивание)
|
||||
// ?filename=X — имя файла (по умолчанию white-list.txt)
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
const express = require('express');
|
||||
const q = require('../db/queries');
|
||||
const { aggregateCIDRs } = require('../validators');
|
||||
|
||||
function createExportRouter() {
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', async (req, res) => {
|
||||
try {
|
||||
const companyId = req.query.companyId ? parseInt(req.query.companyId) : null;
|
||||
const cidrs = await q.getExportCIDRs(companyId);
|
||||
const aggregated = aggregateCIDRs(cidrs);
|
||||
const text = aggregated.join('\n') + (aggregated.length ? '\n' : '');
|
||||
|
||||
res.set('Content-Type', 'text/plain; charset=utf-8');
|
||||
|
||||
const fname = (req.query.filename || 'white-list.txt').replace(/[^\w\-_. ]/g, '_');
|
||||
const disp = req.query.view === '1' ? 'inline' : 'attachment';
|
||||
res.set('Content-Disposition', disp + '; filename="' + fname + '"');
|
||||
res.send(text);
|
||||
} catch (e) {
|
||||
console.error('[v2:export] Error:', e);
|
||||
res.status(500).send('Ошибка экспорта');
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
module.exports = { createExportRouter };
|
||||
Reference in New Issue
Block a user