Update parse SDK to 2.0.0 (#4925)

* WIP: Integrate JS SDK v2

- Removes backbone style callbacks
- Use Promise instead of Parse.Promise

* Fixes ParseObject and ParseRelation

* Updates Parse.Query with promises

* Alls tests should pass

* Ensure a fresh user is used for each test

* Use REST implementation to avoid side effects for username/email duplicates

* Uses js sdk v2
This commit is contained in:
Florent Vilmart
2018-08-05 13:58:07 -04:00
committed by GitHub
parent a61ef7ee2f
commit ff25ae254d
30 changed files with 3217 additions and 4783 deletions

View File

@@ -174,7 +174,7 @@ class ParseLiveQueryServer {
// subscription, we do not need to check ACL
let originalACLCheckingPromise;
if (!isOriginalSubscriptionMatched) {
originalACLCheckingPromise = Parse.Promise.as(false);
originalACLCheckingPromise = Promise.resolve(false);
} else {
let originalACL;
if (message.originalParseObject) {
@@ -186,16 +186,18 @@ class ParseLiveQueryServer {
// subscription, we do not need to check ACL
let currentACLCheckingPromise;
if (!isCurrentSubscriptionMatched) {
currentACLCheckingPromise = Parse.Promise.as(false);
currentACLCheckingPromise = Promise.resolve(false);
} else {
const currentACL = message.currentParseObject.getACL();
currentACLCheckingPromise = this._matchesACL(currentACL, client, requestId);
}
Parse.Promise.when(
originalACLCheckingPromise,
currentACLCheckingPromise
).then((isOriginalMatched, isCurrentMatched) => {
Promise.all(
[
originalACLCheckingPromise,
currentACLCheckingPromise
]
).then(([isOriginalMatched, isCurrentMatched]) => {
logger.verbose('Original %j | Current %j | Match: %s, %s, %s, %s | Query: %s',
originalParseObject,
currentParseObject,
@@ -330,12 +332,12 @@ class ParseLiveQueryServer {
_matchesACL(acl: any, client: any, requestId: number): any {
// Return true directly if ACL isn't present, ACL is public read, or client has master key
if (!acl || acl.getPublicReadAccess() || client.hasMasterKey) {
return Parse.Promise.as(true);
return Promise.resolve(true);
}
// Check subscription sessionToken matches ACL first
const subscriptionInfo = client.getSubscriptionInfo(requestId);
if (typeof subscriptionInfo === 'undefined') {
return Parse.Promise.as(false);
return Promise.resolve(false);
}
const subscriptionSessionToken = subscriptionInfo.sessionToken;
@@ -343,11 +345,11 @@ class ParseLiveQueryServer {
return acl.getReadAccess(userId);
}).then((isSubscriptionSessionTokenMatched) => {
if (isSubscriptionSessionTokenMatched) {
return Parse.Promise.as(true);
return Promise.resolve(true);
}
// Check if the user has any roles that match the ACL
return new Parse.Promise((resolve, reject) => {
return new Promise((resolve, reject) => {
// Resolve false right away if the acl doesn't have any roles
const acl_has_roles = Object.keys(acl.permissionsById).some(key => key.startsWith("role:"));
@@ -360,7 +362,7 @@ class ParseLiveQueryServer {
// Pass along a null if there is no user id
if (!userId) {
return Parse.Promise.as(null);
return Promise.resolve(null);
}
// Prepare a user object to query for roles
@@ -374,7 +376,7 @@ class ParseLiveQueryServer {
// Pass along an empty array (of roles) if no user
if (!user) {
return Parse.Promise.as([]);
return Promise.resolve([]);
}
// Then get the user's roles
@@ -400,7 +402,7 @@ class ParseLiveQueryServer {
}).then((isRoleMatched) => {
if(isRoleMatched) {
return Parse.Promise.as(true);
return Promise.resolve(true);
}
// Check client sessionToken matches ACL
@@ -409,9 +411,9 @@ class ParseLiveQueryServer {
return acl.getReadAccess(userId);
});
}).then((isMatched) => {
return Parse.Promise.as(isMatched);
return Promise.resolve(isMatched);
}, () => {
return Parse.Promise.as(false);
return Promise.resolve(false);
});
}

View File

@@ -7,7 +7,7 @@ function userForSessionToken(sessionToken){
q.equalTo("sessionToken", sessionToken);
return q.first({useMasterKey:true}).then(function(session){
if(!session){
return Parse.Promise.error("No session found for session token");
return Promise.reject("No session found for session token");
}
return session.get("user");
});
@@ -25,21 +25,21 @@ class SessionTokenCache {
getUserId(sessionToken: string): any {
if (!sessionToken) {
return Parse.Promise.error('Empty sessionToken');
return Promise.reject('Empty sessionToken');
}
const userId = this.cache.get(sessionToken);
if (userId) {
logger.verbose('Fetch userId %s of sessionToken %s from Cache', userId, sessionToken);
return Parse.Promise.as(userId);
return Promise.resolve(userId);
}
return userForSessionToken(sessionToken).then((user) => {
logger.verbose('Fetch userId %s of sessionToken %s from Parse', user.id, sessionToken);
const userId = user.id;
this.cache.set(sessionToken, userId);
return Parse.Promise.as(userId);
return Promise.resolve(userId);
}, (error) => {
logger.error('Can not fetch userId for sessionToken %j, error %j', sessionToken, error);
return Parse.Promise.error(error);
return Promise.reject(error);
});
}
}

View File

@@ -6,15 +6,15 @@ const Parse = require('parse/node');
function getSessionToken(options) {
if (options && typeof options.sessionToken === 'string') {
return Parse.Promise.as(options.sessionToken);
return Promise.resolve(options.sessionToken);
}
return Parse.Promise.as(null);
return Promise.resolve(null);
}
function getAuth(options = {}, config) {
const installationId = options.installationId || 'cloud';
if (options.useMasterKey) {
return Parse.Promise.as(new Auth.Auth({config, isMaster: true, installationId }));
return Promise.resolve(new Auth.Auth({config, isMaster: true, installationId }));
}
return getSessionToken(options).then((sessionToken) => {
if (sessionToken) {
@@ -25,7 +25,7 @@ function getAuth(options = {}, config) {
installationId
});
} else {
return Parse.Promise.as(new Auth.Auth({ config, installationId }));
return Promise.resolve(new Auth.Auth({ config, installationId }));
}
})
}
@@ -48,12 +48,12 @@ function ParseServerRESTController(applicationId, router) {
if (path === '/batch') {
const promises = data.requests.map((request) => {
return handleRequest(request.method, request.path, request.body, options).then((response) => {
return Parse.Promise.as({success: response});
return Promise.resolve({success: response});
}, (error) => {
return Parse.Promise.as({error: {code: error.code, error: error.message}});
return Promise.resolve({error: {code: error.code, error: error.message}});
});
});
return Parse.Promise.all(promises);
return Promise.all(promises);
}
let query;
@@ -61,7 +61,7 @@ function ParseServerRESTController(applicationId, router) {
query = data;
}
return new Parse.Promise((resolve, reject) => {
return new Promise((resolve, reject) => {
getAuth(options, config).then((auth) => {
const request = {
body: data,

View File

@@ -1,5 +1,4 @@
import request from 'request';
import Parse from 'parse/node';
import HTTPResponse from './HTTPResponse';
import querystring from 'querystring';
import log from '../logger';
@@ -35,7 +34,6 @@ var encodeBody = function({body, headers = {}}) {
}
module.exports = function(options) {
var promise = new Parse.Promise();
var callbacks = {
success: options.success,
error: options.error
@@ -54,30 +52,30 @@ module.exports = function(options) {
}
// force the response as a buffer
options.encoding = null;
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) {
if (callbacks.error) {
callbacks.error(error);
}
return reject(error);
}
const httpResponse = new HTTPResponse(response, body);
request(options, (error, response, body) => {
if (error) {
if (callbacks.error) {
callbacks.error(error);
// Consider <200 && >= 400 as errors
if (httpResponse.status < 200 || httpResponse.status >= 400) {
if (callbacks.error) {
callbacks.error(httpResponse);
}
return reject(httpResponse);
} else {
if (callbacks.success) {
callbacks.success(httpResponse);
}
return resolve(httpResponse);
}
return promise.reject(error);
}
const httpResponse = new HTTPResponse(response, body);
// Consider <200 && >= 400 as errors
if (httpResponse.status < 200 || httpResponse.status >= 400) {
if (callbacks.error) {
callbacks.error(httpResponse);
}
return promise.reject(httpResponse);
} else {
if (callbacks.success) {
callbacks.success(httpResponse);
}
return promise.resolve(httpResponse);
}
});
});
return promise;
};
module.exports.encodeBody = encodeBody;