DI2 внедрение, таск 1: серверная интеграция Data-Insight2 (server/finance-di2)

- Копия DI2-сервера в server/finance-di2/ с правками: schema/db-client/cache/table-config/override-tables/google-auth/audit-agent/routes
- db-client — обёртка над существующим пулом server/finance/db-client (второй пул не создаётся, добавлен экспорт isConnectionError)
- ai-config.ts — чистое IO конфигов из ai-agent.ts без Telegram-поллинга; роуты /api/ai/toggle и /api/ai/status удалены, без compression/startAuditScheduler/autoStartIfEnabled
- Обёртка registerDi2Routes с auth-gate (authenticateToken + finance.manage), регистрация строго перед registerFinanceRoutes
- Статика /di2 из dist/public-di2 перед веткой vite/static (dev и prod)
- Фикс предсуществующего бага DI2: buildGlobalExclusionConditions без cats в /api/profitability
This commit is contained in:
2026-09-06 19:27:43 +03:00
parent a60a75eda0
commit 254950f151
16 changed files with 8200 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
// Обёртка регистрации роутов 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";
const DI2_PREFIXES = [
"/api/income",
"/api/income-categories",
"/api/expenses",
"/api/expense-categories",
"/api/debt",
"/api/dashboard",
"/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);
}