--- /dev/null
+(function(exports){
+
+ var config = {
+
+ /* List all the roles you wish to use in the app
+ * You have a max of 31 before the bit shift pushes the accompanying integer out of
+ * the memory footprint for an integer
+ */
+ roles :[
+ 'public',
+ 'user',
+ 'admin'],
+
+ /*
+ Build out all the access levels you want referencing the roles listed above
+ You can use the "*" symbol to represent access to all roles
+ */
+ accessLevels : {
+ 'public' : "*",
+ 'anon': ['public'],
+ 'user' : ['user', 'admin'],
+ 'admin': ['admin']
+ }
+
+ };
+
+ exports.userRoles = buildRoles(config.roles);
+ exports.accessLevels = buildAccessLevels(config.accessLevels, exports.userRoles);
+
+ /*
+ Method to build a distinct bit mask for each role
+ It starts off with "1" and shifts the bit to the left for each element in the
+ roles array parameter
+ */
+
+ function buildRoles(roles){
+
+ var bitMask = "01";
+ var userRoles = {};
+
+ for(var role in roles){
+ var intCode = parseInt(bitMask, 2);
+ userRoles[roles[role]] = {
+ bitMask: intCode,
+ title: roles[role]
+ };
+ bitMask = (intCode << 1 ).toString(2);
+ }
+
+ return userRoles;
+ }
+
+ /*
+ This method builds access level bit masks based on the accessLevelDeclaration parameter which must
+ contain an array for each access level containing the allowed user roles.
+ */
+ function buildAccessLevels(accessLevelDeclarations, userRoles){
+
+ var accessLevels = {};
+ var resultBitMask = '';
+ for(var level in accessLevelDeclarations){
+
+ if(typeof accessLevelDeclarations[level] == 'string'){
+ if(accessLevelDeclarations[level] == '*'){
+
+ resultBitMask = '';
+
+ for( var roleTemp in userRoles){
+ resultBitMask += "1";
+ }
+ //accessLevels[level] = parseInt(resultBitMask, 2);
+ accessLevels[level] = {
+ bitMask: parseInt(resultBitMask, 2),
+ title: accessLevelDeclarations[level]
+ };
+ }
+ else {
+ console.log("Access Control Error: Could not parse '" + accessLevelDeclarations[level] + "' as access definition for level '" + level + "'");
+ }
+
+ }
+ else {
+
+ resultBitMask = 0;
+ for(var role in accessLevelDeclarations[level]){
+ if(userRoles.hasOwnProperty(accessLevelDeclarations[level][role])) {
+ resultBitMask = resultBitMask | userRoles[accessLevelDeclarations[level][role]].bitMask;
+ }
+ else {
+ console.log("Access Control Error: Could not find role '" + accessLevelDeclarations[level][role] + "' in registered roles while building access for '" + level + "'");
+ }
+ }
+ accessLevels[level] = {
+ bitMask: resultBitMask,
+ title: accessLevelDeclarations[level][role]
+ };
+ }
+ }
+
+ return accessLevels;
+ }
+
+})(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports);
\ No newline at end of file