storyboard-webclient/src/app/services/provider/preference.js

245 lines
8.6 KiB
JavaScript

/*
* Copyright (c) 2015 Hewlett-Packard Development Company, L.P.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
/**
* Preference service, a convenience-cashing API in front of our UserPreference
* service, with resolving/refresh functionality.
*/
angular.module('sb.services').provider('Preference',
function () {
'use strict';
/**
* Singleton preference provider.
*/
var preferenceInstance = null;
/**
* Registered default preferences.
*/
var defaults = {};
/**
* Each module can manually declare its own preferences that it would
* like to keep track of, as well as set a default. During the config()
* phase, inject the Preference Provider and call 'addPreference()' to
* do so. An example is available at the bottom of this file.
*/
this.addPreference = function (name, defaultValue) {
defaults[name] = defaultValue;
};
/**
* The actual preference implementation.
*/
function Preference($q, $log, Session, AccessToken, UserPreference,
SessionState) {
/**
* The currently loaded preferences.
*/
var preferences = {};
/**
* This function resolves the user preferences. If a valid session
* is resolvable, it will load the preferences for the user.
* Otherwise it will resolve the default preferences.
*
* @returns {deferred.promise|*}
*/
this.resolveUserPreferences = function () {
var deferred = $q.defer();
// First resolve the session.
var sessionPromise = Session.resolveSessionState();
sessionPromise.then(
function (state) {
if (state === SessionState.LOGGED_IN) {
UserPreference.get({id: AccessToken.getIdToken()},
function (prefs) {
deferred.resolve(prefs);
}, function () {
deferred.resolve(defaults);
});
} else {
deferred.resolve(defaults);
}
},
function () {
deferred.resolve(defaults);
}
);
return deferred.promise;
};
/**
* Create a composite result of preference defaults and server
* provided defaults.
*/
this.getAll = function () {
var result = {};
for (var def_key in defaults) {
result[def_key] = this.get(def_key);
}
for (var key in preferences) {
result[key] = preferences[key];
}
return result;
};
/**
* Save all the preferences in the passed hash.
*/
this.saveAll = function (newPrefs) {
// Update the preferences.
for (var key in defaults) {
if (preferences.hasOwnProperty(key)) {
if (preferences[key] !== newPrefs[key]) {
$log.debug('Preference Change: ' + key + ' -> ' +
newPrefs[key]);
preferences[key] = newPrefs[key];
}
}
}
return this.save();
};
/**
* Returns the value for a given preference.
*/
this.get = function (key) {
// Is this a valid preference?
if (!defaults.hasOwnProperty(key)) {
$log.warn('Attempt to get unregistered preference: ' +
key);
return null;
}
// If the value is unset, and we have a default,
// set that.
if (!preferences.hasOwnProperty(key)) {
$log.warn('Setting default preference: ',
key, defaults[key]);
this.set(key, defaults[key], true);
}
return preferences[key];
};
/**
* Save a preference and return the saving promise.
*/
this.set = function (key, value, isDefault) {
// Is this a valid preference?
if (!defaults.hasOwnProperty(key)) {
$log.warn('Attempt to set unregistered preference: ' +
key);
return null;
}
// Store the preference.
preferences[key] = value;
return this.save(isDefault);
};
/**
* Resolve the preferences.
*/
this.refresh = function () {
var deferred = $q.defer();
// This should never fail, see implementation above.
this.resolveUserPreferences().then(
function (newPrefs) {
preferences = newPrefs;
deferred.resolve(preferences);
}
);
return deferred.promise;
};
/**
* Private save method.
*/
this.save = function (isDefault) {
var deferred = $q.defer();
// Don't save default preferences, but just checking there is
// no $save() method is insufficient. Also, if there is no
// $save() method, don't try to save the preferences (this is
// the case when there is no logged in user).
if (isDefault) {
deferred.resolve();
} else if (!preferences.$save) {
deferred.resolve();
} else {
preferences.$save({id: AccessToken.getIdToken()},
function () {
deferred.resolve();
}, function () {
deferred.resolve();
});
}
return deferred.promise;
};
}
/**
* Factory getter - returns a configured instance of preference
* provider, as needed.
*/
this.$get =
function ($injector) {
if (!preferenceInstance) {
preferenceInstance = $injector.instantiate(Preference);
}
return preferenceInstance;
};
})
.config(function (PreferenceProvider) {
'use strict';
// WARNING: In all modules OTHER than the services module, this config
// block can appear anywhere as long as this module is listed as a
// dependency. In the services module, the config() block must appear
// AFTER the provider block. For more information,
// @see https://github.com/angular/angular.js/issues/6723
// Let our preference provider know about page_size.
PreferenceProvider.addPreference('page_size', 10);
PreferenceProvider.addPreference('story_detail_page_size', 10);
PreferenceProvider.addPreference(
'project_group_detail_projects_page_size', 10);
PreferenceProvider.addPreference(
'project_group_detail_stories_page_size', 10);
PreferenceProvider.addPreference('project_detail_page_size', 10);
// Let our preference provider know about email preferences.
PreferenceProvider.addPreference('plugin_email_enable', 'false');
// Let our preference provider know about notifications preferences.
PreferenceProvider.addPreference(
'receive_notifications_worklists', false);
});