Files
vps-tracker/apps/api/src/services/cfdm-notify.ts
T
DenozordecandCursor 0e9a6a6a21
Docker / build (push) Failing after 22s
feat: интеграция с CF Domain Manager
Синхронизация bindings в vps_domains с привязкой по IP, API приёма с Bearer-токеном, настройки и App Switcher из SQLite, UI доменов на VPS и уведомление CFDM при vps_down.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 16:45:16 +07:00

58 lines
1.7 KiB
TypeScript

import { settingsRepository } from '@cfdm/db/repositories/settings'
import { vpsRepository } from '@cfdm/db/repositories/vps'
import type { VpsTrackerEvent } from '@cfdm/shared/contracts/integration-cfdm'
const SETTINGS_ID = 'settings-main'
function resolveCfdmApiBase(): string | null {
const row = settingsRepository.getRow(SETTINGS_ID)
if (!row) return null
const explicit = row.cfdmApiUrl?.trim()
if (explicit) return explicit.replace(/\/$/, '')
const cfdm = settingsRepository.getAppSwitcher().apps.find((a) => a.id === 'cfdm')
return cfdm?.url?.trim().replace(/\/$/, '') ?? null
}
export async function notifyCfdmVpsEvent(
event: VpsTrackerEvent['event'],
vpsIds: string[],
): Promise<void> {
if (vpsIds.length === 0) return
const row = settingsRepository.getRow(SETTINGS_ID)
if (!row?.integrationEnabled) return
const token = settingsRepository.getIntegrationToken()
const baseUrl = resolveCfdmApiBase()
if (!baseUrl || !token) return
const payload: VpsTrackerEvent = {
event,
vps: vpsIds.map((id) => {
const vps = vpsRepository.get(id)
return {
id,
ip: vps?.ip ?? undefined,
label: vps?.dns || vps?.ip || id,
}
}),
timestamp: new Date().toISOString(),
}
try {
const res = await fetch(`${baseUrl}/api/v1/integrations/vps-tracker/events`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(payload),
})
if (!res.ok) {
console.warn(`CFDM event notify failed (${res.status})`)
}
} catch (err) {
console.warn('CFDM event notify error:', err instanceof Error ? err.message : err)
}
}