Files
MikrotikManager/lib/config-revisions.ts
T

43 lines
1.5 KiB
TypeScript

import { z } from "zod"
export type ConfigRevisionSource = "apply" | "rollback" | "observed" | "copy"
export interface ConfigRevisionDto {
id: string
serverId: string
section: "filters" | "recursive-routes" | "firewall" | "wireguard" | "gre" | "ipsec"
source: ConfigRevisionSource
fingerprint: string
createdAt: string
note: string | null
itemCount: number
}
const revisionsSchema = z.object({ revisions: z.array(z.object({
id: z.string().min(1),
serverId: z.string().min(1),
section: z.enum(["filters", "recursive-routes", "firewall", "wireguard", "gre", "ipsec"]),
source: z.enum(["apply", "rollback", "observed", "copy"]),
fingerprint: z.string(),
createdAt: z.string().refine(value => Number.isFinite(Date.parse(value))),
note: z.string().nullable(),
itemCount: z.number().int().nonnegative(),
})) })
const sectionLabels: Record<ConfigRevisionDto["section"], string> = {
filters: "Filters", "recursive-routes": "рекурсивных маршрутов", firewall: "Firewall",
wireguard: "WireGuard", gre: "GRE", ipsec: "IPsec",
}
export function parseConfigRevisions(
payload: unknown,
serverId: string,
section: ConfigRevisionDto["section"],
): ConfigRevisionDto[] {
const result = revisionsSchema.safeParse(payload)
if (!result.success || result.data.revisions.some(revision => revision.serverId !== serverId || revision.section !== section)) {
throw new Error("Некорректный ответ истории " + sectionLabels[section])
}
return result.data.revisions
}