From 488e0c44c0686d3d411112c13b3f4c2db821bc0f Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 13 Oct 2022 15:46:53 +0100 Subject: [PATCH] Fixing multi-app import from cloud. --- packages/server/src/api/controllers/cloud.js | 24 ++++++------------- .../server/src/sdk/app/backups/exports.ts | 2 +- .../server/src/sdk/app/backups/imports.ts | 6 ++++- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/packages/server/src/api/controllers/cloud.js b/packages/server/src/api/controllers/cloud.js index 9397bc69a6..27b576f181 100644 --- a/packages/server/src/api/controllers/cloud.js +++ b/packages/server/src/api/controllers/cloud.js @@ -3,15 +3,9 @@ const { getAllApps, getGlobalDBName } = require("@budibase/backend-core/db") const { getGlobalDB } = require("@budibase/backend-core/tenancy") const { streamFile } = require("../../utilities/fileSystem") const { stringToReadStream } = require("../../utilities") -const { - getDocParams, - DocumentType, - isDevAppID, - APP_PREFIX, -} = require("../../db/utils") +const { getDocParams, DocumentType, isDevAppID } = require("../../db/utils") const { create } = require("./application") const { join } = require("path") -const fs = require("fs") const sdk = require("../../sdk") async function createApp(appName, appDirectory) { @@ -41,9 +35,9 @@ async function getAllDocType(db, docType) { } exports.exportApps = async ctx => { - if (env.SELF_HOSTED || !env.MULTI_TENANCY) { - ctx.throw(400, "Exporting only allowed in multi-tenant cloud environments.") - } + // if (env.SELF_HOSTED || !env.MULTI_TENANCY) { + // ctx.throw(400, "Exporting only allowed in multi-tenant cloud environments.") + // } const apps = await getAllApps({ all: true }) const globalDBString = await sdk.backups.exportDB(getGlobalDBName(), { filter: doc => !doc._id.startsWith(DocumentType.USER), @@ -92,20 +86,16 @@ exports.importApps = async ctx => { } // initially get all the app databases out of the tarball - const tmpPath = sdk.backups.untarFile(ctx.request.file.importFile) + const tmpPath = sdk.backups.untarFile(ctx.request.files.importFile) const globalDbImport = sdk.backups.getGlobalDBFile(tmpPath) - const appNames = fs - .readdirSync(tmpPath) - .filter(dir => dir.startsWith(APP_PREFIX)) + const appNames = sdk.backups.getListOfAppsInMulti(tmpPath) const globalDb = getGlobalDB() // load the global db first await globalDb.load(stringToReadStream(globalDbImport)) - const appCreationPromises = [] for (let appName of appNames) { - appCreationPromises.push(createApp(appName, join(tmpPath, appName))) + await createApp(appName, join(tmpPath, appName)) } - await Promise.all(appCreationPromises) // if there are any users make sure to remove them let users = await getAllDocType(globalDb, DocumentType.USER) diff --git a/packages/server/src/sdk/app/backups/exports.ts b/packages/server/src/sdk/app/backups/exports.ts index 5a028c27a9..4656a83d51 100644 --- a/packages/server/src/sdk/app/backups/exports.ts +++ b/packages/server/src/sdk/app/backups/exports.ts @@ -141,7 +141,7 @@ export async function exportMultipleApps( // export each app to a directory, then move it into the complete export const exportAndMove = async (appId: string, appName: string) => { const path = await exportApp(appId) - await fs.promises.rename(path, join(tmpPath, appId)) + await fs.promises.rename(path, join(tmpPath, appName)) } for (let metadata of appMetadata) { exportPromises.push(exportAndMove(metadata.appId, metadata.name)) diff --git a/packages/server/src/sdk/app/backups/imports.ts b/packages/server/src/sdk/app/backups/imports.ts index 13d8e7aab0..d09c4b3f02 100644 --- a/packages/server/src/sdk/app/backups/imports.ts +++ b/packages/server/src/sdk/app/backups/imports.ts @@ -1,5 +1,5 @@ import { db as dbCore } from "@budibase/backend-core" -import { TABLE_ROW_PREFIX } from "../../../db/utils" +import { APP_PREFIX, TABLE_ROW_PREFIX } from "../../../db/utils" import { budibaseTempDir } from "../../../utilities/budibaseDir" import { DB_EXPORT_FILE, @@ -111,6 +111,10 @@ export function getGlobalDBFile(tmpPath: string) { return fs.readFileSync(join(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8") } +export function getListOfAppsInMulti(tmpPath: string) { + return fs.readdirSync(tmpPath).filter(dir => dir !== GLOBAL_DB_EXPORT_FILE) +} + export async function importApp( appId: string, db: PouchDB.Database,