diff --git a/packages/server/src/appMigrations/appMigrationMetadata.ts b/packages/server/src/appMigrations/appMigrationMetadata.ts new file mode 100644 index 0000000000..e871018245 --- /dev/null +++ b/packages/server/src/appMigrations/appMigrationMetadata.ts @@ -0,0 +1,39 @@ +import { Duration, cache, db, env } from "@budibase/backend-core" +import { Database, App, DocumentType, Document } from "@budibase/types" + +export interface AppMigrationDoc extends Document { + version: string +} + +const EXPIRY_SECONDS = Duration.fromDays(1).toSeconds() + +async function populateFromDB(appId: string) { + return db.doWithDB( + appId, + (db: Database) => { + return db.get(DocumentType.APP_MIGRATION_METADATA) + }, + { skip_setup: true } + ) +} + +export async function getAppMigrationMetadata(appId: string): Promise { + const cacheKey = `appmigrations_${env.VERSION}_${appId}` + + let metadata: AppMigrationDoc | undefined = await cache.get(cacheKey) + if (!metadata) { + try { + metadata = await populateFromDB(appId) + } catch (err: any) { + if (err.status !== 404) { + throw err + } + + metadata = { version: "" } + } + + await cache.store(cacheKey, metadata, EXPIRY_SECONDS) + } + + return metadata.version +} diff --git a/packages/types/src/documents/document.ts b/packages/types/src/documents/document.ts index fb9589b24d..18feb9b518 100644 --- a/packages/types/src/documents/document.ts +++ b/packages/types/src/documents/document.ts @@ -37,6 +37,7 @@ export enum DocumentType { USER_FLAG = "flag", AUTOMATION_METADATA = "meta_au", AUDIT_LOG = "al", + APP_MIGRATION_METADATA = "_design/migrations", } // these are the core documents that make up the data, design