Skip to content

Commit 9bfa0c6

Browse files
natanrolnikArthur Cinader
authored and
Arthur Cinader
committed
Adds index on _Role name property (#3586)
* Adds index on _Role name property In order to avoid having different _Role objects with the same name, adding an index on the name property of _Role is necessary. Fixes #3579 * Uses throw instead of Promise.reject when enforcing unique indexes * Fixes wrong sorting of results in schemas tests
1 parent 0181fb5 commit 9bfa0c6

File tree

4 files changed

+53
-7
lines changed

4 files changed

+53
-7
lines changed

spec/ParseRole.spec.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,24 @@ describe('Parse Role testing', () => {
192192
});
193193
});
194194

195+
it("Different _Role objects cannot have the same name.", (done) => {
196+
const roleName = "MyRole";
197+
let aUser;
198+
createTestUser().then((user) => {
199+
aUser = user;
200+
return createRole(roleName, null, aUser);
201+
}).then((firstRole) => {
202+
expect(firstRole.getName()).toEqual(roleName);
203+
return createRole(roleName, null, aUser);
204+
}).then(() => {
205+
fail("_Role cannot have the same name as another role");
206+
done();
207+
}, (error) => {
208+
expect(error.code).toEqual(137);
209+
done();
210+
});
211+
});
212+
195213
it("Should properly resolve roles", (done) => {
196214
const admin = new Parse.Role("Admin", new Parse.ACL());
197215
const moderator = new Parse.Role("Moderator", new Parse.ACL());

spec/Schema.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,8 @@ describe('SchemaController', () => {
494494

495495
it('creates non-custom classes which include relation field', done => {
496496
config.database.loadSchema()
497-
.then(schema => schema.addClassIfNotExists('_Role', {}))
497+
//as `_Role` is always created by default, we only get it here
498+
.then(schema => schema.getOneSchema('_Role'))
498499
.then(actualSchema => {
499500
const expectedSchema = {
500501
className: '_Role',

spec/schemas.spec.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,20 @@ const userSchema = {
102102
"classLevelPermissions": defaultClassLevelPermissions,
103103
}
104104

105+
const roleSchema = {
106+
"className": "_Role",
107+
"fields": {
108+
"objectId": {"type": "String"},
109+
"createdAt": {"type": "Date"},
110+
"updatedAt": {"type": "Date"},
111+
"ACL": {"type": "ACL"},
112+
"name": {"type":"String"},
113+
"users": {"type":"Relation", "targetClass":"_User"},
114+
"roles": {"type":"Relation", "targetClass":"_Role"}
115+
},
116+
"classLevelPermissions": defaultClassLevelPermissions,
117+
}
118+
105119
var noAuthHeaders = {
106120
'X-Parse-Application-Id': 'test',
107121
};
@@ -166,7 +180,10 @@ describe('schemas', () => {
166180
json: true,
167181
headers: masterKeyHeaders,
168182
}, (error, response, body) => {
169-
expect(dd(body.results, [userSchema])).toEqual();
183+
var expected = {
184+
results: [userSchema,roleSchema]
185+
};
186+
expect(dd(body.results.sort((s1, s2) => s1.className > s2.className), expected.results.sort((s1, s2) => s1.className > s2.className))).toEqual(undefined);
170187
done();
171188
});
172189
});
@@ -186,9 +203,9 @@ describe('schemas', () => {
186203
headers: masterKeyHeaders,
187204
}, (error, response, body) => {
188205
var expected = {
189-
results: [userSchema,plainOldDataSchema,pointersAndRelationsSchema]
206+
results: [userSchema,roleSchema,plainOldDataSchema,pointersAndRelationsSchema]
190207
};
191-
expect(dd(body, expected)).toEqual(undefined);
208+
expect(dd(body.results.sort((s1, s2) => s1.className > s2.className), expected.results.sort((s1, s2) => s1.className > s2.className))).toEqual(undefined);
192209
done();
193210
})
194211
});

src/Controllers/DatabaseController.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -909,27 +909,37 @@ DatabaseController.prototype.addPointerPermissions = function(schema, className,
909909
// have a Parse app without it having a _User collection.
910910
DatabaseController.prototype.performInitialization = function() {
911911
const requiredUserFields = { fields: { ...SchemaController.defaultColumns._Default, ...SchemaController.defaultColumns._User } };
912+
const requiredRoleFields = { fields: { ...SchemaController.defaultColumns._Default, ...SchemaController.defaultColumns._Role } };
912913

913914
const userClassPromise = this.loadSchema()
914915
.then(schema => schema.enforceClassExists('_User'))
916+
const roleClassPromise = this.loadSchema()
917+
.then(schema => schema.enforceClassExists('_Role'))
915918

916919
const usernameUniqueness = userClassPromise
917920
.then(() => this.adapter.ensureUniqueness('_User', requiredUserFields, ['username']))
918921
.catch(error => {
919922
logger.warn('Unable to ensure uniqueness for usernames: ', error);
920-
return Promise.reject(error);
923+
throw error;
921924
});
922925

923926
const emailUniqueness = userClassPromise
924927
.then(() => this.adapter.ensureUniqueness('_User', requiredUserFields, ['email']))
925928
.catch(error => {
926929
logger.warn('Unable to ensure uniqueness for user email addresses: ', error);
927-
return Promise.reject(error);
930+
throw error;
931+
});
932+
933+
const roleUniqueness = roleClassPromise
934+
.then(() => this.adapter.ensureUniqueness('_Role', requiredRoleFields, ['name']))
935+
.catch(error => {
936+
logger.warn('Unable to ensure uniqueness for role name: ', error);
937+
throw error;
928938
});
929939

930940
// Create tables for volatile classes
931941
const adapterInit = this.adapter.performInitialization({ VolatileClassesSchemas: SchemaController.VolatileClassesSchemas });
932-
return Promise.all([usernameUniqueness, emailUniqueness, adapterInit]);
942+
return Promise.all([usernameUniqueness, emailUniqueness, roleUniqueness, adapterInit]);
933943
}
934944

935945
function joinTableName(className, key) {

0 commit comments

Comments
 (0)