ソースを参照

Add missing endpoint /down

KernelDeimos 1 年間 前
コミット
397819d45e

+ 72 - 0
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

+ 1 - 0
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'))