Docker images / prepare-release (push) Successful in 12s
Docker images / backend-test (push) Successful in 4m9s
Docker images / frontend-image (push) Successful in 4m28s
Docker images / updater-image (push) Successful in 58s
Docker images / backend-image (push) Successful in 2m49s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 11s
При старте backend накатывает схему PostgreSQL 18 и, если база пустая, один раз импортирует mikrotik.db с тома. Повторный старт не копирует данные. Бэкап в UI идёт через pg_dump. Co-authored-by: Cursor <[email protected]>
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { desc, eq, inArray } from "drizzle-orm"
|
|
import { db } from "../../db/index.js"
|
|
import { alertEngineCursor, schedulerRuns } from "../../db/schema.js"
|
|
|
|
const SOURCE_JOBS = [
|
|
"traffic",
|
|
"servers_rest_ping",
|
|
"uptime_resources",
|
|
"uptime_ping",
|
|
"uptime_speed",
|
|
"gre_bgp",
|
|
] as const
|
|
|
|
export async function getLatestSourceFinishedAt(): Promise<string | null> {
|
|
const row = (await db
|
|
.select({ finishedAt: schedulerRuns.finishedAt })
|
|
.from(schedulerRuns)
|
|
.where(inArray(schedulerRuns.jobKey, [...SOURCE_JOBS]))
|
|
.orderBy(desc(schedulerRuns.finishedAt))
|
|
.limit(1))[0]
|
|
return row?.finishedAt ?? null
|
|
}
|
|
|
|
export async function getSourceWatermark(): Promise<string | null> {
|
|
const row = (await db.select().from(alertEngineCursor).where(eq(alertEngineCursor.id, 1)).limit(1))[0]
|
|
return row?.lastSourceFinishedAt ?? null
|
|
}
|
|
|
|
export async function updateSourceWatermark(lastSourceFinishedAt: string | null): Promise<void> {
|
|
const existing = (await db
|
|
.select()
|
|
.from(alertEngineCursor)
|
|
.where(eq(alertEngineCursor.id, 1))
|
|
.limit(1))[0]
|
|
if (existing) {
|
|
await db.update(alertEngineCursor)
|
|
.set({
|
|
lastSourceFinishedAt,
|
|
updatedAt: new Date().toISOString(),
|
|
})
|
|
.where(eq(alertEngineCursor.id, 1))
|
|
return
|
|
}
|
|
await db.insert(alertEngineCursor)
|
|
.values({
|
|
id: 1,
|
|
lastSourceFinishedAt,
|
|
updatedAt: new Date().toISOString(),
|
|
})
|
|
}
|