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(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(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)[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{ const input=evoBgpTestDraftSchema.safeParse(draft) if(!input.success)throw new Error(input.error.issues[0]?.message??"Укажите допустимые параметры EvoBGP") confirmEvoBgpConnection(await requestJson(base,"/api/evobgp/test",{...initWithTimeout(init),method:"POST",body:JSON.stringify(input.data)})) }