feat: Allow returning objects in Parse.Cloud.beforeFind without invoking database query (#9770)
This commit is contained in:
@@ -182,8 +182,11 @@ export function toJSONwithObjects(object, className) {
|
||||
}
|
||||
toJSON[key] = val._toFullJSON();
|
||||
}
|
||||
// Preserve original object's className if no override className is provided
|
||||
if (className) {
|
||||
toJSON.className = className;
|
||||
} else if (object.className && !toJSON.className) {
|
||||
toJSON.className = object.className;
|
||||
}
|
||||
return toJSON;
|
||||
}
|
||||
@@ -257,7 +260,8 @@ export function getRequestObject(
|
||||
parseObject,
|
||||
originalParseObject,
|
||||
config,
|
||||
context
|
||||
context,
|
||||
isGet
|
||||
) {
|
||||
const request = {
|
||||
triggerName: triggerType,
|
||||
@@ -268,6 +272,10 @@ export function getRequestObject(
|
||||
ip: config.ip,
|
||||
};
|
||||
|
||||
if (isGet !== undefined) {
|
||||
request.isGet = !!isGet;
|
||||
}
|
||||
|
||||
if (originalParseObject) {
|
||||
request.original = originalParseObject;
|
||||
}
|
||||
@@ -437,69 +445,93 @@ function logTriggerErrorBeforeHook(triggerType, className, input, auth, error, l
|
||||
export function maybeRunAfterFindTrigger(
|
||||
triggerType,
|
||||
auth,
|
||||
className,
|
||||
objects,
|
||||
classNameQuery,
|
||||
objectsInput,
|
||||
config,
|
||||
query,
|
||||
context
|
||||
context,
|
||||
isGet
|
||||
) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const trigger = getTrigger(className, triggerType, config.applicationId);
|
||||
const trigger = getTrigger(classNameQuery, triggerType, config.applicationId);
|
||||
|
||||
if (!trigger) {
|
||||
return resolve();
|
||||
if (objectsInput && objectsInput.length > 0 && objectsInput[0] instanceof Parse.Object) {
|
||||
return resolve(objectsInput.map(obj => toJSONwithObjects(obj)));
|
||||
}
|
||||
return resolve(objectsInput || []);
|
||||
}
|
||||
const request = getRequestObject(triggerType, auth, null, null, config, context);
|
||||
if (query) {
|
||||
|
||||
const request = getRequestObject(triggerType, auth, null, null, config, context, isGet);
|
||||
// Convert query parameter to Parse.Query instance
|
||||
if (query instanceof Parse.Query) {
|
||||
request.query = query;
|
||||
} else if (typeof query === 'object' && query !== null) {
|
||||
const parseQueryInstance = new Parse.Query(classNameQuery);
|
||||
if (query.where) {
|
||||
parseQueryInstance.withJSON(query);
|
||||
}
|
||||
request.query = parseQueryInstance;
|
||||
} else {
|
||||
request.query = new Parse.Query(classNameQuery);
|
||||
}
|
||||
|
||||
const { success, error } = getResponseObject(
|
||||
request,
|
||||
object => {
|
||||
resolve(object);
|
||||
processedObjectsJSON => {
|
||||
resolve(processedObjectsJSON);
|
||||
},
|
||||
error => {
|
||||
reject(error);
|
||||
errorData => {
|
||||
reject(errorData);
|
||||
}
|
||||
);
|
||||
logTriggerSuccessBeforeHook(
|
||||
triggerType,
|
||||
className,
|
||||
'AfterFind',
|
||||
JSON.stringify(objects),
|
||||
classNameQuery,
|
||||
'AfterFind Input (Pre-Transform)',
|
||||
JSON.stringify(
|
||||
objectsInput.map(o => (o instanceof Parse.Object ? o.id + ':' + o.className : o))
|
||||
),
|
||||
auth,
|
||||
config.logLevels.triggerBeforeSuccess
|
||||
);
|
||||
request.objects = objects.map(object => {
|
||||
//setting the class name to transform into parse object
|
||||
object.className = className;
|
||||
return Parse.Object.fromJSON(object);
|
||||
|
||||
// Convert plain objects to Parse.Object instances for trigger
|
||||
request.objects = objectsInput.map(currentObject => {
|
||||
if (currentObject instanceof Parse.Object) {
|
||||
return currentObject;
|
||||
}
|
||||
// Preserve the original className if it exists, otherwise use the query className
|
||||
const originalClassName = currentObject.className || classNameQuery;
|
||||
const tempObjectWithClassName = { ...currentObject, className: originalClassName };
|
||||
return Parse.Object.fromJSON(tempObjectWithClassName);
|
||||
});
|
||||
return Promise.resolve()
|
||||
.then(() => {
|
||||
return maybeRunValidator(request, `${triggerType}.${className}`, auth);
|
||||
return maybeRunValidator(request, `${triggerType}.${classNameQuery}`, auth);
|
||||
})
|
||||
.then(() => {
|
||||
if (request.skipWithMasterKey) {
|
||||
return request.objects;
|
||||
}
|
||||
const response = trigger(request);
|
||||
if (response && typeof response.then === 'function') {
|
||||
return response.then(results => {
|
||||
const responseFromTrigger = trigger(request);
|
||||
if (responseFromTrigger && typeof responseFromTrigger.then === 'function') {
|
||||
return responseFromTrigger.then(results => {
|
||||
return results;
|
||||
});
|
||||
}
|
||||
return response;
|
||||
return responseFromTrigger;
|
||||
})
|
||||
.then(success, error);
|
||||
}).then(results => {
|
||||
}).then(resultsAsJSON => {
|
||||
logTriggerAfterHook(
|
||||
triggerType,
|
||||
className,
|
||||
JSON.stringify(results),
|
||||
classNameQuery,
|
||||
JSON.stringify(resultsAsJSON),
|
||||
auth,
|
||||
config.logLevels.triggerAfter
|
||||
);
|
||||
return results;
|
||||
return resultsAsJSON;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -607,9 +639,19 @@ export function maybeRunQueryTrigger(
|
||||
restOptions = restOptions || {};
|
||||
restOptions.subqueryReadPreference = requestObject.subqueryReadPreference;
|
||||
}
|
||||
let objects = undefined;
|
||||
if (result instanceof Parse.Object) {
|
||||
objects = [result];
|
||||
} else if (
|
||||
Array.isArray(result) &&
|
||||
(!result.length || result.every(obj => obj instanceof Parse.Object))
|
||||
) {
|
||||
objects = result;
|
||||
}
|
||||
return {
|
||||
restWhere,
|
||||
restOptions,
|
||||
objects,
|
||||
};
|
||||
},
|
||||
err => {
|
||||
|
||||
Reference in New Issue
Block a user