feat(skill): add oRPC contract and hook for file download URL

Add frontend oRPC integration for the existing backend download URL
endpoint to enable file downloads from the asset tree.
This commit is contained in:
yyh
2026-01-16 09:55:17 +08:00
parent 783cdb1357
commit 3252748345
4 changed files with 29 additions and 0 deletions

View File

@ -1,6 +1,7 @@
import type {
AppAssetDeleteResponse,
AppAssetFileContentResponse,
AppAssetFileDownloadUrlResponse,
AppAssetNode,
AppAssetPublishResponse,
AppAssetTreeResponse,
@ -54,6 +55,16 @@ export const getFileContentContract = base
}>())
.output(type<AppAssetFileContentResponse>())
export const getFileDownloadUrlContract = base
.route({
path: '/apps/{appId}/assets/files/{nodeId}/download-url',
method: 'GET',
})
.input(type<{
params: { appId: string, nodeId: string }
}>())
.output(type<AppAssetFileDownloadUrlResponse>())
export const updateFileContentContract = base
.route({
path: '/apps/{appId}/assets/files/{nodeId}',

View File

@ -4,6 +4,7 @@ import {
createFolderContract,
deleteNodeContract,
getFileContentContract,
getFileDownloadUrlContract,
moveNodeContract,
publishContract,
renameNodeContract,
@ -50,6 +51,7 @@ export const consoleRouterContract = {
createFolder: createFolderContract,
createFile: createFileContract,
getFileContent: getFileContentContract,
getFileDownloadUrl: getFileDownloadUrlContract,
updateFileContent: updateFileContentContract,
deleteNode: deleteNodeContract,
renameNode: renameNodeContract,

View File

@ -104,6 +104,14 @@ export const useGetAppAssetFileContent = (appId: string, nodeId: string) => {
})
}
export const useGetAppAssetFileDownloadUrl = (appId: string, nodeId: string, options?: { enabled?: boolean }) => {
return useQuery({
queryKey: consoleQuery.appAsset.getFileDownloadUrl.queryKey({ input: { params: { appId, nodeId } } }),
queryFn: () => consoleClient.appAsset.getFileDownloadUrl({ params: { appId, nodeId } }),
enabled: (options?.enabled ?? true) && !!appId && !!nodeId,
})
}
export const useUpdateAppAssetFileContent = () => {
const queryClient = useQueryClient()
return useMutation({

View File

@ -70,6 +70,14 @@ export type AppAssetFileContentResponse = {
content: string
}
/**
* File download URL response (GET /apps/{app_id}/assets/files/{node_id}/download-url)
*/
export type AppAssetFileDownloadUrlResponse = {
/** Presigned download URL */
download_url: string
}
/**
* Delete node response (DELETE /apps/{app_id}/assets/nodes/{node_id})
*/