79 lines
3.9 KiB
JavaScript
79 lines
3.9 KiB
JavaScript
// ═══════════════════════════════════════════════════════════════════════════════
|
|
// V2 — Админка (Express + EJS)
|
|
//
|
|
// ЭТО: Express-роутер для админа, рендерит EJS-шаблоны.
|
|
// НЕ: доступно обычным юзерам (middleware: req.isAdmin).
|
|
//
|
|
// ШАБЛОНЫ:
|
|
// views/admin.ejs — дашборд (companies, user, version)
|
|
// views/admin-audit.ejs — аудит (audit, company, version)
|
|
// views/admin-entries.ejs — записи (entries, company, used, limit, ...)
|
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
const express = require('express');
|
|
const q = require('../db/queries');
|
|
const crud = require('../crud');
|
|
const config = require('../config');
|
|
|
|
function createAdminRouter() {
|
|
const router = express.Router();
|
|
|
|
router.use((req, res, next) => {
|
|
if (!req.isAdmin) return res.redirect('/app');
|
|
next();
|
|
});
|
|
|
|
// ── GET / — дашборд ─────────────────────────────────────────────────
|
|
router.get('/', async (req, res) => {
|
|
try {
|
|
const companies = await q.getAllCompanies();
|
|
res.render('v2/admin', { companies, user: req.user || {}, version: config.version });
|
|
} catch (e) {
|
|
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
|
|
}
|
|
});
|
|
|
|
// ── GET /audit ──────────────────────────────────────────────────────
|
|
router.get('/audit', async (req, res) => {
|
|
try {
|
|
const companyId = req.query.companyId ? parseInt(req.query.companyId) : null;
|
|
const audit = await q.getAudit(companyId);
|
|
const company = companyId ? await q.getCompanyById(companyId) : null;
|
|
res.render('v2/admin-audit', { audit, company, version: config.version });
|
|
} catch (e) {
|
|
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
|
|
}
|
|
});
|
|
|
|
// ── POST /limit ─────────────────────────────────────────────────────
|
|
router.post('/limit', async (req, res) => {
|
|
try {
|
|
const companyId = parseInt(req.body.companyId);
|
|
const newLimit = parseInt(req.body.limit);
|
|
if (!companyId || !newLimit || newLimit < 1) throw new Error('Неверные параметры');
|
|
await q.setLimit(companyId, newLimit);
|
|
res.redirect('/admin?msg=' + encodeURIComponent('Лимит установлен: ' + newLimit));
|
|
} catch (e) {
|
|
res.redirect('/admin?error=' + encodeURIComponent(e.message));
|
|
}
|
|
});
|
|
|
|
// ── GET /entries ────────────────────────────────────────────────────
|
|
router.get('/entries', async (req, res) => {
|
|
try {
|
|
const companyId = parseInt(req.query.companyId);
|
|
const company = companyId ? await q.getCompanyById(companyId) : null;
|
|
if (!company) return res.redirect('/admin');
|
|
const includeDeleted = req.query.deleted === '1';
|
|
const { entries, used, limit } = await crud.list(company.client_id, includeDeleted);
|
|
res.render('v2/admin-entries', { entries, company, used, limit, includeDeleted, version: config.version });
|
|
} catch (e) {
|
|
res.status(500).send('<h2>Ошибка</h2><pre>' + e.message + '</pre>');
|
|
}
|
|
});
|
|
|
|
return router;
|
|
}
|
|
|
|
module.exports = { createAdminRouter };
|