Files
MikrotikManager/shared/api/sidebar-counts.ts

9 lines
1.3 KiB
TypeScript

import {z} from "zod"
import {requestJson} from "./http-client"
const count=z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER)
const schema=z.object({servers:count,filterRules:count,uptimeProbes:count,uptimeSpeedProbes:count,monitoringItems:count,recursiveRoutes:count,certificates:count.optional(),wireguard:count.optional(),ipsec:count.optional(),users:count.optional(),bgpSessions:count.optional(),vxlan:count.optional(),containers:count.optional()})
const greSchema=z.object({tunnels:z.array(z.object({name:z.string(),serverId:z.string()})),failures:z.array(z.unknown()).optional()})
async function read(base:string,path:string,signal:AbortSignal){signal.throwIfAborted();const raw=await requestJson<unknown>(base,path,{signal,cache:"no-store"});signal.throwIfAborted();return raw}
export async function getSidebarCounts(base:string,signal:AbortSignal){const result=schema.safeParse(await read(base,"/api/sidebar-counts",signal));if(!result.success)throw Error("Счётчики меню не подтверждены");return result.data}
export async function getSidebarGreCount(base:string,signal:AbortSignal){const result=greSchema.safeParse(await read(base,"/api/filters/gre-tunnels",signal));if(!result.success||result.data.failures?.length)throw Error("Полный каталог GRE не подтверждён");return result.data.tunnels.length}