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 = { 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 }