refactor(app-asset): migrate file upload to presigned URL and batch upload

- Replace FormData file upload with presigned URL two-step upload
- Add batch-upload contract for folder uploads (reduces N+M to 1+M requests)
- Remove deprecated createFile contract and useCreateAppAssetFile hook
- Remove checksum field from AppAssetNode and AppAssetTreeView types
- Add upload-to-presigned-url utility for direct storage uploads
This commit is contained in:
yyh
2026-01-23 15:11:04 +08:00
parent 4448737bd8
commit f8438704a6
9 changed files with 286 additions and 146 deletions

View File

@ -8,9 +8,9 @@ import { useStore as useAppStore } from '@/app/components/app/store'
import Toast from '@/app/components/base/toast'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import {
useCreateAppAssetFile,
useCreateAppAssetFolder,
useRenameAppAssetNode,
useUploadFileWithPresignedUrl,
} from '@/service/use-app-asset'
import { getFileExtension, isTextLikeFile } from '../utils/file-utils'
import { createDraftTreeNode, insertDraftTreeNode } from '../utils/tree-utils'
@ -35,7 +35,7 @@ export function useInlineCreateNode({
const pendingCreateNode = useStore(s => s.pendingCreateNode)
const storeApi = useWorkflowStore()
const createFile = useCreateAppAssetFile()
const uploadFile = useUploadFileWithPresignedUrl()
const createFolder = useCreateAppAssetFolder()
const renameNode = useRenameAppAssetNode()
@ -79,9 +79,8 @@ export function useInlineCreateNode({
else {
const emptyBlob = new Blob([''], { type: 'text/plain' })
const file = new File([emptyBlob], trimmedName)
const createdFile = await createFile.mutateAsync({
const createdFile = await uploadFile.mutateAsync({
appId,
name: trimmedName,
file,
parentId: pendingCreateParentId,
})
@ -123,7 +122,7 @@ export function useInlineCreateNode({
})
}, [
appId,
createFile,
uploadFile,
createFolder,
pendingCreateId,
pendingCreateParentId,