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()
}