diff --git a/packages/api/src/controllers/archive.js b/packages/api/src/controllers/archive.js index a4d42852b..9b3671233 100644 --- a/packages/api/src/controllers/archive.js +++ b/packages/api/src/controllers/archive.js @@ -7,6 +7,7 @@ const { archivedir, clearArchiveLinksCache, resolveArchiveFolder } = require('.. const socket = require('../utility/socket'); const JsonLinesDatastore = require('../utility/JsonLinesDatastore'); const { saveFreeTableData } = require('../utility/freeTableStorage'); +const loadFilesRecursive = require('../utility/loadFilesRecursive'); module.exports = { folders_meta: 'get', @@ -46,7 +47,7 @@ module.exports = { async files({ folder }) { const dir = resolveArchiveFolder(folder); if (!(await fs.exists(dir))) return []; - const files = await fs.readdir(dir); + const files = await loadFilesRecursive(dir); // fs.readdir(dir); function fileType(ext, type) { return files diff --git a/packages/api/src/utility/importDbModel.js b/packages/api/src/utility/importDbModel.js index 162ebfd3a..f0030eafe 100644 --- a/packages/api/src/utility/importDbModel.js +++ b/packages/api/src/utility/importDbModel.js @@ -4,13 +4,14 @@ const yaml = require('js-yaml'); const { databaseInfoFromYamlModel, DatabaseAnalyser } = require('dbgate-tools'); const { startsWith } = require('lodash'); const { archivedir, resolveArchiveFolder } = require('./directories'); +const loadFilesRecursive = require('./loadFilesRecursive'); async function importDbModel(inputDir) { const files = []; const dir = inputDir.startsWith('archive:') ? resolveArchiveFolder(inputDir.substring('archive:'.length)) : inputDir; - for (const name of await fs.readdir(dir)) { + for (const name of await loadFilesRecursive(dir)) { if (name.endsWith('.table.yaml') || name.endsWith('.sql')) { const text = await fs.readFile(path.join(dir, name), { encoding: 'utf-8' }); diff --git a/packages/api/src/utility/loadFilesRecursive.js b/packages/api/src/utility/loadFilesRecursive.js new file mode 100644 index 000000000..fd8ef952d --- /dev/null +++ b/packages/api/src/utility/loadFilesRecursive.js @@ -0,0 +1,20 @@ +const fs = require('fs-extra'); +const stream = require('stream'); +const readline = require('readline'); +const path = require('path'); + +async function loadFilesRecursive(dir, root = null) { + if (!root) root = dir; + if (!root.endsWith(path.sep)) root += path.sep; + const dirents = await fs.readdir(dir, { withFileTypes: true }); + const files = await Promise.all( + dirents.map(dirent => { + const res = path.join(dir, dirent.name); + return dirent.isDirectory() ? loadFilesRecursive(res, root) : res; + }) + ); + const flatten = Array.prototype.concat(...files); + return flatten.map(file => (file.startsWith(root) ? file.substr(root.length) : file)); +} + +module.exports = loadFilesRecursive;