refactor: шаг 4 — GET /export вынесен в src/routes/export.js
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* src/routes/export.js — публичный маршрут GET /export.
|
||||
*
|
||||
* Назначение: отдаёт агрегированный список всех активных CIDR (все компании)
|
||||
* в виде текстового файла (один адрес/подсеть на строку).
|
||||
*
|
||||
* Особенности:
|
||||
* - НЕ требует авторизации (ТЗ: «доступ ограничивается на сетевом уровне»).
|
||||
* - Регистрируется ДО auth.middleware в server.js.
|
||||
* - Ограничен exportLimiter: не более 20 запросов/мин с одного IP.
|
||||
* - aggregateCIDRs объединяет перекрывающиеся диапазоны → минимальный набор.
|
||||
*
|
||||
* Паттерн «фабрика»:
|
||||
* Вместо прямых require(зависимостей) получаем их через параметр deps.
|
||||
* Это позволяет легко подменять зависимости в тестах (mock q, mock aggregateCIDRs).
|
||||
*
|
||||
* @param {{ q: object, exportLimiter: Function, aggregateCIDRs: Function }} deps
|
||||
* @returns {import('express').Router}
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const { Router } = require('express');
|
||||
|
||||
function createRouter({ q, exportLimiter, aggregateCIDRs }) {
|
||||
const router = Router();
|
||||
|
||||
// GET /export — агрегированный whitelist всех компаний в текстовом виде.
|
||||
// exportLimiter ограничивает частоту запросов (20/мин) до проверки авторизации —
|
||||
// это важно, так как маршрут публичный.
|
||||
router.get('/export', exportLimiter, async (req, res) => {
|
||||
try {
|
||||
// Получаем все активные CIDR без фильтра по компании
|
||||
const cidrs = await q.getExportCIDRs();
|
||||
|
||||
// Суммаризация: объединяем пересекающиеся и смежные диапазоны
|
||||
// Например: 192.168.0.0/25 + 192.168.0.128/25 → 192.168.0.0/24
|
||||
const aggregated = aggregateCIDRs(cidrs);
|
||||
|
||||
// Content-Type: text/plain — чтобы браузер не пытался разбирать как HTML.
|
||||
// Content-Disposition: inline — открывается в браузере, а не скачивается.
|
||||
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
||||
res.setHeader('Content-Disposition', 'inline; filename="whitelist.txt"');
|
||||
|
||||
// Один CIDR на строку. Если список пустой — возвращаем пустую строку (не ошибку).
|
||||
res.send(aggregated.join('\n') + (aggregated.length ? '\n' : ''));
|
||||
} catch (e) {
|
||||
console.error('Export error:', e);
|
||||
res.status(500).send('Export error');
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
module.exports = { createRouter };
|
||||
Reference in New Issue
Block a user