From 19620c0803fe5d21097c519060e8b910fe3db372 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 1 Aug 2026 00:36:04 +0700 Subject: [PATCH] =?UTF-8?q?fix(integrations):=20=D0=BE=D1=82=D0=B4=D0=B0?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20bindings=20=D0=B2=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D1=82=D0=B5=20sync=20=D0=B4=D0=BB=D1=8F=20VPS=20Tr?= =?UTF-8?q?acker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ручной sync работает через pull: VPS Tracker получает bindings в ответе и не зависит от обратного push. Уточнены сообщения об ошибках сети. Co-authored-by: Cursor --- .../src/routes/integrations-vps-tracker.ts | 24 ++++++++++--------- apps/api/src/services/vps-tracker-sync.ts | 6 +++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/apps/api/src/routes/integrations-vps-tracker.ts b/apps/api/src/routes/integrations-vps-tracker.ts index 9b5c974..98601be 100644 --- a/apps/api/src/routes/integrations-vps-tracker.ts +++ b/apps/api/src/routes/integrations-vps-tracker.ts @@ -3,7 +3,7 @@ import type { FastifyInstance } from "fastify"; import { vpsTrackerEventSchema } from "@cfdm/shared"; import { getAppSettingsSecrets } from "@cfdm/db"; import * as vpsTrackerEvents from "../services/vps-tracker-events.js"; -import { syncAllToVpsTracker } from "../services/vps-tracker-sync.js"; +import { buildAllSyncBindings } from "../services/vps-tracker-sync.js"; function verifyBearer(authHeader: string | undefined, expected: string): boolean { if (!authHeader?.startsWith("Bearer ")) return false; @@ -43,7 +43,11 @@ export async function integrationsVpsTrackerRoutes(app: FastifyInstance) { return { ok: true, reconciled }; }); - /** Запрос полной синхронизации bindings → VPS Tracker (вызывает VPS Tracker). */ + /** + * Полная синхронизация по запросу VPS Tracker (pull). + * Bindings возвращаются в ответе — клиент применяет их локально. + * Не требует доступности VPS Tracker URL из CFDM. + */ app.post("/integrations/vps-tracker/sync", async (req, reply) => { const secrets = getAppSettingsSecrets(app.db); const token = secrets.vpsTrackerIntegrationToken; @@ -57,14 +61,12 @@ export async function integrationsVpsTrackerRoutes(app: FastifyInstance) { return reply.status(401).send({ ok: false, error: "Unauthorized" }); } - const result = await syncAllToVpsTracker(app.db); - if (!result.ok) { - return reply.status(502).send({ - ok: false, - error: result.error ?? "Sync failed", - count: result.count, - }); - } - return { ok: true, count: result.count }; + const bindings = buildAllSyncBindings(app.db); + return { + ok: true, + count: bindings.length, + bindings, + fullSync: true, + }; }); } diff --git a/apps/api/src/services/vps-tracker-sync.ts b/apps/api/src/services/vps-tracker-sync.ts index f4e867a..927ca68 100644 --- a/apps/api/src/services/vps-tracker-sync.ts +++ b/apps/api/src/services/vps-tracker-sync.ts @@ -145,19 +145,21 @@ export async function syncAllToVpsTracker(db: Db): Promise<{ body: JSON.stringify({ bindings, fullSync: true }), }); if (!res.ok) { + const detail = await res.text(); return { ok: false, count: 0, - error: `HTTP ${res.status}: ${await res.text()}`, + error: `VPS Tracker ${baseUrl} ответил HTTP ${res.status}: ${detail}`, }; } touchVpsTrackerSync(db); return { ok: true, count: bindings.length }; } catch (err) { + const raw = err instanceof Error ? err.message : "Ошибка сети"; return { ok: false, count: 0, - error: err instanceof Error ? err.message : "Ошибка сети", + error: `Не удалось отправить данные в VPS Tracker (${baseUrl}): ${raw}`, }; } }