diff --git a/src/_helpers/util.js b/src/_helpers/util.js index 0ed3a99..9fdb15e 100644 --- a/src/_helpers/util.js +++ b/src/_helpers/util.js @@ -184,16 +184,21 @@ export const util = { } }, - handleResponseToDownloadAsFile: function(fileName, messages, errors) { + handleResponseToDownloadAsFile: function(fileName) { return function(response) { - if (!response.ok) return handleCrudResponse(messages, errors)(response); - return downloadBlob(response.blob(), fileName); + return response.blob().then(blob => { + if (!response.ok || response.status != 200) { + console.log("handleResponseToDownloadAsFile: download failes or not ready yet"); + return Promise.reject(response.statusText); + } + return util.downloadBlob(blob, fileName); + }); }; }, handleDataToDownloadAsFile: function(fileName, mimeType) { return function(data) { - return downloadBlob(new Blob([data], {type: mimeType}), fileName); + return util.downloadBlob(new Blob([data], {type: mimeType}), fileName); }; }, diff --git a/src/_services/network.service.js b/src/_services/network.service.js index e285359..03bb605 100644 --- a/src/_services/network.service.js +++ b/src/_services/network.service.js @@ -20,7 +20,8 @@ export const networkService = { requestNetworkKeys, retrieveNetworkKeys, startBackupPackageDownload, - downloadBackupPackage, + backupPackageStatus, + backupPackageDownload, getNetworkBackups, getLogFlag, enableLog, disableLog }; @@ -95,18 +96,18 @@ function startBackupPackageDownload(userId, networkId, code, password, backupId) util.postWithAuth({ name: 'password', value: password })) .then(util.handleBasicResponse); } - -function downloadBackupPackage(userId, networkId, code, messages, errors) { - return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/keys/${code}/backups/download`, +function backupPackageStatus(userId, networkId, code, messages, errors) { + return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/keys/${code}/backups/status`, util.getWithAuth()) - .then(response => { - if (response.status == 202) { - // accepted, but not yet done - setTimeout(() => downloadBackupPackage(userId, networkId, code, messages, errors), 5000); - } else { - return util.handleResponseToDownloadAsFile('backup.' + networkId + '.tgz.enc', messages, errors); - } - }); + .then(util.handleCrudResponse(messages, errors)); +} +function backupPackageDownload(userId, networkId, code, messages, errors) { + const getWithAuth = util.getWithAuth(); + getWithAuth.responseType = 'blob'; + return fetch(`${config.apiUrl}/users/${userId}/networks/${networkId}/actions/keys/${code}/backups/download`, + getWithAuth) + .then(util.handleResponseToDownloadAsFile(`backup.${networkId}.tgz.enc`), + util.handleCrudResponse(messages, errors)); } function getNetworkBackups(userId, networkId, messages, errors) { diff --git a/src/_store/networks.module.js b/src/_store/networks.module.js index 4ba3f66..58e5f6a 100644 --- a/src/_store/networks.module.js +++ b/src/_store/networks.module.js @@ -11,7 +11,7 @@ const state = { networks: false, network: false, stopping: false, restoring: false, deleting: false, nearestRegions: false, startingNetwork: false, networkStatuses: false, networkNodes: false, requestNetworkKeys: false, retrieveNetworkKeys: false, queueBackup: false, managingLogFlag: false, - fullBackupRequested: false + preparingLatestBackup: false }, creating: null, error: null, @@ -156,15 +156,23 @@ const actions = { error => commit('retrieveNetworkKeysFailure', error)); }, - retrieveLatestBackupPackage({ commit }, {userId, networkId, code, password, messages, errors}) { - commit('retrieveLatestBackupPackageRequest'); + buildLatestBackupPackage({ commit }, {userId, networkId, code, password}) { + commit('buildLatestBackupPackageRequest'); networkService.startBackupPackageDownload(userId, networkId, code, password, state.backups[0].uuid) - .then(ok => { - networkService.downloadBackupPackage(userId, networkId, code, messages, errors) - .then(ok => commit('retrieveLatestBackupPackageSuccess'), - error => commit('retrieveLatestBackupPackageFailure', error)); - }, - error => commit('retrieveLatestBackupPackageFailure', error)); + .then(ok => commit('buildLatestBackupPackageSuccess'), + error => commit('buildLatestBackupPackageFailure', error)); + }, + latestBackupBuildingStatus({ commit }, { userId, networkId, code, messages, errors }) { + commit('latestBackupBuildingStatusRequest'); + networkService.backupPackageStatus(userId, networkId, code, messages, errors) + .then(status => commit('latestBackupBuildingStatusSuccess', status), + error => commit('latestBackupBuildingStatusFailure', error)); + }, + latestBackupDownload({ commit }, { userId, networkId, code, messages, errors }) { + commit('latestBackupDownloadRequest'); + networkService.backupPackageDownload(userId, networkId, code, messages, errors) + .then(ok => commit('latestBackupDownloadSuccess'), + error => commit('latestBackupDownloadFailure', error)); }, getLogFlag({ commit }, { networkId, messages, errors }) { @@ -353,20 +361,48 @@ const mutations = { state.loading.retrieveNetworkKeys = false; state.error = { error }; }, - retrieveLatestBackupPackageRequest(state) { + + buildLatestBackupPackageRequest(state) { state.loading.retrieveNetworkKeys = true; - state.loading.fullBackupRequested = true; + state.loading.preparingLatestBackup = true; state.networkKeysRequested = null; }, - retrieveLatestBackupPackageSuccess(state) { + buildLatestBackupPackageSuccess(state) { + // noop + }, + buildLatestBackupPackageFailure(state, error) { state.loading.retrieveNetworkKeys = false; - state.loading.fullBackupRequested = false; + state.loading.preparingLatestBackup = false; + state.error = { error }; + }, + latestBackupBuildingStatusRequest(state) { + state.loading.retrieveNetworkKeys = true; + state.loading.preparingLatestBackup = true; + }, + latestBackupBuildingStatusSuccess(state, packageBuildingStatus) { + if (packageBuildingStatus && packageBuildingStatus.done === true) { + if (packageBuildingStatus.error) { + return latestBackupBuildingStatusFailure(state, packageBuildingStatus.error); + } + state.loading.preparingLatestBackup = false; + } }, - retrieveLatestBackupPackageFailure(state, error) { + latestBackupBuildingStatusFailure(state, error) { state.loading.retrieveNetworkKeys = false; - state.loading.fullBackupRequested = false; + state.loading.preparingLatestBackup = false; state.error = { error }; }, + latestBackupDownloadRequest(state) { + // noop + }, + latestBackupDownloadSuccess(state) { + state.loading.retrieveNetworkKeys = false; + }, + latestBackupDownloadFailure(state, error) { + state.loading.retrieveNetworkKeys = false; + state.error = { error }; + }, + getNetworkBackupsRequest(state, backups) { state.backups = null; }, diff --git a/src/account/NetworkPage.vue b/src/account/NetworkPage.vue index 7489960..6fa0bc1 100644 --- a/src/account/NetworkPage.vue +++ b/src/account/NetworkPage.vue @@ -97,13 +97,13 @@ {{ messages.label_or }} - -
{{ messages.label_download_backup_note }} +
{{ messages.label_download_backup_note }} @@ -221,7 +221,8 @@ loadingImgSrc: loadingImgSrc, checkingForUpgrade: null, upgradeRefresher: null, - logsExpirationDays: null + logsExpirationDays: null, + backupDownloadRefresher: null }; }, computed: { @@ -280,6 +281,9 @@ }, logsExpirationDaysMax: function() { return 7; + }, + preparingLatestBackup: function() { + return this.loading.preparingLatestBackup; } }, methods: { @@ -287,7 +291,7 @@ 'getNetworkById', 'deleteNetwork', 'getStatusesByNetworkId', 'getNodesByNetworkId', 'stopNetwork', 'queueBackup', 'restoreNetwork', 'deleteNetwork', 'requestNetworkKeys', 'retrieveNetworkKeys', 'getBackups', 'resetRestoreKey', 'getLogFlag', 'disableLog', 'enableLog', - 'retrieveLatestBackupPackage' + 'buildLatestBackupPackage', 'latestBackupBuildingStatus', 'latestBackupDownload' ]), ...mapActions('system', ['getAppLinks', 'loadSystemConfigs', 'checkForUpgrade', 'upgrade']), refreshStatus (userId) { @@ -395,17 +399,24 @@ errors: this.errors }); }, - retrieveFullBackup () { + retrieveBackupPackageBuildingStatus () { this.errors.clear(); - this.retrieveLatestBackupPackage({ - userId: this.user.uuid, - networkId: this.networkId, - code: this.restoreKeyCode, - password: this.restoreKeyPassword, - messages: this.messages, - errors: this.errors - }); + this.latestBackupBuildingStatus({ userId: this.user.uuid, networkId: this.networkId, + code: this.restoreKeyCode, messages: this.messages, + errors: this.errors }); }, + fullyPrepareBackupPackage () { + this.errors.clear(); + this.buildLatestBackupPackage({ userId: this.user.uuid, networkId: this.networkId, + code: this.restoreKeyCode, password: this.restoreKeyPassword}); + this.backupDownloadRefresher = setInterval(this.retrieveBackupPackageBuildingStatus, 5000); + }, + retrieveBackupPackage () { + this.errors.clear(); + this.latestBackupDownload({ userId: this.user.uuid, networkId: this.networkId, + code: this.restoreKeyCode, messages: this.messages, errors: this.errors }); + }, + disableLogs () { this.errors.clear(); this.disableLog({ networkId: this.networkId, messages: this.messages, errors: this.errors }); @@ -430,6 +441,7 @@ beforeDestroy () { this.clearRefresherInterval(this.refresher); this.clearRefresherInterval(this.stopRefresher); + this.clearRefresherInterval(this.backupDownloadRefresher); this.resetRestoreKey(); }, watch: { @@ -519,6 +531,12 @@ this.checkingForUpgrade = false; }, 10000); } + }, + preparingLatestBackup (isStillPreparing) { + if (this.backupDownloadRefresher && isStillPreparing === false) { + this.clearRefresherInterval(this.backupDownloadRefresher); + this.retrieveBackupPackage(); + } } } };