- ui/api-client.js: HTTP-клиент к /api/v1/* (token из session.token) - ui/routes/auth.js: /login (mock-пресеты), /login-token (Bearer paste), /logout - ui/routes/entries.js: /, /add, /edit/:id, /delete/:id через API - ui/routes/admin.js: /admin, /admin/limit/:id, /audit через API - ui/routes/export.js: /export → проксирует /api/v1/entries/export - ui/index.js: createUiRouter() — requireToken + resolveUser middleware - views/ui-login.ejs: страница входа (mock + token) - views/error.ejs: шаблон для 403/404/500 API расширения: - GET /api/v1/entries теперь возвращает limit и used - GET /api/v1/entries?company=<id> (admin): записи другой компании - POST/PATCH/DELETE /api/v1/entries?company=<id> (admin): мутации для другой компании - GET /api/v1/entries/export: агрегированный CIDR (перенесён из монолита) - GET /api/v1/audit?company=<id>: журнал (перенесён из монолита) server.js: заменены src/routes/* на ui/createUiRouter(), убран CSRF
32 lines
941 B
JavaScript
32 lines
941 B
JavaScript
'use strict';
|
|
|
|
/**
|
|
* ui/routes/export.js — GET /export.
|
|
* Доступен всем аутентифицированным (не только admin).
|
|
* Проксирует GET /api/v1/entries/export (text/plain).
|
|
*/
|
|
|
|
const { Router } = require('express');
|
|
const api = require('../api-client');
|
|
|
|
function createRouter() {
|
|
const router = Router();
|
|
|
|
router.get('/export', async (req, res) => {
|
|
const token = api.token(req);
|
|
const companyQuery = req.query.company ? '?company=' + parseInt(req.query.company, 10) : '';
|
|
try {
|
|
const r = await api.get('/api/v1/entries/export' + companyQuery, token);
|
|
res.set('Content-Type', 'text/plain; charset=utf-8');
|
|
res.set('Content-Disposition', 'inline; filename="whitelist.txt"');
|
|
res.send(r.data);
|
|
} catch (e) {
|
|
res.status(500).send('Ошибка экспорта: ' + e.message);
|
|
}
|
|
});
|
|
|
|
return router;
|
|
}
|
|
|
|
module.exports = { createRouter };
|