Skip to content

Commit 8a98954

Browse files
committed
Standalone handling function and purge cache
1 parent 4f9ebf2 commit 8a98954

File tree

3 files changed

+72
-17
lines changed

3 files changed

+72
-17
lines changed

spec/ParseAPI.spec.js

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1408,10 +1408,67 @@ describe('miscellaneous', function() {
14081408
uri: 'http://localhost:8378/1/classes/TestObject',
14091409
json: true
14101410
}).then(body => {
1411-
fail('Should not succeed')
1411+
fail('Should not succeed');
14121412
}).catch(err => {
14131413
expect(err.error.error).toEqual('unauthorized: master key is required');
14141414
done();
14151415
});
14161416
});
1417+
1418+
it('purge all objects in _Role also purge cache', (done) => {
1419+
let headers = {
1420+
'Content-Type': 'application/json',
1421+
'X-Parse-Application-Id': 'test',
1422+
'X-Parse-Master-Key': 'test'
1423+
};
1424+
var user, object;
1425+
createTestUser().then((x) => {
1426+
user = x;
1427+
let acl = new Parse.ACL();
1428+
acl.setPublicReadAccess(true);
1429+
acl.setPublicWriteAccess(false);
1430+
let role = new Parse.Object('_Role');
1431+
role.set('name', 'TestRole');
1432+
role.setACL(acl);
1433+
let users = role.relation('users');
1434+
users.add(user);
1435+
return role.save({}, { useMasterKey: true });
1436+
}).then((x) => {
1437+
let query = new Parse.Query('_Role');
1438+
return query.find({ useMasterKey: true });
1439+
}).then((x) => {
1440+
expect(x.length).toEqual(1);
1441+
let relation = x[0].relation('users').query();
1442+
return relation.first({ useMasterKey: true });
1443+
}).then((x) => {
1444+
expect(x.id).toEqual(user.id);
1445+
object = new Parse.Object('TestObject');
1446+
let acl = new Parse.ACL();
1447+
acl.setPublicReadAccess(false);
1448+
acl.setPublicWriteAccess(false);
1449+
acl.setRoleReadAccess('TestRole', true);
1450+
acl.setRoleWriteAccess('TestRole', true);
1451+
object.setACL(acl);
1452+
return object.save();
1453+
}).then((x) => {
1454+
let query = new Parse.Query('TestObject');
1455+
return query.find({ sessionToken: user.getSessionToken() });
1456+
}).then((x) => {
1457+
expect(x.length).toEqual(1);
1458+
return rp({
1459+
method: 'DELETE',
1460+
headers: headers,
1461+
uri: 'http://localhost:8378/1/classes/_Role',
1462+
json: true
1463+
});
1464+
}).then((x) => {
1465+
let query = new Parse.Query('TestObject');
1466+
return query.get(object.id, { sessionToken: user.getSessionToken() });
1467+
}).then((x) => {
1468+
fail('Should not succeed');
1469+
}, (e) => {
1470+
expect(e.code).toEqual(Parse.Error.OBJECT_NOT_FOUND);
1471+
done();
1472+
});
1473+
});
14171474
});

src/Routers/ClassesRouter.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,25 @@ export class ClassesRouter extends PromiseRouter {
108108
}
109109

110110
handleDelete(req) {
111-
if (!req.params.objectId) {
112-
req.params.objectId = '*';
113-
}
114111
return rest.del(req.config, req.auth, req.params.className, req.params.objectId)
115112
.then(() => {
116113
return {response: {}};
117114
});
118115
}
119116

117+
handlePurge(req) {
118+
return req.config.database.purgeCollection(req.params.className)
119+
.then(() => {
120+
var cacheAdapter = req.config.cacheController;
121+
if (req.params.className == '_Session') {
122+
cacheAdapter.user.clear();
123+
} else if (req.params.className == '_Role') {
124+
cacheAdapter.role.clear();
125+
}
126+
return {response: {}};
127+
});
128+
}
129+
120130
static JSONFromQuery(query) {
121131
let json = {};
122132
for (let [key, value] of Object.entries(query)) {
@@ -135,7 +145,7 @@ export class ClassesRouter extends PromiseRouter {
135145
this.route('POST', '/classes/:className', (req) => { return this.handleCreate(req); });
136146
this.route('PUT', '/classes/:className/:objectId', (req) => { return this.handleUpdate(req); });
137147
this.route('DELETE', '/classes/:className/:objectId', (req) => { return this.handleDelete(req); });
138-
this.route('DELETE', '/classes/:className', middleware.promiseEnforceMasterKeyAccess, (req) => { return this.handleDelete(req); });
148+
this.route('DELETE', '/classes/:className', middleware.promiseEnforceMasterKeyAccess, (req) => { return this.handlePurge(req); });
139149
}
140150
}
141151

src/rest.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,6 @@ function del(config, auth, className, objectId) {
4242

4343
enforceRoleSecurity('delete', className, auth);
4444

45-
if (objectId === '*') {
46-
return Promise.resolve().then(() => {
47-
return config.database.purgeCollection(className);
48-
}).then(() => {
49-
if (className == '_Session') {
50-
var cacheAdapter = config.cacheController;
51-
cacheAdapter.user.clear();
52-
}
53-
return Promise.resolve({});
54-
});
55-
}
56-
5745
var inflatedObject;
5846

5947
return Promise.resolve().then(() => {

0 commit comments

Comments
 (0)