mail/src/js/util/update/update-handler.js

126 lines
3.9 KiB
JavaScript

'use strict';
var ngModule = angular.module('woUtil');
ngModule.service('updateHandler', UpdateHandler);
module.exports = UpdateHandler;
var axe = require('axe-logger'),
cfg = require('../../app-config').config,
updateV1 = require('./update-v1'),
updateV2 = require('./update-v2'),
updateV3 = require('./update-v3'),
updateV4 = require('./update-v4'),
updateV5 = require('./update-v5');
/**
* Handles database migration
*/
function UpdateHandler(appConfigStore, accountStore, auth, dialog) {
this._appConfigStorage = appConfigStore;
this._userStorage = accountStore;
this._updateScripts = [updateV1, updateV2, updateV3, updateV4, updateV5];
this._auth = auth;
this._dialog = dialog;
}
/**
* Executes all the necessary updates
*/
UpdateHandler.prototype.update = function() {
var self = this,
currentVersion = 0,
targetVersion = cfg.dbVersion,
versionDbType = 'dbVersion';
return self._appConfigStorage.listItems(versionDbType).then(function(items) {
// parse the database version number
if (items && items.length > 0) {
currentVersion = parseInt(items[0], 10);
}
return self._applyUpdate({
currentVersion: currentVersion,
targetVersion: targetVersion
});
});
};
/**
* Schedules necessary updates and executes thom in order
*/
UpdateHandler.prototype._applyUpdate = function(options) {
var self = this;
return new Promise(function(resolve, reject) {
var scriptOptions,
queue = [];
if (options.currentVersion >= options.targetVersion) {
// the current database version is up to date
resolve();
return;
}
scriptOptions = {
appConfigStorage: self._appConfigStorage,
userStorage: self._userStorage,
auth: self._auth
};
// add all the necessary database updates to the queue
for (var i = options.currentVersion; i < options.targetVersion; i++) {
queue.push(self._updateScripts[i]);
}
// takes the next update from the queue and executes it
function executeNextUpdate() {
if (queue.length < 1) {
// we're done
resolve();
return;
}
// process next update
var script = queue.shift();
script(scriptOptions).then(executeNextUpdate).catch(reject);
}
executeNextUpdate();
});
};
/**
* Check application version and update correspondingly
*/
UpdateHandler.prototype.checkForUpdate = function() {
var self = this;
// Chrome Packaged App
if (typeof window.chrome !== 'undefined' && chrome.runtime && chrome.runtime.onUpdateAvailable) {
// check for Chrome app update and restart
chrome.runtime.onUpdateAvailable.addListener(function(details) {
axe.debug('New Chrome App update... requesting reload.');
// Chrome downloaded a new app version
self._dialog.confirm({
title: 'Update available',
message: 'A new version ' + details.version + ' of the app is available. Restart the app to update?',
positiveBtnStr: 'Restart',
negativeBtnStr: 'Not now',
showNegativeBtn: true,
callback: function(agree) {
if (agree) {
chrome.runtime.reload();
}
}
});
});
chrome.runtime.requestUpdateCheck(function(status) {
if (status === "update_found") {
axe.debug("Update pending...");
} else if (status === "no_update") {
axe.debug("No update found.");
} else if (status === "throttled") {
axe.debug("Checking updates too frequently.");
}
});
}
};