From da5394288203a949bd90a4877a49a773374139b4 Mon Sep 17 00:00:00 2001 From: Abhishek Mane Date: Sun, 21 Jun 2026 17:20:16 +0530 Subject: [PATCH] feat(server): add automatic cleanup of upload files older than 24 hours --- server/index.js | 12 ++++++++++ server/package-lock.json | 10 ++++++++ server/package.json | 1 + server/utils/cleanupUploads.js | 44 ++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 server/utils/cleanupUploads.js diff --git a/server/index.js b/server/index.js index 00ff6de..8c5ff0a 100644 --- a/server/index.js +++ b/server/index.js @@ -8,6 +8,8 @@ const FormData = require('form-data'); const PDFDocument = require('pdfkit'); const path = require('path'); const fs = require('fs'); +const cron = require('node-cron'); +const cleanupOldUploads = require('./utils/cleanupUploads'); require('dotenv').config(); const Analysis = require('./models/Analysis'); @@ -20,6 +22,16 @@ if (!fs.existsSync(uploadsDir)) { fs.mkdirSync(uploadsDir); } +// Schedule automatic cleanup of files older than 24 hours +// Runs every hour, on the hour +cron.schedule('0 * * * *', () => { + console.log('๐Ÿงน Running scheduled uploads cleanup...'); + cleanupOldUploads(); +}); + +// Run once immediately on server start too +cleanupOldUploads(); + // Storage Configuration const storage = multer.diskStorage({ destination: (req, file, cb) => { diff --git a/server/package-lock.json b/server/package-lock.json index a672924..4c18da2 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -17,6 +17,7 @@ "jsonwebtoken": "^9.0.3", "mongoose": "^9.5.0", "multer": "^2.1.1", + "node-cron": "^4.4.1", "pdfkit": "^0.18.0", "zod": "^4.4.3" } @@ -1170,6 +1171,15 @@ "node": ">= 0.6" } }, + "node_modules/node-cron": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.4.1.tgz", + "integrity": "sha512-1e4Gku1qeKx1ywNnMoA0o5hiZ8iA4klH84TIszTHZAME68xVIjLkiBo5KrtowbcOJn8MQqJG/yWHjC/dFdMWyQ==", + "license": "ISC", + "engines": { + "node": ">=20" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", diff --git a/server/package.json b/server/package.json index 09da1ac..23b9e1b 100644 --- a/server/package.json +++ b/server/package.json @@ -19,6 +19,7 @@ "jsonwebtoken": "^9.0.3", "mongoose": "^9.5.0", "multer": "^2.1.1", + "node-cron": "^4.4.1", "pdfkit": "^0.18.0", "zod": "^4.4.3" } diff --git a/server/utils/cleanupUploads.js b/server/utils/cleanupUploads.js new file mode 100644 index 0000000..757d37f --- /dev/null +++ b/server/utils/cleanupUploads.js @@ -0,0 +1,44 @@ +const fs = require('fs'); +const path = require('path'); + +// Path to the uploads folder (server/uploads) +const uploadsDir = path.join(__dirname, '..', 'uploads'); + +// How old a file must be before we delete it (in milliseconds) +const MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours + +function cleanupOldUploads() { + fs.readdir(uploadsDir, (err, files) => { + if (err) { + console.error('โŒ Cleanup: failed to read uploads directory:', err.message); + return; + } + + const now = Date.now(); + + files.forEach((file) => { + const filePath = path.join(uploadsDir, file); + + fs.stat(filePath, (err, stats) => { + if (err) { + console.error(`โŒ Cleanup: failed to stat file ${file}:`, err.message); + return; + } + + const fileAge = now - stats.mtimeMs; + + if (fileAge > MAX_AGE_MS) { + fs.unlink(filePath, (err) => { + if (err) { + console.error(`โŒ Cleanup: failed to delete ${file}:`, err.message); + } else { + console.log(`๐Ÿ—‘๏ธ Cleanup: deleted old file ${file}`); + } + }); + } + }); + }); + }); +} + +module.exports = cleanupOldUploads; \ No newline at end of file