diff --git a/dashboard/src/api/v1.ts b/dashboard/src/api/v1.ts index 91d795686..664b93d1c 100644 --- a/dashboard/src/api/v1.ts +++ b/dashboard/src/api/v1.ts @@ -2,10 +2,12 @@ import type { AxiosRequestConfig, AxiosResponse } from 'axios'; import * as openApiV1 from './generated/openapi-v1'; import { + type BackupChunkUploadRequest, client as openApiV1Client, type BackupExportRequest, type BackupRenameRequest, type BackupUploadInitRequest, + type BackupUploadRequest, type BackupUploadSessionRequest, type BotConfigRequest, type BotRegistrationRequest, @@ -187,7 +189,21 @@ function generatedQuery( return params as (T & Record) | undefined; } -function generatedFormData(formData: FormData) { +function generatedFormData(formData: FormData | Record) { + if (typeof FormData !== 'undefined' && formData instanceof FormData) { + const body: Record = {}; + formData.forEach((value, key) => { + const existing = body[key]; + if (existing === undefined) { + body[key] = value; + } else if (Array.isArray(existing)) { + existing.push(value); + } else { + body[key] = [existing, value]; + } + }); + return body as any; + } return formData as any; } @@ -586,7 +602,7 @@ export const backupApi = { openApiV1.getBackupProgress({ path: { task_id: taskId } }), ); }, - upload(formData: FormData) { + upload(formData: FormData | BackupUploadRequest) { return typed( openApiV1.uploadBackup({ body: generatedFormData(formData) }), ); @@ -594,7 +610,7 @@ export const backupApi = { initUpload(payload: BackupUploadInitRequest) { return typed(openApiV1.initBackupUpload({ body: payload })); }, - uploadChunk(formData: FormData) { + uploadChunk(formData: FormData | BackupChunkUploadRequest) { return typed( openApiV1.uploadBackupChunk({ body: generatedFormData(formData) }), ); diff --git a/dashboard/src/components/shared/BackupDialog.vue b/dashboard/src/components/shared/BackupDialog.vue index 975d862f3..910534635 100644 --- a/dashboard/src/components/shared/BackupDialog.vue +++ b/dashboard/src/components/shared/BackupDialog.vue @@ -574,12 +574,11 @@ const uploadChunksInParallel = async (file, totalChunks, currentUploadId, curren const end = Math.min(start + currentChunkSize, file.size) const chunk = file.slice(start, end) - const formData = new FormData() - formData.append('upload_id', currentUploadId) - formData.append('chunk_index', chunkIndex.toString()) - formData.append('chunk', chunk) - - const response = await backupApi.uploadChunk(formData) + const response = await backupApi.uploadChunk({ + upload_id: currentUploadId, + chunk_index: chunkIndex, + chunk + }) if (response.data.status !== 'ok') { throw new Error(response.data.message) diff --git a/dashboard/src/views/WelcomePage.vue b/dashboard/src/views/WelcomePage.vue index 278db7c30..9ecb4e52f 100644 --- a/dashboard/src/views/WelcomePage.vue +++ b/dashboard/src/views/WelcomePage.vue @@ -329,7 +329,7 @@ const greetingText = computed(() => { }); async function loadPlatformConfigBase() { - const res = await systemConfigApi.get(); + const res = await systemConfigApi.runtime(); const payload = (res.data.data || {}) as any; platformMetadata.value = payload.metadata || {}; platformConfigData.value = payload.config || {};