UNPKG

@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
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