Update:Check if directory already exists before upload #1497

This commit is contained in:
advplyr 2023-05-27 16:00:34 -05:00
parent 0678c26627
commit 9712bdf5f0
5 changed files with 61 additions and 12 deletions

View File

@ -114,6 +114,7 @@ export default {
var files = this.item.itemFiles.concat(this.item.otherFiles) var files = this.item.itemFiles.concat(this.item.otherFiles)
return { return {
index: this.item.index, index: this.item.index,
directory: this.directory,
...this.itemData, ...this.itemData,
files files
} }

View File

@ -78,6 +78,7 @@
</template> </template>
<script> <script>
import Path from 'path'
import uploadHelpers from '@/mixins/uploadHelpers' import uploadHelpers from '@/mixins/uploadHelpers'
export default { export default {
@ -243,7 +244,7 @@ export default {
ref.setUploadStatus(status) ref.setUploadStatus(status)
} }
}, },
uploadItem(item) { async uploadItem(item) {
var form = new FormData() var form = new FormData()
form.set('title', item.title) form.set('title', item.title)
if (!this.selectedLibraryIsPodcast) { if (!this.selectedLibraryIsPodcast) {
@ -294,18 +295,41 @@ export default {
return return
} }
var items = this.validateItems() const items = this.validateItems()
if (!items) { if (!items) {
this.$toast.error('Some invalid items') this.$toast.error('Some invalid items')
return return
} }
this.processing = true this.processing = true
var itemsUploaded = 0
var itemsFailed = 0 const itemsToUpload = []
for (let i = 0; i < items.length; i++) {
var item = items[i] // Check if path already exists before starting upload
// uploading fails if path already exists
for (const item of items) {
const filepath = Path.join(this.selectedFolder.fullPath, item.directory)
const exists = await this.$axios
.$post(`/api/filesystem/pathexists`, { filepath })
.then((data) => {
if (data.exists) {
this.$toast.error(`Filepath "${filepath}" already exists on server`)
}
return data.exists
})
.catch((error) => {
console.error('Failed to check if filepath exists', error)
return false
})
if (!exists) {
itemsToUpload.push(item)
}
}
let itemsUploaded = 0
let itemsFailed = 0
for (const item of itemsToUpload) {
this.updateItemCardStatus(item.index, 'uploading') this.updateItemCardStatus(item.index, 'uploading')
var result = await this.uploadItem(item) const result = await this.uploadItem(item)
if (result) itemsUploaded++ if (result) itemsUploaded++
else itemsFailed++ else itemsFailed++
this.updateItemCardStatus(item.index, result ? 'success' : 'failed') this.updateItemCardStatus(item.index, result ? 'success' : 'failed')

View File

@ -4,7 +4,7 @@ const SupportedFileTypes = {
ebook: ['epub', 'pdf', 'mobi', 'azw3', 'cbr', 'cbz'], ebook: ['epub', 'pdf', 'mobi', 'azw3', 'cbr', 'cbz'],
info: ['nfo'], info: ['nfo'],
text: ['txt'], text: ['txt'],
metadata: ['opf', 'abs'] metadata: ['opf', 'abs', 'xml', 'json']
} }
const DownloadStatus = { const DownloadStatus = {

View File

@ -1,27 +1,50 @@
const Logger = require('../Logger')
const Path = require('path') const Path = require('path')
const Logger = require('../Logger')
const fs = require('../libs/fsExtra')
class FileSystemController { class FileSystemController {
constructor() { } constructor() { }
async getPaths(req, res) { async getPaths(req, res) {
var excludedDirs = ['node_modules', 'client', 'server', '.git', 'static', 'build', 'dist', 'metadata', 'config', 'sys', 'proc'].map(dirname => { if (!req.user.isAdminOrUp) {
Logger.error(`[FileSystemController] Non-admin user attempting to get filesystem paths`, req.user)
return res.sendStatus(403)
}
const excludedDirs = ['node_modules', 'client', 'server', '.git', 'static', 'build', 'dist', 'metadata', 'config', 'sys', 'proc'].map(dirname => {
return Path.sep + dirname return Path.sep + dirname
}) })
// Do not include existing mapped library paths in response // Do not include existing mapped library paths in response
this.db.libraries.forEach(lib => { this.db.libraries.forEach(lib => {
lib.folders.forEach((folder) => { lib.folders.forEach((folder) => {
var dir = folder.fullPath let dir = folder.fullPath
if (dir.includes(global.appRoot)) dir = dir.replace(global.appRoot, '') if (dir.includes(global.appRoot)) dir = dir.replace(global.appRoot, '')
excludedDirs.push(dir) excludedDirs.push(dir)
}) })
}) })
Logger.debug(`[Server] get file system paths, excluded: ${excludedDirs.join(', ')}`)
res.json({ res.json({
directories: await this.getDirectories(global.appRoot, '/', excludedDirs) directories: await this.getDirectories(global.appRoot, '/', excludedDirs)
}) })
} }
// POST: api/filesystem/pathexists
async checkPathExists(req, res) {
if (!req.user.canUpload) {
Logger.error(`[FileSystemController] Non-admin user attempting to check path exists`, req.user)
return res.sendStatus(403)
}
const filepath = req.body.filepath
if (!filepath?.length) {
return res.sendStatus(400)
}
const exists = await fs.pathExists(filepath)
res.json({
exists
})
}
} }
module.exports = new FileSystemController() module.exports = new FileSystemController()

View File

@ -197,6 +197,7 @@ class ApiRouter {
// File System Routes // File System Routes
// //
this.router.get('/filesystem', FileSystemController.getPaths.bind(this)) this.router.get('/filesystem', FileSystemController.getPaths.bind(this))
this.router.post('/filesystem/pathexists', FileSystemController.checkPathExists.bind(this))
// //
// Author Routes // Author Routes