Files
payload/src/uploads/getSafeFilename.ts
2023-05-04 16:35:55 -04:00

34 lines
1.2 KiB
TypeScript

import sanitize from 'sanitize-filename';
import { CollectionModel } from '../collections/config/types';
import docWithFilenameExists from './docWithFilenameExists';
import fileExists from './fileExists';
const incrementName = (name: string) => {
const extension = name.split('.').pop();
const baseFilename = sanitize(name.substring(0, name.lastIndexOf('.')) || name);
let incrementedName = baseFilename;
const regex = /(.*)-(\d+)$/;
const found = baseFilename.match(regex);
if (found === null) {
incrementedName += '-1';
} else {
const matchedName = found[1];
const matchedNumber = found[2];
const incremented = Number(matchedNumber) + 1;
incrementedName = `${matchedName}-${incremented}`;
}
return `${incrementedName}.${extension}`;
};
async function getSafeFileName(Model: CollectionModel, staticPath: string, desiredFilename: string): Promise<string> {
let modifiedFilename = desiredFilename;
// eslint-disable-next-line no-await-in-loop
while (await docWithFilenameExists(Model, staticPath, modifiedFilename) || await fileExists(`${staticPath}/${modifiedFilename}`)) {
modifiedFilename = incrementName(modifiedFilename);
}
return modifiedFilename;
}
export default getSafeFileName;