const express = require('express') const fileUpload = require('express-fileupload') const app = express() const fs = require('fs'); const port = 3000 const uploadPath = process.env.UPLOAD_PATH || '/tmp'; const config = process.env.config || '{ "uploadGroups": [{ "matcher": "^test.*\.txt$", "groupSize": 3}] } '; app.use(fileUpload()) const processGroups = () => { const files = [] = fs.readdirSync(uploadPath); // Sort files by modification time (mtime) files.sort((a, b) => { const statA = fs.statSync(uploadPath + "/" + a); const statB = fs.statSync(uploadPath + "/" + b); return statA.mtime - statB.mtime; }); const groups = []; // collection files for defined groups JSON.parse(config).uploadGroups.forEach(group => { //const filesStartingWithPrefix = files.filter(file => new RegExp(group.mathcer).test(file)); const filesStartingWithPrefix = files.filter(file => new RegExp(group.matcher).test(file)); groups.push({ ...group, files: filesStartingWithPrefix }) }); return groups; } const cleanUp = () => { const groups = processGroups(); groups.forEach(group => { if (group.files.length > group.groupSize) { const filesToDelete = group.files.slice(0, group.files.length - group.groupSize); filesToDelete.forEach(file => { console.log(new Date().toISOString() +" Deleting file: ", file); fs.unlinkSync(uploadPath + "/" + file); }); } }); } app.get('/state', (req, res) => { const groups = processGroups(); res.setHeader('Content-Type', 'application/json'); res.send(groups); }); app.get('/', (req, res) => { const files = []; fs.readdirSync(uploadPath).forEach(file => { const stat = fs.statSync(uploadPath + "/" + file); files.push({ name: file, "mtime": stat.mtime }); }); res.setHeader('Content-Type', 'application/json'); res.send(files); }); app.post('/*', function (req, res) { let sampleFile; const uploadedFileKeys = Object.keys(req.files); if (!req.files || uploadedFileKeys.length === 0) { return res.status(400).send('No files were uploaded.'); } let messages = ""; const uploadedFileObj = req.files[uploadedFileKeys[0]]; let uploadFilePath = uploadPath + "/" + uploadedFileObj.name; uploadedFileObj.mv(uploadFilePath, function (err) { if (err) { return res.status(500).send(err); } console.log( new Date().toISOString() +" File uploaded to: ", uploadFilePath); cleanUp(); res.send('File(s) uploaded!'); }); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`) })