From e0b09f20b000513be2f0ab9510b4c5b5acfc8d8b Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Thu, 21 Dec 2017 19:49:39 +0100 Subject: [PATCH] fix(cache): add a cache validity mechanism (#1527) --- app/constants.js | 3 +- app/services/stateManager.js | 76 +++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/app/constants.js b/app/constants.js index d62fd0a96..4062f9dd3 100644 --- a/app/constants.js +++ b/app/constants.js @@ -11,4 +11,5 @@ angular.module('portainer') .constant('API_ENDPOINT_TEAM_MEMBERSHIPS', 'api/team_memberships') .constant('API_ENDPOINT_TEMPLATES', 'api/templates') .constant('DEFAULT_TEMPLATES_URL', 'https://raw.githubusercontent.com/portainer/templates/master/templates.json') -.constant('PAGINATION_MAX_ITEMS', 10); +.constant('PAGINATION_MAX_ITEMS', 10) +.constant('APPLICATION_CACHE_VALIDITY', 3600); diff --git a/app/services/stateManager.js b/app/services/stateManager.js index bd5e70d9e..c9deb5aee 100644 --- a/app/services/stateManager.js +++ b/app/services/stateManager.js @@ -1,5 +1,5 @@ angular.module('portainer.services') -.factory('StateManager', ['$q', 'SystemService', 'InfoHelper', 'LocalStorage', 'SettingsService', 'StatusService', function StateManagerFactory($q, SystemService, InfoHelper, LocalStorage, SettingsService, StatusService) { +.factory('StateManager', ['$q', 'SystemService', 'InfoHelper', 'LocalStorage', 'SettingsService', 'StatusService', 'APPLICATION_CACHE_VALIDITY', function StateManagerFactory($q, SystemService, InfoHelper, LocalStorage, SettingsService, StatusService, APPLICATION_CACHE_VALIDITY) { 'use strict'; var manager = {}; @@ -34,6 +34,42 @@ angular.module('portainer.services') LocalStorage.storeApplicationState(state.application); }; + + function assignStateFromStatusAndSettings(status, settings) { + state.application.authentication = status.Authentication; + state.application.analytics = status.Analytics; + state.application.endpointManagement = status.EndpointManagement; + state.application.version = status.Version; + state.application.logo = settings.LogoURL; + state.application.displayDonationHeader = settings.DisplayDonationHeader; + state.application.displayExternalContributors = settings.DisplayExternalContributors; + state.application.validity = moment().unix(); + } + + function loadApplicationState() { + var deferred = $q.defer(); + + $q.all({ + settings: SettingsService.publicSettings(), + status: StatusService.status() + }) + .then(function success(data) { + var status = data.status; + var settings = data.settings; + assignStateFromStatusAndSettings(status, settings); + LocalStorage.storeApplicationState(state.application); + deferred.resolve(state); + }) + .catch(function error(err) { + deferred.reject({msg: 'Unable to retrieve server settings and status', err: err}); + }) + .finally(function final() { + state.loading = false; + }); + + return deferred.promise; + } + manager.initialize = function () { var deferred = $q.defer(); @@ -44,32 +80,28 @@ angular.module('portainer.services') var applicationState = LocalStorage.getApplicationState(); if (applicationState) { - state.application = applicationState; - state.loading = false; - deferred.resolve(state); + var now = moment().unix(); + var cacheValidity = now - applicationState.validity; + if (cacheValidity > APPLICATION_CACHE_VALIDITY) { + loadApplicationState() + .then(function success(data) { + deferred.resolve(state); + }) + .catch(function error(err) { + deferred.reject(err); + }); + } else { + state.application = applicationState; + state.loading = false; + deferred.resolve(state); + } } else { - $q.all({ - settings: SettingsService.publicSettings(), - status: StatusService.status() - }) + loadApplicationState() .then(function success(data) { - var status = data.status; - var settings = data.settings; - state.application.authentication = status.Authentication; - state.application.analytics = status.Analytics; - state.application.endpointManagement = status.EndpointManagement; - state.application.version = status.Version; - state.application.logo = settings.LogoURL; - state.application.displayDonationHeader = settings.DisplayDonationHeader; - state.application.displayExternalContributors = settings.DisplayExternalContributors; - LocalStorage.storeApplicationState(state.application); deferred.resolve(state); }) .catch(function error(err) { - deferred.reject({msg: 'Unable to retrieve server settings and status', err: err}); - }) - .finally(function final() { - state.loading = false; + deferred.reject(err); }); }