- server/finance/ (19 файлов) удалён: пул финансовой БД перенесён в server/finance-di2/db-core.ts, db-client.ts теперь реэкспортирует из ./db-core - Шедулер аудита перенесён в server/finance-di2/audit-scheduler.ts (03:00 МСК, setInterval, без node-cron), запуск из registerDi2Routes с защитой от повторного старта - История аудита DI2 теперь персистентна: загрузка/запись data/finance-audit-history.json в audit-agent.ts (порт из удалённого server/finance/audit.ts) - registerFinanceRoutes убран из server/routes/index.ts, registerDi2Routes остался на его месте - Клиент: удалены pages/finance/, components/finance/, hooks/useFinance.ts, hooks/useColumnLabels.ts, lib/format.ts, pages/salary.tsx; роуты /finance*, /income*, /expenses*, /salary и lazy-импорты убраны из App.tsx - Навигация: «Финансы» в Sidebar и MobileBottomNav ведёт на субапп /di2 (внешняя ссылка), гейт moduleAccess.finance + finance.view сохранён - index.css: удалён блок .hover-elevate/.hover-elevate-2/.active-elevate (использовался только старым модульным DataTable) - FinanceBottomNav.tsx сохранён как референс для этапа 3 (.superpowers/sdd/di2-restyle/FinanceBottomNav.reference.tsx) - Не тронуто: client-di2/, сиды прав finance.view/manage, finance_access (module-access)
61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
// Обёртка регистрации роутов Data-Insight2 (финансы v2) в iistwin.
|
||
// Все DI2-роуты проходят через auth-gate: JWT + право finance.manage.
|
||
|
||
import type { Express } from "express";
|
||
import express from "express";
|
||
import { authenticateToken, requirePermission } from "../middleware/auth.middleware";
|
||
import { registerRoutes } from "./routes";
|
||
import { startAuditScheduler } from "./audit-scheduler";
|
||
|
||
const DI2_PREFIXES = [
|
||
"/api/income",
|
||
"/api/income-categories",
|
||
"/api/expenses",
|
||
"/api/expense-categories",
|
||
"/api/debt",
|
||
"/api/di2",
|
||
"/api/profitability",
|
||
"/api/heatmap",
|
||
"/api/planning",
|
||
"/api/salary",
|
||
"/api/audit",
|
||
"/api/calculations",
|
||
"/api/connection",
|
||
"/api/db",
|
||
"/api/table-config",
|
||
"/api/table-settings",
|
||
"/api/overrides",
|
||
"/api/tags",
|
||
"/api/tag-assignments",
|
||
"/api/cache",
|
||
"/api/refresh-all",
|
||
"/api/admin",
|
||
"/api/auth/google",
|
||
"/api/ai",
|
||
"/api/telegram",
|
||
];
|
||
|
||
export async function registerDi2Routes(app: Express): Promise<void> {
|
||
const router = express.Router();
|
||
|
||
// Auth-gate: DI2-API только для авторизованных с правом finance.manage.
|
||
// Стоит ПЕРЕД регистрацией роутов DI2 на этом же роутере.
|
||
router.use((req, res, next) => {
|
||
if (!DI2_PREFIXES.some(p => req.path.startsWith(p))) {
|
||
return next();
|
||
}
|
||
authenticateToken(req, res, (err?: unknown) => {
|
||
if (err) return next(err);
|
||
requirePermission("finance.manage")(req, res, next);
|
||
});
|
||
});
|
||
|
||
await registerRoutes(null as any, router as any);
|
||
|
||
app.use(router);
|
||
|
||
// Планировщик аудита целостности (03:00 МСК) — запускается один раз благодаря
|
||
// флагу schedulerStarted внутри startAuditScheduler.
|
||
startAuditScheduler();
|
||
}
|