From 727fbeceb4b93936ca08d0ca48ac0d2beb1ce96e Mon Sep 17 00:00:00 2001 From: James Date: Mon, 29 Nov 2021 08:33:20 -0500 Subject: [PATCH] fix: #373 --- src/collections/operations/delete.ts | 9 +++++---- src/uploads/docWithFilenameExists.ts | 10 ++++++++++ src/uploads/fileOrDocExists.ts | 20 -------------------- src/uploads/getSafeFilename.ts | 5 +++-- 4 files changed, 18 insertions(+), 26 deletions(-) create mode 100644 src/uploads/docWithFilenameExists.ts delete mode 100644 src/uploads/fileOrDocExists.ts diff --git a/src/collections/operations/delete.ts b/src/collections/operations/delete.ts index 091acbe401..ed442ec26c 100644 --- a/src/collections/operations/delete.ts +++ b/src/collections/operations/delete.ts @@ -5,11 +5,11 @@ import { PayloadRequest } from '../../express/types'; import sanitizeInternalFields from '../../utilities/sanitizeInternalFields'; import { NotFound, Forbidden, ErrorDeletingFile } from '../../errors'; import executeAccess from '../../auth/executeAccess'; -import fileOrDocExists from '../../uploads/fileOrDocExists'; import { BeforeOperationHook, Collection } from '../config/types'; import { Document, Where } from '../../types'; import { hasWhereAccessResult } from '../../auth/types'; import { FileData } from '../../uploads/types'; +import fileExists from '../../uploads/fileExists'; export type Arguments = { depth?: number @@ -106,7 +106,7 @@ async function deleteQuery(incomingArgs: Arguments): Promise { const fileToDelete = `${staticPath}/${resultToDelete.filename}`; - if (await fileOrDocExists(Model, staticPath, resultToDelete.filename)) { + if (await fileExists(fileToDelete)) { fs.unlink(fileToDelete, (err) => { if (err) { throw new ErrorDeletingFile(); @@ -116,8 +116,9 @@ async function deleteQuery(incomingArgs: Arguments): Promise { if (resultToDelete.sizes) { Object.values(resultToDelete.sizes).forEach(async (size: FileData) => { - if (await fileOrDocExists(Model, staticPath, size.filename)) { - fs.unlink(`${staticPath}/${size.filename}`, (err) => { + const sizeToDelete = `${staticPath}/${size.filename}`; + if (await fileExists(sizeToDelete)) { + fs.unlink(sizeToDelete, (err) => { if (err) { throw new ErrorDeletingFile(); } diff --git a/src/uploads/docWithFilenameExists.ts b/src/uploads/docWithFilenameExists.ts new file mode 100644 index 0000000000..209b2ef772 --- /dev/null +++ b/src/uploads/docWithFilenameExists.ts @@ -0,0 +1,10 @@ +import { CollectionModel } from '../collections/config/types'; + +const docWithFilenameExists = async (Model: CollectionModel, path: string, filename: string): Promise => { + const doc = await Model.findOne({ filename }); + if (doc) return true; + + return false; +}; + +export default docWithFilenameExists; diff --git a/src/uploads/fileOrDocExists.ts b/src/uploads/fileOrDocExists.ts deleted file mode 100644 index 4bd2d8a61e..0000000000 --- a/src/uploads/fileOrDocExists.ts +++ /dev/null @@ -1,20 +0,0 @@ -import fs from 'fs'; -import { promisify } from 'util'; -import { CollectionModel } from '../collections/config/types'; - -const stat = promisify(fs.stat); - -const fileOrDocExists = async (Model: CollectionModel, path: string, filename: string): Promise => { - try { - const doc = await Model.findOne({ filename }); - if (doc) return true; - - await stat(`${path}/${filename}`); - - return true; - } catch (err) { - return false; - } -}; - -export default fileOrDocExists; diff --git a/src/uploads/getSafeFilename.ts b/src/uploads/getSafeFilename.ts index 298a24f446..5b31ba3761 100644 --- a/src/uploads/getSafeFilename.ts +++ b/src/uploads/getSafeFilename.ts @@ -1,6 +1,7 @@ import sanitize from 'sanitize-filename'; import { CollectionModel } from '../collections/config/types'; -import fileOrDocExists from './fileOrDocExists'; +import docWithFilenameExists from './docWithFilenameExists'; +import fileExists from './fileExists'; const incrementName = (name: string) => { const extension = name.split('.').pop(); @@ -24,7 +25,7 @@ async function getSafeFileName(Model: CollectionModel, staticPath: string, desir let modifiedFilename = desiredFilename; // eslint-disable-next-line no-await-in-loop - while (await fileOrDocExists(Model, staticPath, modifiedFilename)) { + while (await docWithFilenameExists(Model, staticPath, modifiedFilename) || await fileExists(`${staticPath}/${modifiedFilename}`)) { modifiedFilename = incrementName(modifiedFilename); } return modifiedFilename;