25 lines
2.4 KiB
TypeScript
25 lines
2.4 KiB
TypeScript
import { evoBgpSettingsSchema,evoBgpSettingsPatchSchema,evoBgpSaveReceiptSchema,evoBgpTestDraftSchema,type EvoBgpSavePayload,type EvoBgpTestDraft } from "@mmapp/contracts/evobgp"
|
|
import {requestJson} from "./http-client"
|
|
import {confirmEvoBgpConnection} from "@/lib/evobgp-test-receipt"
|
|
function initWithTimeout(init?:RequestInit):RequestInit {return {...init,signal:AbortSignal.any([...(init?.signal?[init.signal]:[]),AbortSignal.timeout(30_000)])}}
|
|
export async function getEvoBgpSettings(base:string,init?:RequestInit){
|
|
const parsed=evoBgpSettingsSchema.safeParse(await requestJson<unknown>(base,"/api/evobgp/settings",{...initWithTimeout(init),method:"GET"}))
|
|
if(!parsed.success)throw new Error("Настройки EvoBGP не подтверждены сервером")
|
|
return parsed.data
|
|
}
|
|
export async function putEvoBgpSettings(base:string,patch:EvoBgpSavePayload,init?:RequestInit){
|
|
const input=evoBgpSettingsPatchSchema.safeParse(patch)
|
|
if(!input.success)throw new Error(input.error.issues[0]?.message??"Укажите допустимые настройки EvoBGP")
|
|
const body=input.data
|
|
const parsed=evoBgpSaveReceiptSchema.safeParse(await requestJson<unknown>(base,"/api/evobgp/settings",{...initWithTimeout(init),method:"PUT",body:JSON.stringify(body)}))
|
|
if(!parsed.success)throw new Error("Сохранение EvoBGP не подтверждено сервером")
|
|
const data=parsed.data,fields=Object.keys(body).filter(field=>(body as Record<string,unknown>)[field]!==undefined)
|
|
if(data.savedFields.length!==fields.length||fields.some(field=>!data.savedFields.includes(field as typeof data.savedFields[number]))||body.baseUrl!==undefined&&data.baseUrl!==body.baseUrl||body.enabled!==undefined&&data.enabled!==body.enabled||body.apiKey!==undefined&&data.secretConfigured!==Boolean(body.apiKey))throw new Error("Сохранение EvoBGP не подтверждено: сервер вернул другие настройки")
|
|
return data
|
|
}
|
|
export async function testEvoBgpConnection(base:string,draft:EvoBgpTestDraft={},init?:RequestInit):Promise<void>{
|
|
const input=evoBgpTestDraftSchema.safeParse(draft)
|
|
if(!input.success)throw new Error(input.error.issues[0]?.message??"Укажите допустимые параметры EvoBGP")
|
|
confirmEvoBgpConnection(await requestJson<unknown>(base,"/api/evobgp/test",{...initWithTimeout(init),method:"POST",body:JSON.stringify(input.data)}))
|
|
}
|