fix(settings): сохранять результат операций базы при вторичных сбоях
This commit is contained in:
1 parent
738c98b9d3
commit
92b65a30ce
15 files changed
+159
-32
No files matched your search
@@ -4,6 +4,8 @@ const MAX_RESTORE_BYTES=512*1024*1024
|
||||
const magic=[80,71,68,77,80]
|
||||
const receiptSchema=z.object({ok:z.literal(true),eventError:z.string().min(1).optional(),listenerError:z.string().min(1).optional(),schedulerError:z.string().min(1).optional(),cleanupError:z.string().min(1).optional()}).strict()
|
||||
export type SystemDatabaseRestoreReceipt=z.output<typeof receiptSchema>
|
||||
const warningSchema=receiptSchema.omit({ok:true})
|
||||
export type SystemDatabaseWarnings=z.output<typeof warningSchema>
|
||||
type Options={signal?:AbortSignal}
|
||||
const signal=(options?:Options)=>options?.signal?AbortSignal.any([options.signal,AbortSignal.timeout(600_000)]):AbortSignal.timeout(600_000)
|
||||
function parseFilename(value:string|null):string{
|
||||
@@ -21,12 +23,17 @@ async function confirmDump(blob:Blob):Promise<void>{
|
||||
const head=new Uint8Array(await blob.slice(0,magic.length).arrayBuffer())
|
||||
if(!magic.every((value,index)=>head[index]===value))throw new Error("Файл не похож на резервную копию PostgreSQL (PGDMP)")
|
||||
}
|
||||
export async function downloadSystemDatabaseBackup(baseUrl:string,options?:Options):Promise<{blob:Blob;filename:string}>{
|
||||
export async function downloadSystemDatabaseBackup(baseUrl:string,options?:Options):Promise<{blob:Blob;filename:string;warnings:SystemDatabaseWarnings}>{
|
||||
const activeSignal=signal(options)
|
||||
const response=await requestBlob(baseUrl,"/api/system/database/backup",{signal:activeSignal})
|
||||
const blob=await response.blob()
|
||||
await confirmDump(blob);activeSignal.throwIfAborted()
|
||||
return {blob,filename:parseFilename(response.headers.get("Content-Disposition"))}
|
||||
const rawWarnings=response.headers.get("X-System-Database-Outcome")
|
||||
let warnings:SystemDatabaseWarnings={}
|
||||
if(rawWarnings){
|
||||
try{warnings=warningSchema.parse(JSON.parse(decodeURIComponent(rawWarnings)))}catch{warnings={eventError:"Бэкап подготовлен, но дополнительные результаты не подтверждены"}}
|
||||
}
|
||||
return {blob,filename:parseFilename(response.headers.get("Content-Disposition")),warnings}
|
||||
}
|
||||
export async function restoreSystemDatabaseBackup(baseUrl:string,file:File,options?:Options):Promise<SystemDatabaseRestoreReceipt>{
|
||||
if(file.size>MAX_RESTORE_BYTES)throw new ApiClientError("Файл больше 512 МБ — уменьшите бэкап или обратитесь к администратору",413)
|
||||
|
||||
Reference in new issue
Block a user