diff --git a/packages/builder/src/components/start/ImportAppModal.svelte b/packages/builder/src/components/start/ImportAppModal.svelte index 7d30ded896..1bc32dc7a4 100644 --- a/packages/builder/src/components/start/ImportAppModal.svelte +++ b/packages/builder/src/components/start/ImportAppModal.svelte @@ -54,6 +54,7 @@ label="App export" on:change={e => { file = e.detail?.[0] + encrypted = file?.name?.endsWith(".enc.tar.gz") }} /> diff --git a/packages/server/src/sdk/app/applications/import.ts b/packages/server/src/sdk/app/applications/import.ts index a7788924d8..158e4772b2 100644 --- a/packages/server/src/sdk/app/applications/import.ts +++ b/packages/server/src/sdk/app/applications/import.ts @@ -4,6 +4,8 @@ import { Document, Database, RowValue, + DocumentType, + App, } from "@budibase/types" import backups from "../backups" @@ -12,9 +14,39 @@ export type FileAttributes = { path: string } +async function getNewAppMetadata( + tempDb: Database, + appDb: Database +): Promise { + // static doc denoting app information + const docId = DocumentType.APP_METADATA + try { + const [tempMetadata, appMetadata] = await Promise.all([ + tempDb.get(docId), + appDb.get(docId), + ]) + return { + ...appMetadata, + automationErrors: undefined, + theme: tempMetadata.theme, + customTheme: tempMetadata.customTheme, + features: tempMetadata.features, + icon: tempMetadata.icon, + navigation: tempMetadata.navigation, + type: tempMetadata.type, + version: tempMetadata.version, + } + } catch (err: any) { + throw new Error( + `Unable to retrieve app metadata for import - ${err.message}` + ) + } +} + function mergeUpdateAndDeleteDocuments( updateDocs: Document[], - deleteDocs: Document[] + deleteDocs: Document[], + metadata: App ) { // compress the documents to create and to delete (if same ID, then just update the rev) const finalToDelete = [] @@ -26,7 +58,7 @@ function mergeUpdateAndDeleteDocuments( finalToDelete.push(deleteDoc) } } - return [...updateDocs, ...finalToDelete] + return [...updateDocs, ...finalToDelete, metadata] } async function removeImportableDocuments(db: Database) { @@ -90,12 +122,15 @@ export async function updateWithExport( await backups.importApp(devId, tempDb, template, { importObjStoreContents: false, }) + const newMetadata = await getNewAppMetadata(tempDb, appDb) // get the documents to copy const toUpdate = await getImportableDocuments(tempDb) // clear out the old documents const toDelete = await removeImportableDocuments(appDb) // now bulk update documents - add new ones, delete old ones and update common ones - await appDb.bulkDocs(mergeUpdateAndDeleteDocuments(toUpdate, toDelete)) + await appDb.bulkDocs( + mergeUpdateAndDeleteDocuments(toUpdate, toDelete, newMetadata) + ) } finally { await tempDb.destroy() }