Skip to content

Commit e8ae442

Browse files
fix: copied code from draft pr
1 parent ed69e03 commit e8ae442

File tree

2 files changed

+53
-15
lines changed

2 files changed

+53
-15
lines changed

spec/ParseAPI.spec.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1845,6 +1845,58 @@ describe('miscellaneous', () => {
18451845
}
18461846
);
18471847
});
1848+
1849+
it('test afterSave with deeply nested keys (#7384)', async () => {
1850+
let triggerTime = 0;
1851+
Parse.Cloud.afterSave('GameScore', function (req) {
1852+
const object = req.object;
1853+
expect(object instanceof Parse.Object).toBeTruthy();
1854+
triggerTime++;
1855+
if (triggerTime == 1) {
1856+
// Create
1857+
expect(object.get('a')).toEqual({ b: 0, c: { d: 1 } });
1858+
expect(object.get('e')).toEqual(2);
1859+
} else if (triggerTime == 2) {
1860+
// Update, increment
1861+
expect(object.get('a')).toEqual({ b: 10, c: { d: 12 } });
1862+
expect(object.get('e')).toEqual(14);
1863+
} else if (triggerTime == 3) {
1864+
// Update, set
1865+
expect(object.get('a')).toEqual({ b: 100, c: { d: 200 } });
1866+
expect(object.get('e')).toEqual(300);
1867+
} else if (triggerTime == 4) {
1868+
// Update, unset on a.c.d
1869+
expect(object.get('a')).toEqual({ b: 100, c: {} });
1870+
expect(object.get('e')).toEqual(300);
1871+
} else if (triggerTime == 5) {
1872+
// Update, unset on a.b
1873+
expect(object.get('a')).toEqual({ c: {} });
1874+
expect(object.get('e')).toEqual(300);
1875+
} else {
1876+
throw new Error();
1877+
}
1878+
1879+
});
1880+
1881+
const obj = new Parse.Object('GameScore');
1882+
obj.set('a', { b: 0, c: { d: 1 } });
1883+
obj.set('e', 2);
1884+
await obj.save();
1885+
obj.increment('a.b', 10);
1886+
obj.increment('a.c.d', 11);
1887+
obj.increment('e', 12);
1888+
await obj.save();
1889+
obj.set('a.b', 100);
1890+
obj.set('a.c.d', 200);
1891+
obj.set('e', 300);
1892+
await obj.save();
1893+
obj.unset('a.c.d');
1894+
await obj.save();
1895+
obj.unset('a.b');
1896+
await obj.save();
1897+
// Make sure the checking has been triggered
1898+
expect(triggerTime).toBe(5);
1899+
});
18481900
});
18491901

18501902
describe_only_db('mongo')('legacy _acl', () => {

src/RestWrite.js

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,21 +1751,7 @@ RestWrite.prototype.buildParseObjects = function () {
17511751
const updatedObject = triggers.inflate(extraData, this.originalData);
17521752
Object.keys(this.data).reduce(function (data, key) {
17531753
if (key.indexOf('.') > 0) {
1754-
if (typeof data[key].__op === 'string') {
1755-
if (!readOnlyAttributes.includes(key)) {
1756-
updatedObject.set(key, data[key]);
1757-
}
1758-
} else {
1759-
// subdocument key with dot notation { 'x.y': v } => { 'x': { 'y' : v } })
1760-
const splittedKey = key.split('.');
1761-
const parentProp = splittedKey[0];
1762-
let parentVal = updatedObject.get(parentProp);
1763-
if (typeof parentVal !== 'object') {
1764-
parentVal = {};
1765-
}
1766-
parentVal[splittedKey[1]] = data[key];
1767-
updatedObject.set(parentProp, parentVal);
1768-
}
1754+
updatedObject.set(key, data[key]);
17691755
delete data[key];
17701756
}
17711757
return data;

0 commit comments

Comments
 (0)