feat: UI-слой через /api/v1/* (ui/, views/ui-login.ejs, views/error.ejs)
- 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
This commit is contained in:
@@ -38,6 +38,21 @@ function createAdminRouter({ q }) {
|
||||
}
|
||||
});
|
||||
|
||||
// GET /api/v1/audit — журнал действий (admin only)
|
||||
// ?company=<id> — фильтр по компании (опционально)
|
||||
router.get('/audit', apiRequireAdmin, async (req, res) => {
|
||||
try {
|
||||
const companyId = req.query.company ? parseInt(req.query.company, 10) : null;
|
||||
const [rows, companies] = await Promise.all([
|
||||
q.getAudit(companyId && Number.isFinite(companyId) ? companyId : null),
|
||||
q.getAllCompanies(),
|
||||
]);
|
||||
res.json({ rows, companies });
|
||||
} catch (e) {
|
||||
res.status(500).json({ error: e.message });
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user