simple-http-file-api/index.js
Schneider Roland bc8e58e472 add auth
2025-02-21 23:37:46 +01:00

108 lines
2.9 KiB
JavaScript

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())
app.use((req, res, next) =>{
const authenticated = req.get('Authorization') === 'Bearer ' + process.env.API_KEY ;
if(!authenticated){
return res.status(401).send('Unauthorized');
}
next();
});
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}`)
})