Docker images / prepare-release (push) Successful in 6s
Docker images / backend-image (push) Successful in 1m24s
Docker images / frontend-image (push) Successful in 2m6s
Docker images / notify-webhook (push) Skipped
Docker images / updater-image (push) Successful in 43s
Docker images / publish-release (push) Successful in 7s
Replaced direct fetch calls with requestJson and requestBlob utility functions across multiple components for improved consistency and error handling. This change enhances the maintainability of the codebase by centralizing API request logic and ensuring uniform handling of authentication and response parsing.
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { ApiClientError, requestBlob } from "@/shared/api/http-client"
|
|
|
|
const MAX_RESTORE_BYTES = 512 * 1024 * 1024
|
|
|
|
function parseFilename(contentDisposition: string | null, fallback: string): string {
|
|
if (!contentDisposition) return fallback
|
|
const utfMatch = /filename\*=UTF-8''([^;]+)/i.exec(contentDisposition)
|
|
if (utfMatch?.[1]) {
|
|
try {
|
|
return decodeURIComponent(utfMatch[1])
|
|
} catch {
|
|
return utfMatch[1]
|
|
}
|
|
}
|
|
const plainMatch = /filename="([^"]+)"/i.exec(contentDisposition)
|
|
if (plainMatch?.[1]) return plainMatch[1]
|
|
return fallback
|
|
}
|
|
|
|
export async function downloadSystemDatabaseBackup(
|
|
baseUrl: string,
|
|
): Promise<{ blob: Blob; filename: string }> {
|
|
const res = await requestBlob(baseUrl, "/api/system/database/backup")
|
|
const blob = await res.blob()
|
|
const filename = parseFilename(res.headers.get("Content-Disposition"), "mikrotik-manager.db")
|
|
return { blob, filename }
|
|
}
|
|
|
|
export async function restoreSystemDatabaseBackup(baseUrl: string, file: File): Promise<void> {
|
|
if (file.size > MAX_RESTORE_BYTES) {
|
|
throw new ApiClientError(
|
|
`Файл больше ${MAX_RESTORE_BYTES / (1024 * 1024)} МБ — уменьшите бэкап или обратитесь к администратору`,
|
|
413,
|
|
)
|
|
}
|
|
await requestBlob(baseUrl, "/api/system/database/restore", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/octet-stream" },
|
|
body: file,
|
|
})
|
|
}
|