diff --git a/packages/auth/src/db/Replication.js b/packages/auth/src/db/Replication.js index 3a4f71a78e..9720776413 100644 --- a/packages/auth/src/db/Replication.js +++ b/packages/auth/src/db/Replication.js @@ -11,47 +11,9 @@ class Replication { this.target = getDB(target) } - sync(opts) { - return new Promise((resolve, reject) => { - this.source - .sync(this.target, opts) - .on("change", function (info) { - // handle change - }) - .on("paused", function (err) { - // replication paused (e.g. replication up to date, user went offline) - }) - .on("active", function () { - // replicate resumed (e.g. new changes replicating, user went back online) - }) - .on("denied", function (err) { - // a document failed to replicate (e.g. due to permissions) - return reject( - new Error(`Denied: Document failed to replicate ${err}`) - ) - }) - .on("complete", function (info) { - return resolve(info) - }) - .on("error", function (err) { - return reject(new Error(`Replication Error: ${err}`)) - }) - }) - } - - replicate() { - return new Promise((resolve, reject) => { - this.replication = this.source.replicate - .to(this.target) - // .on("change", function (info) { - // // handle change - // }) - // .on("paused", function (err) { - // // replication paused (e.g. replication up to date, user went offline) - // }) - // .on("active", function () { - // // replicate resumed (e.g. new changes replicating, user went back online) - // }) + promisify(operation, opts = {}) { + return new Promise(resolve => { + operation(this.target, opts) .on("denied", function (err) { // a document failed to replicate (e.g. due to permissions) throw new Error(`Denied: Document failed to replicate ${err}`) @@ -65,6 +27,40 @@ class Replication { }) } + /** + * Two way replication operation, intended to be promise based. + * @param {Object} opts - PouchDB replication options + */ + sync(opts) { + this.replication = this.promisify(this.source.sync, opts) + return this.replication + } + + /** + * One way replication operation, intended to be promise based. + * @param {Object} opts - PouchDB replication options + */ + replicate(opts) { + this.replication = this.promisify(this.source.replicate.to, opts) + return this.replication + } + + /** + * Set up an ongoing live sync between 2 CouchDB databases. + * @param {Object} opts - PouchDB replication options + */ + subscribe(opts = {}) { + this.replication = this.source.replicate + .to(this.target, { + live: true, + retry: true, + ...opts, + }) + .on("error", function (err) { + throw new Error(`Replication Error: ${err}`) + }) + } + async rollback() { await this.target.destroy() await this.replicate() diff --git a/packages/builder/src/components/settings/SettingsModal.svelte b/packages/builder/src/components/settings/SettingsModal.svelte index 5563ad9fbd..f881720305 100644 --- a/packages/builder/src/components/settings/SettingsModal.svelte +++ b/packages/builder/src/components/settings/SettingsModal.svelte @@ -1,5 +1,5 @@ @@ -13,9 +13,9 @@ - + diff --git a/packages/builder/src/components/start/AppCard.svelte b/packages/builder/src/components/start/AppCard.svelte index a92c2eeb23..174ac585d4 100644 --- a/packages/builder/src/components/start/AppCard.svelte +++ b/packages/builder/src/components/start/AppCard.svelte @@ -18,6 +18,7 @@ export let openApp export let deleteApp export let releaseLock + export let deletable
@@ -34,9 +35,11 @@ exportApp(app)} icon="Download"> Export - deleteApp(app)} icon="Delete"> + {#if deletable} + deleteApp(app)} icon="Delete"> Delete + {/if} {#if app.lockedBy && app.lockedBy?.email === $auth.user?.email} releaseLock(app._id)} icon="LockOpen"> Release Lock diff --git a/packages/builder/src/components/start/AppRow.svelte b/packages/builder/src/components/start/AppRow.svelte index 525220e4fb..693c717ab5 100644 --- a/packages/builder/src/components/start/AppRow.svelte +++ b/packages/builder/src/components/start/AppRow.svelte @@ -16,13 +16,14 @@ export let openApp export let exportApp export let deleteApp - export let last export let releaseLock + export let last + export let deletable
- + openApp(app)}> {app.name} @@ -45,7 +46,9 @@ exportApp(app)} icon="Download">Export - deleteApp(app)} icon="Delete">Delete + {#if deletable} + deleteApp(app)} icon="Delete">Delete + {/if} {#if app.lockedBy && app.lockedBy?.email === $auth.user?.email} releaseLock(app._id)} icon="LockOpen"> Release Lock diff --git a/packages/builder/src/constants/index.js b/packages/builder/src/constants/index.js index 6128b78109..e93ea3a593 100644 --- a/packages/builder/src/constants/index.js +++ b/packages/builder/src/constants/index.js @@ -11,6 +11,7 @@ export const FrontendTypes = { export const AppStatus = { DEV: "dev", + DEPLOYED: "deployed" } // fields on the user table that cannot be edited diff --git a/packages/builder/src/pages/builder/portal/apps/index.svelte b/packages/builder/src/pages/builder/portal/apps/index.svelte index 935e180f71..6d4d69758d 100644 --- a/packages/builder/src/pages/builder/portal/apps/index.svelte +++ b/packages/builder/src/pages/builder/portal/apps/index.svelte @@ -95,6 +95,7 @@ await del(`/api/applications/${appToDelete?._id}`) await apps.load() appToDelete = null + notifications.success("App deleted successfully.") } const releaseLock = async appId => { @@ -159,6 +160,7 @@ {#each $apps as app, idx (app._id)}