fix(ui): проверять права и сохранять достоверность общей сводки
This commit is contained in:
1 parent
b109532f33
commit
1999e8160e
9 files changed
+124
-117
No files matched your search
@@ -0,0 +1,10 @@
|
||||
import assert from "node:assert/strict"
|
||||
import {test} from "node:test"
|
||||
import {getSidebarCounts,getSidebarGreCount} from "./sidebar-counts"
|
||||
test("sidebar unknown counts and partial GRE never become confirmed zeros",async()=>{
|
||||
const original=globalThis.fetch;try{const signal=new AbortController().signal;globalThis.fetch=async()=>Response.json({servers:0,filterRules:0,uptimeProbes:0,uptimeSpeedProbes:0,monitoringItems:0,recursiveRoutes:0});const counts=await getSidebarCounts("https://backend.test",signal);assert.equal(counts.servers,0);assert.equal(counts.users,undefined)
|
||||
for(const raw of [{},{servers:-1}]){globalThis.fetch=async()=>Response.json(raw);await assert.rejects(getSidebarCounts("https://backend.test",signal),/не подтверждены/)}
|
||||
for(const raw of [{},{tunnels:null},{tunnels:[],failures:[{error:"offline"}]}]){globalThis.fetch=async()=>Response.json(raw);await assert.rejects(getSidebarGreCount("https://backend.test",signal),/не подтверждён/)}
|
||||
globalThis.fetch=async()=>Response.json({tunnels:[],failures:[]});assert.equal(await getSidebarGreCount("https://backend.test",signal),0)
|
||||
}finally{globalThis.fetch=original}
|
||||
})
|
||||
@@ -0,0 +1,8 @@
|
||||
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}
|
||||
Reference in new issue
Block a user