diff --git a/src/api/admin.js b/src/api/admin.js index d0d4042..22c2033 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -1,3 +1,4 @@ +const path = require('path'); const Joi = require('joi'); const fileExplorer = require('../util/file-explorer'); @@ -5,7 +6,10 @@ exports.setup = (mstream, program) => { // The admin file explorer can view the entire system mstream.post("/api/v1/admin/file-explorer", async (req, res) => { try { - const schema = Joi.object({ directory: Joi.string().required() }); + const schema = Joi.object({ + directory: Joi.string().required(), + joinDirectory: Joi.string().optional() + }); await schema.validateAsync(req.body); }catch (err) { return res.status(500).json({ error: 'Validation Error' }); @@ -13,15 +17,24 @@ exports.setup = (mstream, program) => { try { // Handle home directory - if(req.body.directory === '~') { - req.body.directory = require('os').homedir(); + let thisDirectory = req.body.directory; + if (req.body.directory === '~') { + thisDirectory = require('os').homedir(); } - const folderContents = await fileExplorer.getDirectoryContents(pathInfo.fullPath, program.supportedAudioFiles); - - res.json({ path: returnDirectory, directories: folderContents.directories, files: folderContents.files }); + if (req.body.joinDirectory) { + thisDirectory = path.join(thisDirectory, req.body.joinDirectory); + } + + const folderContents = await fileExplorer.getDirectoryContents(thisDirectory, {}); + + res.json({ + path: thisDirectory, + directories: folderContents.directories, + files: folderContents.files + }); }catch (err) { - return res.status(500).json({ error: 'Validation Error' }); + return res.status(500).json({ error: 'Failed to get directory contents' }); } }); } \ No newline at end of file diff --git a/src/util/file-explorer.js b/src/util/file-explorer.js index c9c3ce1..c95832e 100644 --- a/src/util/file-explorer.js +++ b/src/util/file-explorer.js @@ -8,11 +8,11 @@ function getFileType(pathString) { exports.getDirectoryContents = async (directory, fileTypeFilter) => { try { const rt = { directories: [], files: [] }; - for (const file of await fs.readdir(directory)) { try { var stat = await fs.stat(path.join(directory, file)); - } catch (e) { return; /* Bad file, ignore and continue */ } + } catch (e) { continue; } /* Bad file or permission error, ignore and continue */ + // Handle Directory if (stat.isDirectory()) { rt.directories.push({ name: file }); @@ -35,6 +35,6 @@ exports.getDirectoryContents = async (directory, fileTypeFilter) => { return rt; } catch (err) { - throw 'Failed to get directory contents'; + throw err; } } \ No newline at end of file