@fdm-monster/server
Version:
FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.
71 lines (70 loc) • 2.99 kB
JavaScript
import { ValidationException } from "../../exceptions/runtime.exceptions.js";
import { AppConstants } from "../../server.constants.js";
import { getMediaPath } from "../../utils/fs.utils.js";
import { errorSummary } from "../../utils/error.utils.js";
import { extname, join } from "node:path";
import { existsSync, readdirSync, rmSync } from "node:fs";
import multer, { diskStorage, memoryStorage } from "multer";
//#region src/services/core/multer.service.ts
var MulterService = class MulterService {
logger;
constructor(loggerFactory, fileUploadTrackerCache) {
this.fileUploadTrackerCache = fileUploadTrackerCache;
this.logger = loggerFactory(MulterService.name);
}
startTrackingSession(multerFile, printerId) {
return this.fileUploadTrackerCache.addUploadTracker(multerFile, printerId);
}
clearUploadsFolder() {
const fileUploadsPath = join(getMediaPath(), AppConstants.defaultFileUploadsStorage);
if (!existsSync(fileUploadsPath)) return;
const files = readdirSync(fileUploadsPath, { withFileTypes: true }).filter((item) => !item.isDirectory()).map((item) => item.name);
for (const file of files) try {
rmSync(join(fileUploadsPath, file));
} catch (error) {
this.logger.error(`Could not clear upload file in temporary folder ${errorSummary(error)}`);
}
}
clearUploadedFile(multerFile) {
if (existsSync(multerFile.path)) rmSync(multerFile.path);
else this.logger.warn("Cannot unlink temporarily uploaded file as it was not found");
}
getMulterGCodeFileFilter(storeAsFile = true) {
return this.getMulterFileFilter(storeAsFile);
}
async multerLoadFileAsync(req, res, fileExtensions, storeAsFile = true) {
const files = await new Promise((resolve, reject) => this.getMulterFileFilter(storeAsFile)(req, res, (err) => {
if (err) return reject(err);
resolve(req.files);
}));
this.validateUploadedFiles(files, fileExtensions, storeAsFile);
return files;
}
/**
* Validates uploaded files against allowed extensions.
* Removes invalid files if stored on disk and throws a ValidationException.
*/
validateUploadedFiles(files, allowedExtensions, storeAsFile) {
if (!files?.length || !allowedExtensions?.length) return;
for (const file of files) {
const ext = extname(file.originalname)?.toLowerCase();
if (!allowedExtensions.includes(ext)) {
if (storeAsFile && file.path && existsSync(file.path)) try {
rmSync(file.path);
} catch (e) {
this.logger.error(`Could not remove invalid file ${errorSummary(e)}`);
}
throw new ValidationException({ error: `Only files with extensions ${allowedExtensions.join(", ")} are allowed` });
}
}
}
getMulterFileFilter(storeAsFile = true) {
return multer({ storage: storeAsFile ? diskStorage({ destination: join(getMediaPath(), AppConstants.defaultFileUploadsStorage) }) : memoryStorage() }).any();
}
getSessions() {
return this.fileUploadTrackerCache.getUploads();
}
};
//#endregion
export { MulterService };
//# sourceMappingURL=multer.service.js.map