Skip to content

Commit c1971b2

Browse files
authored
fix(beforeSave/afterSave): Return value instead of Parse.Op for nested fields (#7005)
* fix(beforeSave): Return value instead of Parse.Op * afterSave test * Improve Tests * Fixed postgres test by saveArgumentsByValue
1 parent a4c84c0 commit c1971b2

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

spec/CloudCode.spec.js

+25-1
Original file line numberDiff line numberDiff line change
@@ -1480,17 +1480,41 @@ describe('Cloud Code', () => {
14801480
});
14811481

14821482
it('beforeSave should not sanitize database', async done => {
1483+
const { adapter } = Config.get(Parse.applicationId).database;
1484+
const spy = spyOn(adapter, 'findOneAndUpdate').and.callThrough();
1485+
spy.calls.saveArgumentsByValue();
1486+
14831487
let count = 0;
1484-
Parse.Cloud.beforeSave('CloudIncrementNested', () => {
1488+
Parse.Cloud.beforeSave('CloudIncrementNested', req => {
14851489
count += 1;
1490+
req.object.set('foo', 'baz');
1491+
expect(typeof req.object.get('objectField').number).toBe('number');
1492+
});
1493+
1494+
Parse.Cloud.afterSave('CloudIncrementNested', req => {
1495+
expect(typeof req.object.get('objectField').number).toBe('number');
14861496
});
14871497

14881498
const obj = new Parse.Object('CloudIncrementNested');
14891499
obj.set('objectField', { number: 5 });
1500+
obj.set('foo', 'bar');
14901501
await obj.save();
14911502

14921503
obj.increment('objectField.number', 10);
14931504
await obj.save();
1505+
1506+
const [
1507+
,
1508+
,
1509+
,
1510+
/* className */ /* schema */ /* query */ update,
1511+
] = adapter.findOneAndUpdate.calls.first().args;
1512+
expect(update).toEqual({
1513+
'objectField.number': { __op: 'Increment', amount: 10 },
1514+
foo: 'baz',
1515+
updatedAt: obj.updatedAt.toISOString(),
1516+
});
1517+
14941518
count === 2 ? done() : fail();
14951519
});
14961520

src/RestWrite.js

+12-8
Original file line numberDiff line numberDiff line change
@@ -1558,15 +1558,19 @@ RestWrite.prototype.buildUpdatedObject = function (extraData) {
15581558
const updatedObject = triggers.inflate(extraData, this.originalData);
15591559
Object.keys(this.data).reduce(function (data, key) {
15601560
if (key.indexOf('.') > 0) {
1561-
// subdocument key with dot notation ('x.y':v => 'x':{'y':v})
1562-
const splittedKey = key.split('.');
1563-
const parentProp = splittedKey[0];
1564-
let parentVal = updatedObject.get(parentProp);
1565-
if (typeof parentVal !== 'object') {
1566-
parentVal = {};
1561+
if (typeof data[key].__op === 'string') {
1562+
updatedObject.set(key, data[key]);
1563+
} else {
1564+
// subdocument key with dot notation { 'x.y': v } => { 'x': { 'y' : v } })
1565+
const splittedKey = key.split('.');
1566+
const parentProp = splittedKey[0];
1567+
let parentVal = updatedObject.get(parentProp);
1568+
if (typeof parentVal !== 'object') {
1569+
parentVal = {};
1570+
}
1571+
parentVal[splittedKey[1]] = data[key];
1572+
updatedObject.set(parentProp, parentVal);
15671573
}
1568-
parentVal[splittedKey[1]] = data[key];
1569-
updatedObject.set(parentProp, parentVal);
15701574
delete data[key];
15711575
}
15721576
return data;

0 commit comments

Comments
 (0)