public/lib/preferences-service.js (91 lines of code) (raw):
import angular from 'angular';
export const EVENT_PREFERENCE_CHANGED = 'wfPreferencesService.preferenceChanged';
angular.module('wfPreferencesService', [])
.factory('wfPreferencesService', ['$rootScope', '$http', '$log', '$window',
function($rootScope, $http, $log, $window) {
var TIMEOUT = 10000;
class PreferencesService {
/**
* Constructor for prefs service. Set users email locally and kick off retrieval of users prefs
* from prefs app
*/
constructor() {
var self = this;
this.user = _wfConfig.user.email;
this.prefsPromise = this.retrievePrefrences().then(function success (data) {
self.preferences = data.data;
return self.preferences;
}, function error () {
$log.error('Could not fetch preferences', arguments);
return Promise.reject();
});
// Debugging tool for prefs
$window.workflowPrefsDebug = this.debug.bind(this);
}
/**
* Return a request url using the app config
* @param user
* @param prefKey
* @returns {string}
*/
url(user, prefKey) {
return '/preferences/' + user + '/workflow' + (prefKey ? '/' + prefKey : '');
}
/**
* Return a promise of an http request to the preferences application for the users entire preference object
* @returns {HttpPromise}
*/
retrievePrefrences() {
return $http.get(this.url(this.user), {
timeout: TIMEOUT,
withCredentials: true,
transformResponse: this.transformResponse // custom transform on data
});
}
/**
* Perform a cutsom parse on returned preference data as we only care about the users prefs for workflow
* and want the data pre-parsed in to js objects ready for use
* @param data
* @param headersGetter
* @returns {Object} Parsed preference data narrowed to workflow prefs only
*/
transformResponse(data, headersGetter) {
if (data) {
var wfPrefs = JSON.parse(data).data;
for (var key in wfPrefs) {
if (wfPrefs.hasOwnProperty(key)) {
wfPrefs[key] = JSON.parse(wfPrefs[key]); // Parse all values to js objects as prefs returns a string here
}
}
return wfPrefs;
} else {
return null;
}
}
/**
* Helper method to package data in format expected by preferences app
* @param data
* @returns {{data: {value: *, namespace: string}}}
*/
packageData(data) {
return {
data: {
value: JSON.stringify(data)
}
}
}
/**
* Set a preference against the preferences app, return a promise for the request
* @param name
* @param data
* @returns {HttpPromise}
*/
setPreference(name, data) {
return $http.put(
this.url(this.user, name),
this.packageData(data),
{
withCredentials: true
}
).then(() => {
$rootScope.$broadcast(EVENT_PREFERENCE_CHANGED, {
name, data
});
})
}
/**
* Get a preference. If preferences have already been set resolve a promise with the preference
* requested, else return the promise of the request to the preferences app that will resolve
* with the correct preference
* @param name
* @returns {Promise}
*/
getPreference(name) {
var self = this;
if (this.preferences) {
if (this.preferences[name] !== undefined) {
return Promise.resolve(this.preferences[name]);
} else {
$log.info('No preference set for: ' + name);
return Promise.reject();
}
} else {
return this.prefsPromise.then(function resolve (data) {
if (!!data && typeof data[name] !== "undefined") {
return data[name];
} else {
$log.info('No preference set for: ' + name);
return Promise.reject();
}
}, function reject () {
return Promise.reject();
});
}
}
debug() {
return $log.debug(this.preferences);
}
}
return new PreferencesService();
}
]);