From 397819d45ef5cce87040f2ae4d43c1d382e746e5 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Mon, 15 Apr 2024 16:38:03 -0400 Subject: [PATCH] Add missing endpoint /down --- packages/backend/src/routers/down.js | 72 +++++++++++++++++++ .../backend/src/services/PuterAPIService.js | 1 + 2 files changed, 73 insertions(+) create mode 100644 packages/backend/src/routers/down.js diff --git a/packages/backend/src/routers/down.js b/packages/backend/src/routers/down.js new file mode 100644 index 000000000..266c2701c --- /dev/null +++ b/packages/backend/src/routers/down.js @@ -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 diff --git a/packages/backend/src/services/PuterAPIService.js b/packages/backend/src/services/PuterAPIService.js index 4976252b5..e7f1c5a04 100644 --- a/packages/backend/src/services/PuterAPIService.js +++ b/packages/backend/src/services/PuterAPIService.js @@ -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'))