Skip to content

Commit fd63e89

Browse files
committed
adds restquery-each
1 parent 9af8d6c commit fd63e89

File tree

3 files changed

+99
-55
lines changed

3 files changed

+99
-55
lines changed

spec/RestQuery.spec.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const auth = require('../lib/Auth');
44
const Config = require('../lib/Config');
55
const rest = require('../lib/rest');
6+
const RestQuery = require('../lib/RestQuery');
67
const request = require('../lib/request');
78

89
const querystring = require('querystring');
@@ -335,3 +336,31 @@ describe('rest query', () => {
335336
);
336337
});
337338
});
339+
340+
describe('RestQuery.each', () => {
341+
it('should run each', async () => {
342+
const objects = [];
343+
while (objects.length != 10) {
344+
objects.push(new Parse.Object('Object', { value: objects.length }));
345+
}
346+
const config = Config.get('test');
347+
await Parse.Object.saveAll(objects);
348+
const query = new RestQuery(
349+
config,
350+
auth.master(config),
351+
'Object',
352+
{ value: { $gt: 2 } },
353+
{ limit: 2 }
354+
);
355+
const spy = spyOn(query, 'execute').and.callThrough();
356+
const classSpy = spyOn(RestQuery.prototype, 'execute').and.callThrough();
357+
const results = [];
358+
await query.each(result => {
359+
expect(result.value).toBeGreaterThan(2);
360+
results.push(result);
361+
});
362+
expect(spy.calls.count()).toBe(0);
363+
expect(classSpy.calls.count()).toBe(4);
364+
expect(results.length).toBe(7);
365+
});
366+
});

src/Auth.js

Lines changed: 39 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
const cryptoUtils = require('./cryptoUtils');
22
const RestQuery = require('./RestQuery');
33
const Parse = require('parse/node');
4-
const { continueWhile } = require('parse/lib/node/promiseUtils');
54

65
// An Auth object tells you who is requesting something and whether
76
// the master key was used.
@@ -186,51 +185,28 @@ Auth.prototype.getUserRoles = function() {
186185
};
187186

188187
Auth.prototype.getRolesForUser = async function() {
188+
//Stack all Parse.Role
189+
const results = [];
189190
if (this.config) {
190-
const masterConfig = master(this.config);
191191
const restWhere = {
192192
users: {
193193
__type: 'Pointer',
194194
className: '_User',
195195
objectId: this.user.id,
196196
},
197197
};
198-
const queryOptions = {
199-
limit: 100,
200-
order: 'objectId'
201-
};
202-
let finished = false;
203-
204-
//Stack all Parse.Role
205-
let results = [];
206-
207-
//Get All Parse.Role for User
208-
await continueWhile(() => {
209-
return !finished;
210-
}, async () => {
211-
const query = new RestQuery(
212-
this.config,
213-
masterConfig,
214-
'_Role',
215-
restWhere,
216-
queryOptions
217-
);
218-
const currentResults = await query.execute().then(({ results }) => results);
219-
finished = currentResults.length < queryOptions.limit;
220-
if (!finished) {
221-
restWhere.objectId = { '$gt': currentResults[currentResults.length - 1].objectId}
222-
}
223-
results = results.concat(currentResults);
224-
});
225-
return results;
198+
await new RestQuery(
199+
this.config,
200+
master(this.config),
201+
'_Role',
202+
restWhere,
203+
{}
204+
).each(result => results.push(result));
205+
} else {
206+
await new Parse.Query(Parse.Role)
207+
.equalTo('users', this.user)
208+
.each(result => results.push(result.toJSON()), { useMasterKey: true });
226209
}
227-
228-
//Stack all Parse.Role
229-
const results = [];
230-
231-
await new Parse.Query(Parse.Role)
232-
.equalTo('users', this.user)
233-
.each(result => results.push(result.toJSON()),{useMasterKey:true})
234210
return results;
235211
};
236212

@@ -287,19 +263,11 @@ Auth.prototype.cacheRoles = function() {
287263
return true;
288264
};
289265

290-
Auth.prototype.getRolesByIds = function(ins) {
291-
const roles = ins.map(id => {
292-
return {
293-
__type: 'Pointer',
294-
className: '_Role',
295-
objectId: id,
296-
};
297-
});
298-
const restWhere = { roles: { $in: roles } };
299-
266+
Auth.prototype.getRolesByIds = async function(ins) {
267+
const results = [];
300268
// Build an OR query across all parentRoles
301269
if (!this.config) {
302-
return new Parse.Query(Parse.Role)
270+
await new Parse.Query(Parse.Role)
303271
.containedIn(
304272
'roles',
305273
ins.map(id => {
@@ -308,13 +276,30 @@ Auth.prototype.getRolesByIds = function(ins) {
308276
return role;
309277
})
310278
)
311-
.find({ useMasterKey: true })
312-
.then(results => results.map(obj => obj.toJSON()));
279+
.each(
280+
result => {
281+
results.push(result.toJSON());
282+
},
283+
{ useMasterKey: true }
284+
);
285+
} else {
286+
const roles = ins.map(id => {
287+
return {
288+
__type: 'Pointer',
289+
className: '_Role',
290+
objectId: id,
291+
};
292+
});
293+
const restWhere = { roles: { $in: roles } };
294+
await new RestQuery(
295+
this.config,
296+
master(this.config),
297+
'_Role',
298+
restWhere,
299+
{}
300+
).each(result => results.push(result));
313301
}
314-
315-
return new RestQuery(this.config, master(this.config), '_Role', restWhere, {})
316-
.execute()
317-
.then(({ results }) => results);
302+
return results;
318303
};
319304

320305
// Given a list of roleIds, find all the parent roles, returns a promise with all names

src/RestQuery.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
var SchemaController = require('./Controllers/SchemaController');
55
var Parse = require('parse/node').Parse;
66
const triggers = require('./triggers');
7-
7+
const { continueWhile } = require('parse/lib/node/promiseUtils');
88
const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt', 'ACL'];
99
// restOptions can include:
1010
// skip
@@ -199,6 +199,36 @@ RestQuery.prototype.execute = function(executeOptions) {
199199
});
200200
};
201201

202+
RestQuery.prototype.each = function(callback) {
203+
const { config, auth, className, restWhere, restOptions, clientSDK } = this;
204+
// if the limit is set, use it
205+
restOptions.limit = restOptions.limit || 100;
206+
restOptions.order = 'objectId';
207+
let finished = false;
208+
209+
return continueWhile(
210+
() => {
211+
return !finished;
212+
},
213+
async () => {
214+
const query = new RestQuery(
215+
config,
216+
auth,
217+
className,
218+
restWhere,
219+
restOptions,
220+
clientSDK
221+
);
222+
const { results } = await query.execute();
223+
results.forEach(callback);
224+
finished = results.length < restOptions.limit;
225+
if (!finished) {
226+
restWhere.objectId = { $gt: results[results.length - 1].objectId };
227+
}
228+
}
229+
);
230+
};
231+
202232
RestQuery.prototype.buildRestWhere = function() {
203233
return Promise.resolve()
204234
.then(() => {

0 commit comments

Comments
 (0)