Skip to content

Commit c417118

Browse files
committed
refactor: Improve afterFind trigger handling and object processing
1 parent 43a87bb commit c417118

File tree

2 files changed

+55
-34
lines changed

2 files changed

+55
-34
lines changed

src/rest.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,23 @@ async function runFindTriggers(
4848
restOptions = result.restOptions || restOptions;
4949

5050
if (result?.objects) {
51-
const objects = result.objects;
51+
const objectsFromBeforeFind = result.objects;
5252

53-
// Déclencher le trigger afterFind si des objets sont retournés
54-
await triggers.maybeRunAfterFindTrigger(
53+
const afterFindProcessedObjects = await triggers.maybeRunAfterFindTrigger(
5554
triggers.Types.afterFind,
5655
auth,
5756
className,
58-
objects,
57+
objectsFromBeforeFind,
5958
config,
60-
restWhere,
59+
new Parse.Query(className).withJSON({ where: restWhere, ...restOptions }),
6160
context
6261
);
6362

6463
return {
65-
results: objects.map(row => row._toFullJSON()),
64+
results: afterFindProcessedObjects,
6665
};
6766
}
6867

69-
// Conserver la distinction entre get et find
7068
const query = await RestQuery({
7169
method: isGet ? RestQuery.Method.get : RestQuery.Method.find,
7270
config,
@@ -76,6 +74,7 @@ async function runFindTriggers(
7674
restOptions,
7775
clientSDK,
7876
context,
77+
runBeforeFind: false,
7978
});
8079

8180
return query.execute();

src/triggers.js

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,11 @@ export function toJSONwithObjects(object, className) {
182182
}
183183
toJSON[key] = val._toFullJSON();
184184
}
185+
// Preserve original object's className if no override className is provided
185186
if (className) {
186187
toJSON.className = className;
188+
} else if (object.className && !toJSON.className) {
189+
toJSON.className = object.className;
187190
}
188191
return toJSON;
189192
}
@@ -437,72 +440,91 @@ function logTriggerErrorBeforeHook(triggerType, className, input, auth, error, l
437440
export function maybeRunAfterFindTrigger(
438441
triggerType,
439442
auth,
440-
className,
441-
objects,
443+
classNameQuery,
444+
objectsInput,
442445
config,
443446
query,
444447
context
445448
) {
446449
return new Promise((resolve, reject) => {
447-
const trigger = getTrigger(className, triggerType, config.applicationId);
450+
const trigger = getTrigger(classNameQuery, triggerType, config.applicationId);
451+
448452
if (!trigger) {
449-
return resolve();
453+
if (objectsInput && objectsInput.length > 0 && objectsInput[0] instanceof Parse.Object) {
454+
return resolve(objectsInput.map(obj => toJSONwithObjects(obj)));
455+
}
456+
return resolve(objectsInput || []);
450457
}
458+
451459
const request = getRequestObject(triggerType, auth, null, null, config, context);
452-
if (query) {
460+
if (query instanceof Parse.Query) {
453461
request.query = query;
462+
} else if (typeof query === 'object' && query !== null) {
463+
const parseQueryInstance = new Parse.Query(classNameQuery);
464+
if (query.where) {
465+
parseQueryInstance.withJSON(query);
466+
} else {
467+
parseQueryInstance.withJSON({ where: query });
468+
}
469+
request.query = parseQueryInstance;
470+
} else {
471+
request.query = new Parse.Query(classNameQuery);
454472
}
473+
455474
const { success, error } = getResponseObject(
456475
request,
457-
object => {
458-
resolve(object);
476+
processedObjectsJSON => {
477+
resolve(processedObjectsJSON);
459478
},
460-
error => {
461-
reject(error);
479+
errorData => {
480+
reject(errorData);
462481
}
463482
);
464483
logTriggerSuccessBeforeHook(
465484
triggerType,
466-
className,
467-
'AfterFind',
468-
JSON.stringify(objects),
485+
classNameQuery,
486+
'AfterFind Input (Pre-Transform)',
487+
JSON.stringify(
488+
objectsInput.map(o => (o instanceof Parse.Object ? o.id + ':' + o.className : o))
489+
),
469490
auth,
470491
config.logLevels.triggerBeforeSuccess
471492
);
472-
request.objects = objects.map(object => {
473-
//setting the class name to transform into parse object
474-
object.className = className;
475-
if (object instanceof Parse.Object) {
476-
return object;
493+
request.objects = objectsInput.map(currentObject => {
494+
if (currentObject instanceof Parse.Object) {
495+
return currentObject;
477496
}
478-
return Parse.Object.fromJSON(object);
497+
// Preserve the original className if it exists, otherwise use the query className
498+
const originalClassName = currentObject.className || classNameQuery;
499+
const tempObjectWithClassName = { ...currentObject, className: originalClassName };
500+
return Parse.Object.fromJSON(tempObjectWithClassName);
479501
});
480502
return Promise.resolve()
481503
.then(() => {
482-
return maybeRunValidator(request, `${triggerType}.${className}`, auth);
504+
return maybeRunValidator(request, `${triggerType}.${classNameQuery}`, auth);
483505
})
484506
.then(() => {
485507
if (request.skipWithMasterKey) {
486508
return request.objects;
487509
}
488-
const response = trigger(request);
489-
if (response && typeof response.then === 'function') {
490-
return response.then(results => {
510+
const responseFromTrigger = trigger(request);
511+
if (responseFromTrigger && typeof responseFromTrigger.then === 'function') {
512+
return responseFromTrigger.then(results => {
491513
return results;
492514
});
493515
}
494-
return response;
516+
return responseFromTrigger;
495517
})
496518
.then(success, error);
497-
}).then(results => {
519+
}).then(resultsAsJSON => {
498520
logTriggerAfterHook(
499521
triggerType,
500-
className,
501-
JSON.stringify(results),
522+
classNameQuery,
523+
JSON.stringify(resultsAsJSON),
502524
auth,
503525
config.logLevels.triggerAfter
504526
);
505-
return results;
527+
return resultsAsJSON;
506528
});
507529
}
508530

0 commit comments

Comments
 (0)