Skip to content

Commit

Permalink
Added rest option: excludeKeys (parse-community#5737)
Browse files Browse the repository at this point in the history
* Added restOption: excludeKeys

* improve tests
  • Loading branch information
RaschidJFR authored and dplewis committed Jul 10, 2019
1 parent 064973b commit d9953ad
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 0 deletions.
116 changes: 116 additions & 0 deletions spec/ParseQuery.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3348,6 +3348,122 @@ describe('Parse.Query testing', () => {
}
);
});
it('exclude keys', async () => {
const obj = new TestObject({ foo: 'baz', hello: 'world' });
await obj.save();

const response = await request({
url: Parse.serverURL + '/classes/TestObject',
qs: {
excludeKeys: 'foo',
where: JSON.stringify({ objectId: obj.id }),
},
headers: masterKeyHeaders,
});
expect(response.data.results[0].foo).toBeUndefined();
expect(response.data.results[0].hello).toBe('world');
});

it('exclude keys with select same key', async () => {
const obj = new TestObject({ foo: 'baz', hello: 'world' });
await obj.save();

const response = await request({
url: Parse.serverURL + '/classes/TestObject',
qs: {
keys: 'foo',
excludeKeys: 'foo',
where: JSON.stringify({ objectId: obj.id }),
},
headers: masterKeyHeaders,
});
expect(response.data.results[0].foo).toBeUndefined();
expect(response.data.results[0].hello).toBeUndefined();
});

it('exclude keys with select different key', async () => {
const obj = new TestObject({ foo: 'baz', hello: 'world' });
await obj.save();

const response = await request({
url: Parse.serverURL + '/classes/TestObject',
qs: {
keys: 'foo,hello',
excludeKeys: 'foo',
where: JSON.stringify({ objectId: obj.id }),
},
headers: masterKeyHeaders,
});
expect(response.data.results[0].foo).toBeUndefined();
expect(response.data.results[0].hello).toBe('world');
});

it('exclude keys with include same key', async () => {
const pointer = new TestObject();
await pointer.save();
const obj = new TestObject({ child: pointer, hello: 'world' });
await obj.save();

const response = await request({
url: Parse.serverURL + '/classes/TestObject',
qs: {
include: 'child',
excludeKeys: 'child',
where: JSON.stringify({ objectId: obj.id }),
},
headers: masterKeyHeaders,
});
expect(response.data.results[0].child).toBeUndefined();
expect(response.data.results[0].hello).toBe('world');
});

it('exclude keys with include different key', async () => {
const pointer = new TestObject();
await pointer.save();
const obj = new TestObject({
child1: pointer,
child2: pointer,
hello: 'world',
});
await obj.save();

const response = await request({
url: Parse.serverURL + '/classes/TestObject',
qs: {
include: 'child1,child2',
excludeKeys: 'child1',
where: JSON.stringify({ objectId: obj.id }),
},
headers: masterKeyHeaders,
});
expect(response.data.results[0].child1).toBeUndefined();
expect(response.data.results[0].child2.objectId).toEqual(pointer.id);
expect(response.data.results[0].hello).toBe('world');
});

it('exclude keys with includeAll', async () => {
const pointer = new TestObject();
await pointer.save();
const obj = new TestObject({
child1: pointer,
child2: pointer,
hello: 'world',
});
await obj.save();

const response = await request({
url: Parse.serverURL + '/classes/TestObject',
qs: {
includeAll: true,
excludeKeys: 'child1',
where: JSON.stringify({ objectId: obj.id }),
},
headers: masterKeyHeaders,
});
expect(response.data.results[0].child).toBeUndefined();
expect(response.data.results[0].child2.objectId).toEqual(pointer.id);
expect(response.data.results[0].hello).toBe('world');
});

it('select keys with each query', function(done) {
const obj = new TestObject({ foo: 'baz', bar: 1 });
Expand Down
29 changes: 29 additions & 0 deletions src/RestQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt', 'ACL'];
// count
// include
// keys
// excludeKeys
// redirectClassNameForKey
// readPreference
// includeReadPreference
Expand Down Expand Up @@ -102,6 +103,13 @@ function RestQuery(
this.keys = Array.from(new Set(keys));
break;
}
case 'excludeKeys': {
const exclude = restOptions.excludeKeys
.split(',')
.filter(k => AlwaysSelectedKeys.indexOf(k) < 0);
this.excludeKeys = Array.from(new Set(exclude));
break;
}
case 'count':
this.doCount = true;
break;
Expand Down Expand Up @@ -184,6 +192,9 @@ RestQuery.prototype.execute = function(executeOptions) {
.then(() => {
return this.handleIncludeAll();
})
.then(() => {
return this.handleExcludeKeys();
})
.then(() => {
return this.runFind(executeOptions);
})
Expand Down Expand Up @@ -705,6 +716,24 @@ RestQuery.prototype.handleIncludeAll = function() {
});
};

// Updates property `this.keys` to contain all keys but the ones unselected.
RestQuery.prototype.handleExcludeKeys = function() {
if (!this.excludeKeys) {
return;
}
if (this.keys) {
this.keys = this.keys.filter(k => !this.excludeKeys.includes(k));
return;
}
return this.config.database
.loadSchema()
.then(schemaController => schemaController.getOneSchema(this.className))
.then(schema => {
const fields = Object.keys(schema.fields);
this.keys = fields.filter(k => !this.excludeKeys.includes(k));
});
};

// Augments this.response with data at the paths provided in this.include.
RestQuery.prototype.handleInclude = function() {
if (this.include.length == 0) {
Expand Down
4 changes: 4 additions & 0 deletions src/Routers/ClassesRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ export class ClassesRouter extends PromiseRouter {
'order',
'count',
'keys',
'excludeKeys',
'include',
'includeAll',
'redirectClassNameForKey',
Expand Down Expand Up @@ -200,6 +201,9 @@ export class ClassesRouter extends PromiseRouter {
if (typeof body.keys == 'string') {
options.keys = body.keys;
}
if (typeof body.excludeKeys == 'string') {
options.excludeKeys = body.excludeKeys;
}
if (body.include) {
options.include = String(body.include);
}
Expand Down

0 comments on commit d9953ad

Please sign in to comment.