119 lines
3.2 KiB
TypeScript
119 lines
3.2 KiB
TypeScript
|
|
import ApiService from './api.service'
|
||
|
|
import type {
|
||
|
|
FileItem,
|
||
|
|
CreateFolderRequest,
|
||
|
|
RenameItemRequest,
|
||
|
|
MoveItemRequest,
|
||
|
|
DeleteItemRequest,
|
||
|
|
UploadFileRequest,
|
||
|
|
} from '@/types/fileManagement'
|
||
|
|
|
||
|
|
class FileManagementService {
|
||
|
|
// Get files and folders for a specific directory
|
||
|
|
async getItems(folderId?: string): Promise<{ data: { items: FileItem[] } }> {
|
||
|
|
const params = folderId ? { parentId: folderId } : {}
|
||
|
|
|
||
|
|
return ApiService.fetchData<{ items: FileItem[] }>({
|
||
|
|
url: `/api/files`,
|
||
|
|
method: 'GET',
|
||
|
|
params,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Create a new folder
|
||
|
|
async createFolder(request: CreateFolderRequest): Promise<{ data: FileItem }> {
|
||
|
|
return ApiService.fetchData<FileItem>({
|
||
|
|
url: `/api/files/folders`,
|
||
|
|
method: 'POST',
|
||
|
|
data: request as any,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Upload a file
|
||
|
|
async uploadFile(request: UploadFileRequest): Promise<{ data: FileItem }> {
|
||
|
|
const formData = new FormData()
|
||
|
|
formData.append('file', request.file)
|
||
|
|
if (request.parentId) {
|
||
|
|
formData.append('parentId', request.parentId)
|
||
|
|
}
|
||
|
|
|
||
|
|
return ApiService.fetchData<FileItem>({
|
||
|
|
url: `/api/files/upload`,
|
||
|
|
method: 'POST',
|
||
|
|
data: formData as any,
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'multipart/form-data',
|
||
|
|
},
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Rename a file or folder
|
||
|
|
async renameItem(request: RenameItemRequest): Promise<{ data: FileItem }> {
|
||
|
|
return ApiService.fetchData<FileItem>({
|
||
|
|
url: `/api/files/${request.id}/rename`,
|
||
|
|
method: 'PUT',
|
||
|
|
data: { name: request.newName },
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Move a file or folder
|
||
|
|
async moveItem(request: MoveItemRequest): Promise<{ data: FileItem }> {
|
||
|
|
return ApiService.fetchData<FileItem>({
|
||
|
|
url: `/api/files/${request.itemId}/move`,
|
||
|
|
method: 'PUT',
|
||
|
|
data: { targetFolderId: request.targetFolderId },
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Delete a file or folder
|
||
|
|
async deleteItem(request: DeleteItemRequest): Promise<void> {
|
||
|
|
await ApiService.fetchData<void>({
|
||
|
|
url: `/api/files/${request.id}`,
|
||
|
|
method: 'DELETE',
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Download a file
|
||
|
|
async downloadFile(fileId: string): Promise<Blob> {
|
||
|
|
const response = await ApiService.fetchData<Blob>({
|
||
|
|
url: `/api/files/${fileId}/download`,
|
||
|
|
method: 'GET',
|
||
|
|
responseType: 'blob',
|
||
|
|
})
|
||
|
|
return response.data
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get file preview/thumbnail
|
||
|
|
async getFilePreview(fileId: string): Promise<string> {
|
||
|
|
const response = await ApiService.fetchData<Blob>({
|
||
|
|
url: `/api/files/${fileId}/preview`,
|
||
|
|
method: 'GET',
|
||
|
|
responseType: 'blob',
|
||
|
|
})
|
||
|
|
return URL.createObjectURL(response.data)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Search files and folders
|
||
|
|
async searchItems(query: string, folderId?: string): Promise<{ data: { items: FileItem[] } }> {
|
||
|
|
const params = {
|
||
|
|
q: query,
|
||
|
|
...(folderId && { parentId: folderId }),
|
||
|
|
}
|
||
|
|
|
||
|
|
return ApiService.fetchData<{ items: FileItem[] }>({
|
||
|
|
url: `/api/files/search`,
|
||
|
|
method: 'GET',
|
||
|
|
params,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get folder breadcrumb path
|
||
|
|
async getFolderPath(folderId?: string): Promise<{ data: { path: Array<{ id: string; name: string }> } }> {
|
||
|
|
return ApiService.fetchData<{ path: Array<{ id: string; name: string }> }>({
|
||
|
|
url: `/api/files/folders/${folderId || 'root'}/path`,
|
||
|
|
method: 'GET',
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export default new FileManagementService()
|