From b0a5875f4eb570f13adb47e3f7decdd61d069427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 31 May 2026 09:05:48 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20/exp=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=20src/routes/exp.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.js | 19 +------------------ src/routes/exp.js | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 18 deletions(-) create mode 100644 src/routes/exp.js diff --git a/server.js b/server.js index a59b7ed..0b84b5f 100644 --- a/server.js +++ b/server.js @@ -76,24 +76,7 @@ async function start() { // JWKS endpoint для валидации токенов внешними сервисами (только в mock-режиме) if (auth.jwksHandler) app.get('/.well-known/jwks.json', auth.jwksHandler); - // ── ВРЕМЕННЫЙ публичный endpoint /exp (без авторизации) ────────────────── - // TODO: убрать когда /export станет публичным по ТЗ п. 4.7 - { - const { exportLimiter } = require('./src/middleware/rateLimit'); - const { aggregateCIDRs } = require('./src/validators'); - app.get('/exp', exportLimiter, async (req, res) => { - try { - const cidrs = await q.getExportCIDRs(null); // null = все компании - const aggregated = aggregateCIDRs(cidrs); - res.setHeader('Content-Type', 'text/plain; charset=utf-8'); - res.setHeader('Content-Disposition', 'inline; filename="whitelist.txt"'); - res.send(aggregated.join('\n') + (aggregated.length ? '\n' : '')); - } catch (e) { - console.error('/exp error:', e); - res.status(500).send('Export error'); - } - }); - } + app.use(require('./src/routes/exp')); // TODO: удалить (временный /exp без авторизации) // ── REST API v1 (Bearer JWT, без сессий/CSRF) ───────────────────────────── const { createApiRouter } = require('./src/api/index'); diff --git a/src/routes/exp.js b/src/routes/exp.js new file mode 100644 index 0000000..e155070 --- /dev/null +++ b/src/routes/exp.js @@ -0,0 +1,25 @@ +// ВРЕМЕННЫЙ публичный endpoint GET /exp — без авторизации, все компании. +// TODO: удалить этот файл + строку в server.js когда /export станет публичным (ТЗ п. 4.7) +'use strict'; + +const { Router } = require('express'); +const { exportLimiter } = require('../middleware/rateLimit'); +const { aggregateCIDRs } = require('../validators'); +const q = require('../queries'); + +const router = Router(); + +router.get('/exp', exportLimiter, async (req, res) => { + try { + const cidrs = await q.getExportCIDRs(null); // null = все компании + const aggregated = aggregateCIDRs(cidrs); + res.setHeader('Content-Type', 'text/plain; charset=utf-8'); + res.setHeader('Content-Disposition', 'inline; filename="whitelist.txt"'); + res.send(aggregated.join('\n') + (aggregated.length ? '\n' : '')); + } catch (e) { + console.error('/exp error:', e); + res.status(500).send('Export error'); + } +}); + +module.exports = router;