Skip to content

Commit 5b4638b

Browse files
committed
Adds clientSDK compatibility check for forward deletion
- Mark js1.9.0 as compatible
1 parent b7600e1 commit 5b4638b

File tree

6 files changed

+94
-37
lines changed

6 files changed

+94
-37
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"redis": "2.6.2",
4343
"request": "2.73.0",
4444
"request-promise": "3.0.0",
45+
"semver": "^5.2.0",
4546
"tv4": "1.2.7",
4647
"winston": "2.2.0",
4748
"winston-daily-rotate-file": "1.0.1",

spec/ClientSDK.spec.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
var ClientSDK = require('../src/ClientSDK');
2+
3+
describe('ClientSDK', () => {
4+
it('should properly parse the SDK versions', () => {
5+
let clientSDKFromVersion = ClientSDK.fromString;
6+
expect(clientSDKFromVersion('i1.1.1')).toEqual({
7+
sdk: 'i',
8+
version: '1.1.1'
9+
});
10+
expect(clientSDKFromVersion('i1')).toEqual({
11+
sdk: 'i',
12+
version: '1'
13+
});
14+
expect(clientSDKFromVersion('apple-tv1.13.0')).toEqual({
15+
sdk: 'apple-tv',
16+
version: '1.13.0'
17+
});
18+
expect(clientSDKFromVersion('js1.9.0')).toEqual({
19+
sdk: 'js',
20+
version: '1.9.0'
21+
});
22+
});
23+
24+
it('should properly sastisfy', () => {
25+
expect(ClientSDK.compatible({
26+
js: '>=1.9.0'
27+
})("js1.9.0")).toBe(true);
28+
29+
expect(ClientSDK.compatible({
30+
js: '>=1.9.0'
31+
})("js2.0.0")).toBe(true);
32+
33+
expect(ClientSDK.compatible({
34+
js: '>=1.9.0'
35+
})("js1.8.0")).toBe(false);
36+
37+
expect(ClientSDK.compatible({
38+
js: '>=1.9.0'
39+
})(undefined)).toBe(true);
40+
})
41+
})

spec/Middlewares.spec.js

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -66,24 +66,4 @@ describe('middlewares', () => {
6666
});
6767
});
6868
});
69-
70-
it('should properly parse the SDK versions', () => {
71-
let clientSDKFromVersion = middlewares.clientSDKFromVersion;
72-
expect(clientSDKFromVersion('i1.1.1')).toEqual({
73-
sdk: 'i',
74-
version: '1.1.1'
75-
});
76-
expect(clientSDKFromVersion('i1')).toEqual({
77-
sdk: 'i',
78-
version: '1'
79-
});
80-
expect(clientSDKFromVersion('apple-tv1.13.0')).toEqual({
81-
sdk: 'apple-tv',
82-
version: '1.13.0'
83-
});
84-
expect(clientSDKFromVersion('js1.9.0')).toEqual({
85-
sdk: 'js',
86-
version: '1.9.0'
87-
});
88-
})
8969
});

src/ClientSDK.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var semver = require('semver');
2+
3+
function compatible(compatibleSDK) {
4+
return function(clientSDK) {
5+
if (typeof clientSDK === 'string') {
6+
clientSDK = fromString(clientSDK);
7+
}
8+
// REST API, or custom SDK
9+
if (!clientSDK) {
10+
return true;
11+
}
12+
let clientVersion = clientSDK.version;
13+
let compatiblityVersion = compatibleSDK[clientSDK.sdk];
14+
return semver.satisfies(clientVersion, compatiblityVersion);
15+
}
16+
}
17+
18+
function supportsForwardDelete(clientSDK) {
19+
return compatible({
20+
js: '>=1.9.0'
21+
})(clientSDK);
22+
}
23+
24+
function fromString(version) {
25+
let versionRE = /([-a-zA-Z]+)([0-9\.]+)/;
26+
let match = version.toLowerCase().match(versionRE);
27+
if (match && match.length === 3) {
28+
return {
29+
sdk: match[1],
30+
version: match[2]
31+
}
32+
}
33+
return undefined;
34+
}
35+
36+
module.exports = {
37+
compatible,
38+
supportsForwardDelete,
39+
fromString
40+
}

src/RestWrite.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var cryptoUtils = require('./cryptoUtils');
1111
var passwordCrypto = require('./password');
1212
var Parse = require('parse/node');
1313
var triggers = require('./triggers');
14+
var ClientSDK = require('./ClientSDK');
1415
import RestQuery from './RestQuery';
1516
import _ from 'lodash';
1617

@@ -763,7 +764,7 @@ RestWrite.prototype.runDatabaseOperation = function() {
763764
.then(response => {
764765
response.updatedAt = this.updatedAt;
765766
if (this.storage.changedByTrigger) {
766-
updateResponseWithData(response, this.data);
767+
this.updateResponseWithData(response, this.data);
767768
}
768769
this.response = { response };
769770
});
@@ -821,7 +822,7 @@ RestWrite.prototype.runDatabaseOperation = function() {
821822
response.username = this.data.username;
822823
}
823824
if (this.storage.changedByTrigger) {
824-
updateResponseWithData(response, this.data);
825+
this.updateResponseWithData(response, this.data);
825826
}
826827
this.response = {
827828
status: 201,
@@ -910,11 +911,16 @@ RestWrite.prototype.cleanUserAuthData = function() {
910911
}
911912
};
912913

913-
function updateResponseWithData(response, data) {
914+
RestWrite.prototype.updateResponseWithData = function(response, data) {
915+
let clientSupportsDelete = ClientSDK.supportsForwardDelete(this.clientSDK);
914916
Object.keys(data).forEach(fieldName => {
915917
let dataValue = data[fieldName];
916918
let responseValue = response[fieldName];
917-
response[fieldName] = responseValue || dataValue;
919+
if (!clientSupportsDelete && dataValue && dataValue.__op === 'Delete') {
920+
delete response[fieldName];
921+
} else {
922+
response[fieldName] = responseValue || dataValue;
923+
}
918924
});
919925
return response;
920926
}

src/middlewares.js

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,7 @@ var Parse = require('parse/node').Parse;
55

66
var auth = require('./Auth');
77
var Config = require('./Config');
8-
9-
function clientSDKFromVersion(version) {
10-
let versionRE = /([-a-zA-Z]+)([0-9\.]+)/;
11-
let match = version.toLowerCase().match(versionRE);
12-
if (match && match.length === 3) {
13-
return {
14-
sdk: match[1],
15-
version: match[2]
16-
}
17-
}
18-
}
8+
var ClientSDK = require('./ClientSDK');
199

2010
// Checks that the request is authorized for this app and checks user
2111
// auth too.
@@ -106,7 +96,7 @@ function handleParseHeaders(req, res, next) {
10696
}
10797

10898
if (info.clientVersion) {
109-
info.clientSDK = clientSDKFromVersion(info.clientVersion);
99+
info.clientSDK = ClientSDK.fromString(info.clientVersion);
110100
}
111101

112102
if (fileViaJSON) {
@@ -300,5 +290,4 @@ module.exports = {
300290
handleParseHeaders: handleParseHeaders,
301291
enforceMasterKeyAccess: enforceMasterKeyAccess,
302292
promiseEnforceMasterKeyAccess,
303-
clientSDKFromVersion
304293
};

0 commit comments

Comments
 (0)