Skip to content

Commit f0674df

Browse files
authored
Fixes Issue unsetting in beforeSave doesn't allow object creation (#4610)
* skip unset fields on canAddField * removed fit * add null check
1 parent f03e35f commit f0674df

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

spec/schemas.spec.js

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1667,7 +1667,48 @@ describe('schemas', () => {
16671667
fail(JSON.stringify(error));
16681668
done();
16691669
})
1670-
})
1670+
});
1671+
1672+
it('unset field in beforeSave should not stop object creation', (done) => {
1673+
const hook = {
1674+
method: function(req, res) {
1675+
if (req.object.get('undesiredField')) {
1676+
req.object.unset('undesiredField');
1677+
}
1678+
return res.success();
1679+
}
1680+
};
1681+
spyOn(hook, 'method').and.callThrough();
1682+
Parse.Cloud.beforeSave('AnObject', hook.method);
1683+
setPermissionsOnClass('AnObject', {
1684+
get: {"*": true},
1685+
find: {"*": true},
1686+
create: {'*': true},
1687+
update: {'*': true},
1688+
delete: {'*': true},
1689+
addField:{}
1690+
}).then(() => {
1691+
const obj = new Parse.Object('AnObject');
1692+
obj.set('desiredField', 'createMe');
1693+
return obj.save(null, {useMasterKey: true});
1694+
}).then(() => {
1695+
const obj = new Parse.Object('AnObject');
1696+
obj.set('desiredField', 'This value should be kept');
1697+
obj.set('undesiredField', 'This value should be IGNORED');
1698+
return obj.save();
1699+
}).then(() => {
1700+
const query = new Parse.Query('AnObject');
1701+
return query.find();
1702+
}).then((results) => {
1703+
expect(results.length).toBe(2);
1704+
expect(results[0].has('desiredField')).toBe(true);
1705+
expect(results[1].has('desiredField')).toBe(true);
1706+
expect(results[0].has('undesiredField')).toBe(false);
1707+
expect(results[1].has('undesiredField')).toBe(false);
1708+
expect(hook.method).toHaveBeenCalled();
1709+
done();
1710+
});
1711+
});
16711712

16721713
it('gives correct response when deleting a schema with CLPs (regression test #1919)', done => {
16731714
new Parse.Object('MyClass').save({ data: 'foo'})

src/Controllers/DatabaseController.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,8 +622,12 @@ class DatabaseController {
622622
const fields = Object.keys(object);
623623
const schemaFields = Object.keys(classSchema);
624624
const newKeys = fields.filter((field) => {
625+
// Skip fields that are unset
626+
if (object[field] && object[field].__op && object[field].__op === 'Delete') {
627+
return false;
628+
}
625629
return schemaFields.indexOf(field) < 0;
626-
})
630+
});
627631
if (newKeys.length > 0) {
628632
return schema.validatePermission(className, aclGroup, 'addField');
629633
}

0 commit comments

Comments
 (0)