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:
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user