feat: add GET /api/v1/export and GET /api/v1/audit

This commit is contained in:
2026-05-30 18:14:12 +03:00
parent 87216389e3
commit 2738c010a7
2 changed files with 45 additions and 2 deletions
+43 -1
View File
@@ -10,7 +10,7 @@ function apiRequireAdmin(req, res, next) {
next();
}
function createAdminRouter({ q }) {
function createAdminRouter({ q, aggregateCIDRs }) {
const router = express.Router();
const json = express.json({ limit: '8kb' });
@@ -38,6 +38,48 @@ function createAdminRouter({ q }) {
}
});
// GET /api/v1/export — агрегированный CIDR whitelist (text/plain)
// Обычный пользователь — только своя компания.
// Admin — все компании, или ?company=<id> для фильтра.
router.get('/export', async (req, res) => {
try {
let companyId = null;
if (!req.user.isAdmin) {
const company = await q.getOrCreateCompany(req.user.clientId, req.user.companyName);
companyId = company.id;
} else if (req.query.company) {
const parsed = parseInt(req.query.company, 10);
if (Number.isFinite(parsed) && parsed > 0) companyId = parsed;
}
const cidrs = await q.getExportCIDRs(companyId);
const aggregated = aggregateCIDRs(cidrs);
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.send(aggregated.join('\n') + (aggregated.length ? '\n' : ''));
} catch (e) {
res.status(500).json({ error: e.message });
}
});
// GET /api/v1/audit — лог операций.
// Обычный пользователь — только своя компания.
// Admin — все компании, или ?company=<id> для фильтра.
router.get('/audit', async (req, res) => {
try {
let companyId = null;
if (!req.user.isAdmin) {
const company = await q.getOrCreateCompany(req.user.clientId, req.user.companyName);
companyId = company.id;
} else if (req.query.company) {
const parsed = parseInt(req.query.company, 10);
if (Number.isFinite(parsed) && parsed > 0) companyId = parsed;
}
const rows = await q.getAudit(companyId);
res.json({ audit: rows });
} catch (e) {
res.status(500).json({ error: e.message });
}
});
return router;
}