Skip to content

Commit 41db1dc

Browse files
authored
Set Class Level Permission via Parse.Schema (#960)
* Set Class Level Permission via Parse.Schema Closes: #583 * Add test cases for invalid clp * more tests
1 parent 7c5b0d9 commit 41db1dc

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

integration/test/ParseSchemaTest.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@ const assert = require('assert');
22
const clear = require('./clear');
33
const Parse = require('../../node');
44

5+
const emptyCLPS = {
6+
find: {},
7+
count: {},
8+
get: {},
9+
create: {},
10+
update: {},
11+
delete: {},
12+
addField: {},
13+
protectedFields: {},
14+
};
15+
16+
const defaultCLPS = {
17+
find: { '*': true },
18+
count: { '*': true },
19+
get: { '*': true },
20+
create: { '*': true },
21+
update: { '*': true },
22+
delete: { '*': true },
23+
addField: { '*': true },
24+
protectedFields: { '*': [] },
25+
};
26+
527
describe('Schema', () => {
628
beforeAll(() => {
729
Parse.initialize('integration');
@@ -82,6 +104,74 @@ describe('Schema', () => {
82104
});
83105
});
84106

107+
it('save class level permissions', async () => {
108+
const clp = {
109+
get: { requiresAuthentication: true },
110+
find: {},
111+
count: {},
112+
create: { '*': true },
113+
update: { requiresAuthentication: true },
114+
delete: {},
115+
addField: {},
116+
protectedFields: {}
117+
};
118+
const testSchema = new Parse.Schema('SchemaTest');
119+
testSchema.setCLP(clp);
120+
const schema = await testSchema.save();
121+
assert.deepEqual(schema.classLevelPermissions, clp);
122+
});
123+
124+
it('update class level permissions', async () => {
125+
const clp = {
126+
get: { requiresAuthentication: true },
127+
find: {},
128+
count: {},
129+
create: { '*': true },
130+
update: { requiresAuthentication: true },
131+
delete: {},
132+
addField: {},
133+
protectedFields: {}
134+
};
135+
const testSchema = new Parse.Schema('SchemaTest');
136+
let schema = await testSchema.save();
137+
assert.deepEqual(schema.classLevelPermissions, defaultCLPS);
138+
139+
testSchema.setCLP(1234);
140+
schema = await testSchema.update();
141+
assert.deepEqual(schema.classLevelPermissions, emptyCLPS);
142+
143+
testSchema.setCLP(clp);
144+
schema = await testSchema.update();
145+
assert.deepEqual(schema.classLevelPermissions, clp);
146+
147+
testSchema.setCLP({});
148+
schema = await testSchema.update();
149+
assert.deepEqual(schema.classLevelPermissions, emptyCLPS);
150+
});
151+
152+
it('update class level permissions multiple', async () => {
153+
const clp = {
154+
get: { requiresAuthentication: true },
155+
find: {},
156+
count: {},
157+
create: { '*': true },
158+
update: { requiresAuthentication: true },
159+
delete: {},
160+
addField: {},
161+
protectedFields: {}
162+
};
163+
const testSchema = new Parse.Schema('SchemaTest');
164+
testSchema.setCLP(clp);
165+
let schema = await testSchema.save();
166+
assert.deepEqual(schema.classLevelPermissions, clp);
167+
168+
schema = await testSchema.update();
169+
assert.deepEqual(schema.classLevelPermissions, clp);
170+
171+
schema = await testSchema.update();
172+
assert.deepEqual(schema.classLevelPermissions, clp);
173+
});
174+
85175
it('update', (done) => {
86176
const testSchema = new Parse.Schema('SchemaTest');
87177
testSchema.addString('name');

src/ParseSchema.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class ParseSchema {
3030
className: string;
3131
_fields: { [key: string]: mixed };
3232
_indexes: { [key: string]: mixed };
33+
_clp: { [key: string]: mixed };
3334

3435
/**
3536
* @param {String} className Parse Class string.
@@ -97,6 +98,7 @@ class ParseSchema {
9798
className: this.className,
9899
fields: this._fields,
99100
indexes: this._indexes,
101+
classLevelPermissions: this._clp,
100102
};
101103

102104
return controller.create(this.className, params);
@@ -116,6 +118,7 @@ class ParseSchema {
116118
className: this.className,
117119
fields: this._fields,
118120
indexes: this._indexes,
121+
classLevelPermissions: this._clp,
119122
};
120123

121124
this._fields = {};
@@ -161,6 +164,18 @@ class ParseSchema {
161164
}
162165
}
163166

167+
/**
168+
* Sets Class Level Permissions when creating / updating a Schema.
169+
* EXERCISE CAUTION, running this may override CLP for this schema and cannot be reversed
170+
*
171+
* @param {Object} clp Class Level Permissions
172+
* @return {Parse.Schema} Returns the schema, so you can chain this call.
173+
*/
174+
setCLP(clp: { [key: string]: mixed }) {
175+
this._clp = clp;
176+
return this;
177+
}
178+
164179
/**
165180
* Adding a Field to Create / Update a Schema
166181
*

src/__tests__/ParseSchema-test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,28 @@ describe('ParseSchema', () => {
7777
done();
7878
});
7979

80+
it('can set schema class level permissions', (done) => {
81+
const schema = new ParseSchema('SchemaTest');
82+
expect(schema._clp).toBeUndefined();
83+
schema.setCLP(undefined);
84+
expect(schema._clp).toBeUndefined();
85+
schema.setCLP({});
86+
expect(schema._clp).toEqual({});
87+
const clp = {
88+
get: { requiresAuthentication: true },
89+
find: {},
90+
count: {},
91+
create: { '*': true },
92+
update: { requiresAuthentication: true },
93+
delete: {},
94+
addField: {},
95+
protectedFields: {}
96+
};
97+
schema.setCLP(clp);
98+
expect(schema._clp).toEqual(clp);
99+
done();
100+
});
101+
80102
it('cannot add field with null name', (done) => {
81103
try {
82104
const schema = new ParseSchema('SchemaTest');

0 commit comments

Comments
 (0)