'use strict'; const express = require('express'); // Отдельный requireAdmin для API — возвращает JSON вместо plain text function apiRequireAdmin(req, res, next) { if (!req.user || !req.user.isAdmin) { return res.status(403).json({ error: 'Admin role required' }); } next(); } function createAdminRouter({ q, aggregateCIDRs }) { const router = express.Router(); const json = express.json({ limit: '8kb' }); // GET /api/v1/companies — все компании (admin only) router.get('/companies', apiRequireAdmin, async (req, res) => { try { const companies = await q.getAllCompanies(); res.json({ companies }); } catch (e) { res.status(500).json({ error: e.message }); } }); // PATCH /api/v1/companies/:id/limit — установить лимит (admin only) router.patch('/companies/:id/limit', apiRequireAdmin, json, async (req, res) => { const limit = parseInt((req.body || {}).limit, 10); if (isNaN(limit) || limit < 0) { return res.status(400).json({ error: 'limit must be non-negative integer' }); } try { await q.setLimit(req.params.id, limit); res.json({ ok: true, limit }); } catch (e) { res.status(500).json({ error: e.message }); } }); // GET /api/v1/export — агрегированный CIDR whitelist (text/plain) // Обычный пользователь — только своя компания. // Admin — все компании, или ?company= для фильтра. 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= для фильтра. 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; } module.exports = { createAdminRouter };