Skip to content

Commit 046585d

Browse files
committed
finished unit tests, everything works.
1 parent 47df35b commit 046585d

File tree

11 files changed

+396
-281
lines changed

11 files changed

+396
-281
lines changed

.npmignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ node_modules
1010

1111
# Ignore source files
1212
.babelrc
13-
.eslintrc
13+
.editorconfig
1414
.gitignore
15-
*.yml
15+
**.yml
1616
Gruntfile.js
1717
src
1818
examples
19-
tests
19+
test

Gruntfile.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ module.exports = function(grunt)
4545
eslint: {
4646
src: {
4747
src: ['Gruntfile.js', 'src/**/*.js'],
48-
options: { configFile: '.eslintrc' }
48+
options: { configFile: '.eslintrc.yml' }
4949
},
5050
test: {
5151
src: ['test/**/*.js'],
52-
options: { configFile: 'test/.eslintrc' }
52+
options: { configFile: 'test/.eslintrc.yml' }
5353
}
5454
}
5555
});

examples/simple.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//----------------------------------------------------------------------------------------------------------------------
2+
/// Brief description for simple.js module.
3+
///
4+
/// @module
5+
//----------------------------------------------------------------------------------------------------------------------
6+
7+
var tp = require('../dist/trivialperms');
8+
9+
//----------------------------------------------------------------------------------------------------------------------
10+
// Setup
11+
//----------------------------------------------------------------------------------------------------------------------
12+
13+
var loading = tp.loadGroups([
14+
{
15+
name: "Administrators",
16+
permissions: [
17+
"*/*"
18+
]
19+
},
20+
{
21+
name: "Authors",
22+
permissions: [
23+
"Posts/canView",
24+
"Posts/canAdd",
25+
"Posts/canEdit"
26+
]
27+
},
28+
{
29+
name: "Users",
30+
permissions: [
31+
"Posts/canView"
32+
]
33+
}
34+
]);
35+
36+
// Define Users
37+
38+
var batman = {
39+
name: 'batman',
40+
groups: ['Administrators']
41+
};
42+
43+
var stark = {
44+
name: 'tstark',
45+
permissions: ['*/*'],
46+
groups: ['Users']
47+
};
48+
49+
var leo = {
50+
name: 'lblume',
51+
groups: ['Users']
52+
};
53+
54+
//----------------------------------------------------------------------------------------------------------------------
55+
// Use
56+
//----------------------------------------------------------------------------------------------------------------------
57+
58+
loading.then(() =>
59+
{
60+
console.log('Batman is an Administrator: ', tp.hasGroup(batman, 'Administrators'));
61+
console.log('Batman can edit your posts: ', tp.hasPerm(batman, 'canEdit', 'Posts'));
62+
63+
console.log('Tony Stark is not an Administrator: ', !tp.hasGroup(stark, 'Administrators'));
64+
console.log('Tony Stark can do anything: ', tp.hasPerm(stark, 'canGetAwayWith', 'Murder'));
65+
66+
console.log('Leo Blume is a user: ', tp.hasGroup(leo, 'Users'));
67+
console.log('Leo Blume can read your posts: ', tp.hasPerm(leo, 'canView', 'Posts'));
68+
console.log('Leo Blume can not edit your posts: ', !tp.hasPerm(leo, 'canEdit', 'Posts'));
69+
});
70+
71+
//----------------------------------------------------------------------------------------------------------------------

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
},
2424
"license": "MIT",
2525
"dependencies": {
26-
"bluebird": "^3.0.5",
27-
"lodash": "^3.10.1",
26+
"bluebird": "^3.3.1",
27+
"lodash": "^4.5.1",
2828
"make-error": "^1.0.4"
2929
},
3030
"devDependencies": {
@@ -37,7 +37,7 @@
3737
"grunt-cli": "^0.1.13",
3838
"grunt-contrib-clean": "^0.7.0",
3939
"grunt-contrib-watch": "^0.6.1",
40-
"gruntify-eslint": "^1.3.0",
40+
"gruntify-eslint": "^2.0.0",
4141
"mocha": "~1.18.2"
4242
}
4343
}

src/base.js

Lines changed: 0 additions & 59 deletions
This file was deleted.

src/group.js

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,54 @@
66

77
import _ from 'lodash';
88

9-
import TPBase from './base';
10-
119
//----------------------------------------------------------------------------------------------------------------------
1210

13-
class TPGroup extends TPBase {
11+
class TPGroup {
12+
constructor(name, permissions, manager)
13+
{
14+
this.name = name;
15+
this.permissions = permissions || [];
16+
this.manager = manager;
17+
18+
// Ensure our permissions are unique
19+
this.permissions = _.uniq(this.permissions);
20+
} // end constructor
21+
22+
hasPerm(perm, obj)
23+
{
24+
return !!_.find(this.permissions, (permission) =>
25+
{
26+
if(permission == '*/*')
27+
{
28+
return true;
29+
}
30+
else if(permission.match(/^.*\/\*/))
31+
{
32+
return !!permission.match(new RegExp(`^${ obj }/`));
33+
}
34+
else if(permission.match(/^\*\/.*/))
35+
{
36+
return !!permission.match(new RegExp(`^.*/${ perm }$`));
37+
}
38+
else
39+
{
40+
return !!permission.match(new RegExp(`^${ obj }/${ perm }$`));
41+
} // end if
42+
});
43+
} // end hasPerm
44+
45+
addPerm(perm, obj)
46+
{
47+
this.permissions.push(`${ obj }/${ perm }`);
48+
49+
// Ensure our permissions are unique
50+
this.permissions = _.uniq(this.permissions);
51+
} // end addPerm
52+
53+
removePerm(perm, obj)
54+
{
55+
return _.remove(this.permissions, (item) => item == `${ obj }/${ perm }`);
56+
} // end removePerm
1457
} // end TPGroup
1558

1659
//----------------------------------------------------------------------------------------------------------------------

src/trivialperms.js

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,56 @@
44
/// @module
55
//----------------------------------------------------------------------------------------------------------------------
66

7+
import _ from 'lodash';
8+
import Promise from 'bluebird';
79
import TPGroup from './group';
8-
import TPUser from './user';
10+
11+
//----------------------------------------------------------------------------------------------------------------------
12+
13+
var mapping = { permissions: 'permissions', groups: 'groups' };
914

1015
//----------------------------------------------------------------------------------------------------------------------
1116

1217
class TPManager
1318
{
1419
constructor()
1520
{
16-
this.users = {};
1721
this.groups = {};
1822
} // end constructor
1923

24+
_userHasPerm(user, perm, obj)
25+
{
26+
return !!_.find(user[mapping.permissions], (permission) =>
27+
{
28+
if(permission == '*/*')
29+
{
30+
return true;
31+
}
32+
else if(permission.match(/^.*\/\*/))
33+
{
34+
return !!permission.match(new RegExp(`^${ obj }/`));
35+
}
36+
else if(permission.match(/^\*\/.*/))
37+
{
38+
return !!permission.match(new RegExp(`^.*/${ perm }$`));
39+
}
40+
else
41+
{
42+
return !!permission.match(new RegExp(`^${ obj }/${ perm }$`));
43+
} // end if
44+
});
45+
} // end _userHasPerm
46+
47+
//------------------------------------------------------------------------------------------------------------------
48+
// Public
49+
//------------------------------------------------------------------------------------------------------------------
50+
51+
setUserMapping(newMapping)
52+
{
53+
mapping.groups = newMapping.groups || mapping.groups;
54+
mapping.permissions = newMapping.permissions || mapping.permissions;
55+
} // end setUserMapping
56+
2057
defineGroup(groupDef)
2158
{
2259
if(!groupDef.name)
@@ -30,44 +67,42 @@ class TPManager
3067
return group;
3168
} // end defineGroup
3269

33-
defineUser(userDef)
70+
loadGroups(groupsOrFunc)
3471
{
35-
if(!userDef.name)
72+
var loadPromise = Promise.resolve(groupsOrFunc);
73+
if(_.isFunction(groupsOrFunc))
3674
{
37-
throw new Error("Must specify a 'name' property.");
75+
loadPromise = groupsOrFunc();
3876
} // end if
3977

40-
var user = new TPUser(userDef, this);
41-
this.users[userDef.name] = user;
42-
43-
return user;
44-
} // end defineUser
78+
// Build the groups
79+
return loadPromise.each((groupDef) =>
80+
{
81+
this.defineGroup(groupDef);
82+
});
83+
} // end loadGroups
4584

46-
hasPerm(userName, perm, obj)
85+
hasPerm(user, perm, obj)
4786
{
48-
var user = this.users[userName];
49-
if(user)
87+
var found = this._userHasPerm(user, perm, obj);
88+
if(!found)
5089
{
51-
return user.hasPerm(perm, obj);
90+
var groups = _.map(user[mapping.groups], (name) => this.groups[name]);
91+
found = _.some(groups, (group) => group.hasPerm(perm, obj));
5292
} // end if
5393

54-
return false;
94+
return found;
5595
} // end hasPerm
5696

57-
hasGroup(userName, groupName)
97+
hasGroup(user, groupName)
5898
{
59-
var user = this.users[userName];
60-
if(user)
61-
{
62-
return user.hasGroup(groupName);
63-
} // end if
64-
65-
return false;
99+
// Returns false for groups that haven't been loaded yet
100+
return (groupName in this.groups) && _.includes(user[mapping.groups], groupName);
66101
} // end hasGroup
67102
} // end TPManager
68103

69104
//----------------------------------------------------------------------------------------------------------------------
70105

71-
export default new TPManager();
106+
module.exports = new TPManager();
72107

73108
//----------------------------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)