43 lines
1.5 KiB
TypeScript
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
|
|
}
|