Skip to content

Commit 753bead

Browse files
committed
Recursive lookup for roles
1 parent 34a621b commit 753bead

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

spec/ParseRole.spec.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
// Roles are not accessible without the master key, so they are not intended
44
// for use by clients. We can manually test them using the master key.
5+
var Auth = require("../src/Auth").Auth;
6+
var Config = require("../src/Config");
57

68
describe('Parse Role testing', () => {
79

@@ -57,6 +59,48 @@ describe('Parse Role testing', () => {
5759
});
5860

5961
});
62+
63+
it("should recursively load roles", (done) => {
64+
65+
var rolesNames = ["FooRole", "BarRole", "BazRole"];
66+
67+
var createRole = function(name, parent, user) {
68+
var role = new Parse.Object("_Role")
69+
role.set("name", name);
70+
if (user) {
71+
var users = role.relation('users');
72+
users.add(user);
73+
}
74+
if (parent) {
75+
role.relation('roles').add(parent);
76+
}
77+
return role.save({}, { useMasterKey: true });
78+
}
79+
var roleIds = {};
80+
createTestUser().then( (user) => {
81+
82+
return createRole(rolesNames[0], null, null).then( (aRole) => {
83+
roleIds[aRole.get("name")] = aRole.id;
84+
return createRole(rolesNames[1], aRole, null);
85+
}).then( (anotherRole) => {
86+
roleIds[anotherRole.get("name")] = anotherRole.id;
87+
return createRole(rolesNames[2], anotherRole, user);
88+
}).then( (lastRole) => {
89+
roleIds[lastRole.get("name")] = lastRole.id;
90+
var auth = new Auth(new Config("test") , true, user);
91+
return auth._loadRoles();
92+
})
93+
}).then( (roles) => {
94+
expect(roles.length).toEqual(3);
95+
rolesNames.forEach( (name) => {
96+
expect(roles.indexOf('role:'+name)).not.toBe(-1);
97+
})
98+
done();
99+
}, function(err){
100+
fail("should succeed")
101+
done();
102+
});
103+
});
60104

61105
});
62106

src/Auth.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,22 @@ Auth.prototype._getAllRoleNamesForId = function(roleID) {
159159
return Promise.resolve([]);
160160
}
161161
var roleIDs = results.map(r => r.objectId);
162+
163+
var parentRolesPromises = roleIDs.map( (roleId) => {
164+
return this._getAllRoleNamesForId(roleId);
165+
});
166+
parentRolesPromises.push(Promise.resolve(roleIDs));
167+
return Promise.all(parentRolesPromises);
168+
}).then(function(results){
169+
// Flatten
170+
let roleIDs = results.reduce( (memo, result) => {
171+
if (typeof result == "object") {
172+
memo = memo.concat(result);
173+
} else {
174+
memo.push(result);
175+
}
176+
return memo;
177+
}, []);
162178
return Promise.resolve(roleIDs);
163179
});
164180
};

0 commit comments

Comments
 (0)