Add missing endpoint /down

This commit is contained in:
KernelDeimos
2024-04-15 16:38:03 -04:00
parent 66fecf88ef
commit 397819d45e
2 changed files with 73 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
"use strict"
const express = require('express');
const router = express.Router();
const auth = require('../middleware/auth.js');
const config = require('../config.js');
const fs = require('../middleware/fs.js');
const { DB_WRITE } = require('../services/database/consts.js');
const { NodePathSelector } = require('../filesystem/node/selectors.js');
const { HLRead } = require('../filesystem/hl_operations/hl_read.js');
// -----------------------------------------------------------------------//
// GET /down
// -----------------------------------------------------------------------//
router.get('/down', auth, fs, express.json(), async (req, res, next)=>{
// check subdomain
if(require('../helpers').subdomain(req) !== 'api')
next();
// check if user is verified
if((config.strict_email_verification_required || req.user.requires_email_confirmation) && !req.user.email_confirmed)
return res.status(400).send({code: 'account_is_not_verified', message: 'Account is not verified'});
// validation
if(!req.query.path)
return res.status(400).send('path is required')
// path must be a string
else if (typeof req.query.path !== 'string')
return res.status(400).send('path must be a string.')
else if(req.query.path.trim() === '')
return res.status(400).send('path cannot be empty')
// modules
const db = req.services.get('database').get(DB_WRITE, 'filesystem');
const _path = require('path');
const {chkperm} = require('../helpers')
const path = _path.resolve('/', req.query.path);
const AWS = require('aws-sdk');
// cannot download the root, because it's a directory!
if(path === '/')
return res.status(400).send('Cannot download a directory.');
// resolve path to its FSEntry
const fsnode = await req.fs.node(new NodePathSelector(path));
// not found
if( ! fsnode.exists() ) {
return res.status(404).send('File not found');
}
// stream data from S3
try{
const hl_read = new HLRead();
const stream = await hl_read.run({
fsNode: fsnode,
user: req.user,
});
// let stream = await s3.getObject({
// Bucket: fsentry.bucket,
// Key: fsentry.uuid, // File name you want to save as in S3
// }).createReadStream().on('error', error => {
// console.log(error);
// });
res.attachment(await fsnode.get('name'));
return stream.pipe(res);
}catch(e){
console.log(e);
return res.type('application/json').status(500).send({message: 'There was an internal problem reading the file.'});
}
})
module.exports = router

View File

@@ -42,6 +42,7 @@ class PuterAPIService extends BaseService {
app.use(require('../routers/drivers/list-interfaces'))
app.use(require('../routers/drivers/usage'))
app.use(require('../routers/confirm-email'))
app.use(require('../routers/down'))
app.use(require('../routers/contactUs'))
app.use(require('../routers/delete-site'))
app.use(require('../routers/get-dev-profile'))