Skip to content

Commit 187f29c

Browse files
committed
Merge pull request #809 from ParsePlatform/flovilmart.objectIdInSanitation
Sanitize objectId $in management, fix $select bug from iOS
2 parents c6406b9 + e64b686 commit 187f29c

File tree

4 files changed

+110
-8
lines changed

4 files changed

+110
-8
lines changed

spec/ParseQuery.spec.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,4 +2088,60 @@ describe('Parse.Query testing', () => {
20882088
console.log(error);
20892089
});
20902090
});
2091+
2092+
// #371
2093+
it('should properly interpret a query', (done) => {
2094+
var query = new Parse.Query("C1");
2095+
var auxQuery = new Parse.Query("C1");
2096+
query.matchesKeyInQuery("A1", "A2", auxQuery);
2097+
query.include("A3");
2098+
query.include("A2");
2099+
query.find().then((result) => {
2100+
done();
2101+
}, (err) => {
2102+
console.error(err);
2103+
fail("should not failt");
2104+
done();
2105+
})
2106+
});
2107+
2108+
it('should properly interpret a query', (done) => {
2109+
var user = new Parse.User();
2110+
user.set("username", "foo");
2111+
user.set("password", "bar");
2112+
return user.save().then( (user) => {
2113+
var objIdQuery = new Parse.Query("_User").equalTo("objectId", user.id);
2114+
var blockedUserQuery = user.relation("blockedUsers").query();
2115+
2116+
var aResponseQuery = new Parse.Query("MatchRelationshipActivityResponse");
2117+
aResponseQuery.equalTo("userA", user);
2118+
aResponseQuery.equalTo("userAResponse", 1);
2119+
2120+
var bResponseQuery = new Parse.Query("MatchRelationshipActivityResponse");
2121+
bResponseQuery.equalTo("userB", user);
2122+
bResponseQuery.equalTo("userBResponse", 1);
2123+
2124+
var matchOr = Parse.Query.or(aResponseQuery, bResponseQuery);
2125+
var matchRelationshipA = new Parse.Query("_User");
2126+
matchRelationshipA.matchesKeyInQuery("objectId", "userAObjectId", matchOr);
2127+
var matchRelationshipB = new Parse.Query("_User");
2128+
matchRelationshipB.matchesKeyInQuery("objectId", "userBObjectId", matchOr);
2129+
2130+
2131+
var orQuery = Parse.Query.or(objIdQuery, blockedUserQuery, matchRelationshipA, matchRelationshipB);
2132+
var query = new Parse.Query("_User");
2133+
query.doesNotMatchQuery("objectId", orQuery);
2134+
return query.find();
2135+
}).then((res) => {
2136+
done();
2137+
done();
2138+
}, (err) => {
2139+
console.error(err);
2140+
fail("should not fail");
2141+
done();
2142+
});
2143+
2144+
2145+
});
2146+
20912147
});

spec/ParseRelation.spec.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,44 @@ describe('Parse.Relation testing', () => {
291291
});
292292
});
293293

294+
it("query on pointer and relation fields with equal", (done) => {
295+
var ChildObject = Parse.Object.extend("ChildObject");
296+
var childObjects = [];
297+
for (var i = 0; i < 10; i++) {
298+
childObjects.push(new ChildObject({x: i}));
299+
}
300+
301+
Parse.Object.saveAll(childObjects).then(() => {
302+
var ParentObject = Parse.Object.extend("ParentObject");
303+
var parent = new ParentObject();
304+
parent.set("x", 4);
305+
var relation = parent.relation("toChilds");
306+
relation.add(childObjects[0]);
307+
relation.add(childObjects[1]);
308+
relation.add(childObjects[2]);
309+
310+
var parent2 = new ParentObject();
311+
parent2.set("x", 3);
312+
parent2.set("toChild", childObjects[2]);
313+
314+
var parents = [];
315+
parents.push(parent);
316+
parents.push(parent2);
317+
parents.push(new ParentObject());
318+
319+
return Parse.Object.saveAll(parents).then(() => {
320+
var query = new Parse.Query(ParentObject);
321+
query.equalTo("objectId", parent.id);
322+
query.equalTo("toChilds", childObjects[2]);
323+
324+
return query.find().then((list) => {
325+
equal(list.length, 1, "There should be 1 result");
326+
done();
327+
});
328+
});
329+
});
330+
});
331+
294332
it("or queries on pointer and relation fields", (done) => {
295333
var ChildObject = Parse.Object.extend("ChildObject");
296334
var childObjects = [];
@@ -335,6 +373,7 @@ describe('Parse.Relation testing', () => {
335373
});
336374
});
337375

376+
338377
it("Get query on relation using un-fetched parent object", (done) => {
339378
// Setup data model
340379
var Wheel = Parse.Object.extend('Wheel');

src/Controllers/DatabaseController.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -417,9 +417,8 @@ DatabaseController.prototype.reduceInRelation = function(className, query, schem
417417
relatedIds = [query[key].objectId];
418418
}
419419
return this.owningIds(className, key, relatedIds).then((ids) => {
420-
delete query[key];
421-
query.objectId = Object.assign({'$in': []}, query.objectId);
422-
query.objectId['$in'] = query.objectId['$in'].concat(ids);
420+
delete query[key];
421+
this.addInObjectIdsIds(ids, query);
423422
return Promise.resolve(query);
424423
});
425424
}
@@ -448,15 +447,23 @@ DatabaseController.prototype.reduceRelationKeys = function(className, query) {
448447
relatedTo.key,
449448
relatedTo.object.objectId).then((ids) => {
450449
delete query['$relatedTo'];
451-
query.objectId = query.objectId || {};
452-
let queryIn = query.objectId['$in'] || [];
453-
queryIn = queryIn.concat(ids);
454-
query['objectId'] = {'$in': queryIn};
450+
this.addInObjectIdsIds(ids, query);
455451
return this.reduceRelationKeys(className, query);
456452
});
457453
}
458454
};
459455

456+
DatabaseController.prototype.addInObjectIdsIds = function(ids, query) {
457+
if (typeof query.objectId == 'string') {
458+
query.objectId = {'$in': [query.objectId]};
459+
}
460+
query.objectId = query.objectId || {};
461+
let queryIn = [].concat(query.objectId['$in'] || [], ids || []);
462+
// make a set and spread to remove duplicates
463+
query.objectId = {'$in': [...new Set(queryIn)]};
464+
return query;
465+
}
466+
460467
// Runs a query on the database.
461468
// Returns a promise that resolves to a list of items.
462469
// Options:

src/RestQuery.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,11 @@ RestQuery.prototype.replaceSelect = function() {
271271

272272
// The select value must have precisely two keys - query and key
273273
var selectValue = selectObject['$select'];
274+
// iOS SDK don't send where if not set, let it pass
274275
if (!selectValue.query ||
275276
!selectValue.key ||
276277
typeof selectValue.query !== 'object' ||
277278
!selectValue.query.className ||
278-
!selectValue.query.where ||
279279
Object.keys(selectValue).length !== 2) {
280280
throw new Parse.Error(Parse.Error.INVALID_QUERY,
281281
'improper usage of $select');

0 commit comments

Comments
 (0)