mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-09 06:49:02 +08:00
feat: add resolveFilePath functionality to resolve restoring from different computer (#5980)
* feat: add resolveFilePath functionality to file management * Added new IPC channel for resolving file paths. * Implemented resolveFilePath method in FileStorage service. * Updated FileManager to utilize the new resolveFilePath method. * Enhanced preload API to expose resolveFilePath to the renderer. * Updated KnowledgeService to ensure file paths are correctly resolved in knowledge bases. * refactor: remove unused path import from preload index * Removed the unused 'resolve' import to clean up the codebase. * Improved code readability by eliminating unnecessary dependencies. --------- Co-authored-by: beyondkmp <beyondkmkp@gmail.com>
This commit is contained in:
parent
94b602b250
commit
3abe0e803c
@ -112,7 +112,7 @@ export enum IpcChannel {
|
|||||||
File_BinaryImage = 'file:binaryImage',
|
File_BinaryImage = 'file:binaryImage',
|
||||||
File_Base64File = 'file:base64File',
|
File_Base64File = 'file:base64File',
|
||||||
Fs_Read = 'fs:read',
|
Fs_Read = 'fs:read',
|
||||||
|
File_ResolveFilePath = 'file:resolveFilePath',
|
||||||
Export_Word = 'export:word',
|
Export_Word = 'export:word',
|
||||||
|
|
||||||
Shortcuts_Update = 'shortcuts:update',
|
Shortcuts_Update = 'shortcuts:update',
|
||||||
|
|||||||
@ -242,6 +242,7 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
|
|||||||
ipcMain.handle(IpcChannel.File_Download, fileManager.downloadFile)
|
ipcMain.handle(IpcChannel.File_Download, fileManager.downloadFile)
|
||||||
ipcMain.handle(IpcChannel.File_Copy, fileManager.copyFile)
|
ipcMain.handle(IpcChannel.File_Copy, fileManager.copyFile)
|
||||||
ipcMain.handle(IpcChannel.File_BinaryImage, fileManager.binaryImage)
|
ipcMain.handle(IpcChannel.File_BinaryImage, fileManager.binaryImage)
|
||||||
|
ipcMain.handle(IpcChannel.File_ResolveFilePath, (_, name) => fileManager.resolveFilePath(name))
|
||||||
|
|
||||||
// fs
|
// fs
|
||||||
ipcMain.handle(IpcChannel.Fs_Read, FileService.readFile)
|
ipcMain.handle(IpcChannel.Fs_Read, FileService.readFile)
|
||||||
|
|||||||
@ -27,6 +27,10 @@ class FileStorage {
|
|||||||
this.initStorageDir()
|
this.initStorageDir()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public resolveFilePath = (name: string): string => {
|
||||||
|
return path.join(this.storageDir, name)
|
||||||
|
}
|
||||||
|
|
||||||
private initStorageDir = (): void => {
|
private initStorageDir = (): void => {
|
||||||
try {
|
try {
|
||||||
if (!fs.existsSync(this.storageDir)) {
|
if (!fs.existsSync(this.storageDir)) {
|
||||||
|
|||||||
@ -55,6 +55,7 @@ const api = {
|
|||||||
},
|
},
|
||||||
file: {
|
file: {
|
||||||
select: (options?: OpenDialogOptions) => ipcRenderer.invoke(IpcChannel.File_Select, options),
|
select: (options?: OpenDialogOptions) => ipcRenderer.invoke(IpcChannel.File_Select, options),
|
||||||
|
resolveFilePath: (name: string) => ipcRenderer.invoke(IpcChannel.File_ResolveFilePath, name),
|
||||||
upload: (file: FileType) => ipcRenderer.invoke(IpcChannel.File_Upload, file),
|
upload: (file: FileType) => ipcRenderer.invoke(IpcChannel.File_Upload, file),
|
||||||
delete: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Delete, fileId),
|
delete: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Delete, fileId),
|
||||||
read: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Read, fileId),
|
read: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Read, fileId),
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import db from '@renderer/databases'
|
|||||||
import { upgradeToV7 } from '@renderer/databases/upgrades'
|
import { upgradeToV7 } from '@renderer/databases/upgrades'
|
||||||
import i18n from '@renderer/i18n'
|
import i18n from '@renderer/i18n'
|
||||||
import store from '@renderer/store'
|
import store from '@renderer/store'
|
||||||
|
import { updateKnowledgeBaseFilePath } from '@renderer/services/KnowledgeService'
|
||||||
import { setWebDAVSyncState } from '@renderer/store/backup'
|
import { setWebDAVSyncState } from '@renderer/store/backup'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
|
|
||||||
@ -32,6 +33,7 @@ export async function restore() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await handleData(data)
|
await handleData(data)
|
||||||
|
await updateKnowledgeBaseFilePath()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
Logger.error('[Backup] restore: Error restoring backup file:', error)
|
Logger.error('[Backup] restore: Error restoring backup file:', error)
|
||||||
window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' })
|
window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' })
|
||||||
@ -211,6 +213,7 @@ export async function restoreFromWebdav(fileName?: string) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await handleData(JSON.parse(data))
|
await handleData(JSON.parse(data))
|
||||||
|
await updateKnowledgeBaseFilePath()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[Backup] Error downloading file from WebDAV:', error)
|
console.error('[Backup] Error downloading file from WebDAV:', error)
|
||||||
window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' })
|
window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' })
|
||||||
|
|||||||
@ -12,6 +12,10 @@ class FileManager {
|
|||||||
return files
|
return files
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async resolveFilePath(name: string): Promise<string> {
|
||||||
|
return window.api.file.resolveFilePath(name)
|
||||||
|
}
|
||||||
|
|
||||||
static async addFile(file: FileType): Promise<FileType> {
|
static async addFile(file: FileType): Promise<FileType> {
|
||||||
const fileRecord = await db.files.get(file.id)
|
const fileRecord = await db.files.get(file.id)
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import { getEmbeddingMaxContext } from '@renderer/config/embedings'
|
|||||||
import Logger from '@renderer/config/logger'
|
import Logger from '@renderer/config/logger'
|
||||||
import AiProvider from '@renderer/providers/AiProvider'
|
import AiProvider from '@renderer/providers/AiProvider'
|
||||||
import store from '@renderer/store'
|
import store from '@renderer/store'
|
||||||
|
import { updateBases } from '@renderer/store/knowledge'
|
||||||
import { FileType, KnowledgeBase, KnowledgeBaseParams, KnowledgeReference } from '@renderer/types'
|
import { FileType, KnowledgeBase, KnowledgeBaseParams, KnowledgeReference } from '@renderer/types'
|
||||||
import { ExtractResults } from '@renderer/utils/extract'
|
import { ExtractResults } from '@renderer/utils/extract'
|
||||||
import { isEmpty } from 'lodash'
|
import { isEmpty } from 'lodash'
|
||||||
@ -11,6 +12,29 @@ import { isEmpty } from 'lodash'
|
|||||||
import { getProviderByModel } from './AssistantService'
|
import { getProviderByModel } from './AssistantService'
|
||||||
import FileManager from './FileManager'
|
import FileManager from './FileManager'
|
||||||
|
|
||||||
|
export const updateKnowledgeBaseFilePath = async () => {
|
||||||
|
const bases = store.getState().knowledge.bases
|
||||||
|
const updatedBases = await Promise.all(
|
||||||
|
bases.map(async (base) => {
|
||||||
|
const updatedBase = { ...base }
|
||||||
|
updatedBase.items = await Promise.all(
|
||||||
|
base.items.map(async (item) => {
|
||||||
|
const updatedItem = { ...item }
|
||||||
|
if (item.type === 'file' || item.type === 'directory') {
|
||||||
|
updatedItem.content = { ...(item.content as FileType) }
|
||||||
|
updatedItem.content.path = await FileManager.resolveFilePath(updatedItem.content.name)
|
||||||
|
}
|
||||||
|
return updatedItem
|
||||||
|
})
|
||||||
|
)
|
||||||
|
return updatedBase
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
// 使用 dispatch 更新状态
|
||||||
|
store.dispatch(updateBases(updatedBases))
|
||||||
|
}
|
||||||
|
|
||||||
export const getKnowledgeBaseParams = (base: KnowledgeBase): KnowledgeBaseParams => {
|
export const getKnowledgeBaseParams = (base: KnowledgeBase): KnowledgeBaseParams => {
|
||||||
const provider = getProviderByModel(base.model)
|
const provider = getProviderByModel(base.model)
|
||||||
const rerankProvider = getProviderByModel(base.rerankModel)
|
const rerankProvider = getProviderByModel(base.rerankModel)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user