Skip to content

Commit e89cf25

Browse files
authored
fix(directAccess): Properly handle response status (#6966)
* fix(directAccess): Properly handle response status * clean up * handle status in batch
1 parent 12abae8 commit e89cf25

File tree

3 files changed

+81
-3
lines changed

3 files changed

+81
-3
lines changed

spec/ParseServerRESTController.spec.js

+67
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,73 @@ describe('ParseServerRESTController', () => {
101101
);
102102
});
103103

104+
it('should handle response status', async () => {
105+
const router = ParseServer.promiseRouter({ appId: Parse.applicationId });
106+
spyOn(router, 'tryRouteRequest').and.callThrough();
107+
RESTController = ParseServerRESTController(Parse.applicationId, router);
108+
const resp = await RESTController.request('POST', '/classes/MyObject');
109+
const {
110+
status,
111+
response,
112+
location,
113+
} = await router.tryRouteRequest.calls.all()[0].returnValue;
114+
115+
expect(status).toBe(201);
116+
expect(response).toEqual(resp);
117+
expect(location).toBe(
118+
`http://localhost:8378/1/classes/MyObject/${resp.objectId}`
119+
);
120+
});
121+
122+
it('should handle response status in batch', async () => {
123+
const router = ParseServer.promiseRouter({ appId: Parse.applicationId });
124+
spyOn(router, 'tryRouteRequest').and.callThrough();
125+
RESTController = ParseServerRESTController(Parse.applicationId, router);
126+
const resp = await RESTController.request(
127+
'POST',
128+
'batch',
129+
{
130+
requests: [
131+
{
132+
method: 'POST',
133+
path: '/classes/MyObject',
134+
},
135+
{
136+
method: 'POST',
137+
path: '/classes/MyObject',
138+
},
139+
],
140+
},
141+
{
142+
returnStatus: true,
143+
}
144+
);
145+
expect(resp.length).toBe(2);
146+
expect(resp[0]._status).toBe(201);
147+
expect(resp[1]._status).toBe(201);
148+
expect(resp[0].success).toBeDefined();
149+
expect(resp[1].success).toBeDefined();
150+
expect(router.tryRouteRequest.calls.all().length).toBe(2);
151+
});
152+
153+
it('properly handle existed', async done => {
154+
const restController = Parse.CoreManager.getRESTController();
155+
Parse.CoreManager.setRESTController(RESTController);
156+
Parse.Cloud.define('handleStatus', async () => {
157+
const obj = new Parse.Object('TestObject');
158+
expect(obj.existed()).toBe(false);
159+
await obj.save();
160+
expect(obj.existed()).toBe(false);
161+
162+
const query = new Parse.Query('TestObject');
163+
const result = await query.get(obj.id);
164+
expect(result.existed()).toBe(true);
165+
Parse.CoreManager.setRESTController(restController);
166+
done();
167+
});
168+
await Parse.Cloud.run('handleStatus');
169+
});
170+
104171
if (
105172
(semver.satisfies(process.env.MONGODB_VERSION, '>=4.0.4') &&
106173
process.env.MONGODB_TOPOLOGY === 'replicaset' &&

src/ParseServerRESTController.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ function ParseServerRESTController(applicationId, router) {
6464
config
6565
).then(
6666
response => {
67+
if (options.returnStatus) {
68+
const status = response._status;
69+
delete response._status;
70+
return { success: response, _status: status };
71+
}
6772
return { success: response };
6873
},
6974
error => {
@@ -117,8 +122,13 @@ function ParseServerRESTController(applicationId, router) {
117122
return router.tryRouteRequest(method, path, request);
118123
})
119124
.then(
120-
response => {
121-
resolve(response.response, response.status, response);
125+
resp => {
126+
const { response, status } = resp;
127+
if (options.returnStatus) {
128+
resolve({ ...response, _status: status });
129+
} else {
130+
resolve(response);
131+
}
122132
},
123133
err => {
124134
if (

src/RestWrite.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1704,7 +1704,8 @@ RestWrite.prototype.runAfterSaveTrigger = function () {
17041704
RestWrite.prototype.location = function () {
17051705
var middle =
17061706
this.className === '_User' ? '/users/' : '/classes/' + this.className + '/';
1707-
return this.config.mount + middle + this.data.objectId;
1707+
const mount = this.config.mount || this.config.serverURL;
1708+
return mount + middle + this.data.objectId;
17081709
};
17091710

17101711
// A helper to get the object id for this operation.

0 commit comments

Comments
 (0)