Browse Source

Add UI to revert app version and initial work on app revert backend

master
Andrew Kingston 5 years ago
parent
commit
9440e4a5bf
  1. 1
      packages/builder/src/builderStore/store/frontend.js
  2. 62
      packages/builder/src/components/deploy/VersionModal.svelte
  3. 13
      packages/server/src/api/controllers/application.js

1
packages/builder/src/builderStore/store/frontend.js

@ -76,6 +76,7 @@ export const getFrontendStore = () => {
clientLibPath, clientLibPath,
previousTopNavPath: {}, previousTopNavPath: {},
version: application.version, version: application.version,
revertableVersion: application.revertableVersion,
})) }))
await hostingStore.actions.fetch() await hostingStore.actions.fetch()

62
packages/builder/src/components/deploy/VersionModal.svelte

@ -5,6 +5,7 @@
notifications, notifications,
ModalContent, ModalContent,
Body, Body,
Button,
} from "@budibase/bbui" } from "@budibase/bbui"
import { store } from "builderStore" import { store } from "builderStore"
import api from "builderStore/api" import api from "builderStore/api"
@ -14,6 +15,19 @@
$: appId = $store.appId $: appId = $store.appId
$: updateAvailable = clientPackage.version !== $store.version $: updateAvailable = clientPackage.version !== $store.version
$: revertAvailable = $store.revertableVersion != null
const refreshAppPackage = async () => {
const applicationPkg = await api.get(
`/api/applications/${appId}/appPackage`
)
const pkg = await applicationPkg.json()
if (applicationPkg.ok) {
await store.actions.initialise(pkg)
} else {
throw new Error(pkg)
}
}
const update = async () => { const update = async () => {
try { try {
@ -24,24 +38,32 @@
if (response.status !== 200) { if (response.status !== 200) {
throw json.message throw json.message
} }
await refreshAppPackage()
notifications.success(
`App updated successfully to version ${clientPackage.version}`
)
} catch (err) {
notifications.error(`Error updating app: ${err}`)
}
}
// Reset frontend state after revert const revert = async () => {
const applicationPkg = await api.get( try {
`/api/applications/${appId}/appPackage` const response = await api.post(
`/api/applications/${appId}/client/revert`
) )
const pkg = await applicationPkg.json() const json = await response.json()
if (applicationPkg.ok) { if (response.status !== 200) {
await store.actions.initialise(pkg) throw json.message
} else {
throw new Error(pkg)
} }
await refreshAppPackage()
notifications.success( notifications.success(
`App updated successfully to version ${clientPackage.version}` `App reverted successfully to version ${$store.revertableVersion}`
) )
} catch (err) { } catch (err) {
notifications.error(`Error updating app: ${err}`) notifications.error(`Error reverting app: ${err}`)
} }
updateModal.hide()
} }
</script> </script>
@ -56,13 +78,16 @@
onConfirm={update} onConfirm={update}
showConfirmButton={updateAvailable} showConfirmButton={updateAvailable}
> >
<div slot="footer">
{#if revertAvailable}
<Button quiet secondary on:click={revert}>Revert</Button>
{/if}
</div>
{#if updateAvailable} {#if updateAvailable}
<Body size="S"> <Body size="S">
This app is currently using version <b>{$store.version}</b>, but version This app is currently using version <b>{$store.version}</b>, but version
<b>{clientPackage.version}</b> is available. Updates can contain new <b>{clientPackage.version}</b> is available. Updates can contain new features,
features, performance improvements and bug fixes. performance improvements and bug fixes.
<br /><br />
Would you like to update this app?
</Body> </Body>
{:else} {:else}
<Body size="S"> <Body size="S">
@ -70,6 +95,13 @@
latest version available. latest version available.
</Body> </Body>
{/if} {/if}
{#if revertAvailable}
<Body size="S">
You can revert this app to version
<b>{$store.revertableVersion}</b>
if you're experiencing issues with the current version.
</Body>
{/if}
</ModalContent> </ModalContent>
</Modal> </Modal>

13
packages/server/src/api/controllers/application.js

@ -241,8 +241,19 @@ exports.update = async function (ctx) {
} }
exports.updateClient = async function (ctx) { exports.updateClient = async function (ctx) {
// Get current app version
const db = new CouchDB(ctx.params.appId)
const application = await db.get(DocumentTypes.APP_METADATA)
const currentVersion = application.version
// Update client library and manifest
await uploadClientLibrary(ctx.params.appId) await uploadClientLibrary(ctx.params.appId)
const appPackageUpdates = { version: packageJson.version }
// Update versions in app package
const appPackageUpdates = {
version: packageJson.version,
revertableVersion: currentVersion,
}
const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId) const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
ctx.status = 200 ctx.status = 200
ctx.body = data ctx.body = data

Loading…
Cancel
Save