support Relation object saving (#3074)
* support Parse.Relation object save * prevent Relation object from being saved in storage
This commit is contained in:
committed by
Florent Vilmart
parent
e9e6a4764e
commit
4ea455b20a
@@ -236,6 +236,19 @@ describe('parseObjectToMongoObjectForCreate', () => {
|
||||
done();
|
||||
});
|
||||
|
||||
it('removes Relation types', (done) => {
|
||||
var input = {
|
||||
aRelation: { __type: 'Relation', className: 'Stuff' },
|
||||
};
|
||||
var output = transform.parseObjectToMongoObjectForCreate(null, input, {
|
||||
fields: {
|
||||
aRelation: { __type: 'Relation', className: 'Stuff' },
|
||||
},
|
||||
});
|
||||
expect(output).toEqual({});
|
||||
done();
|
||||
});
|
||||
|
||||
it('writes the old ACL format in addition to rperm and wperm on update', (done) => {
|
||||
var input = {
|
||||
_rperm: ['*'],
|
||||
@@ -280,5 +293,19 @@ describe('parseObjectToMongoObjectForCreate', () => {
|
||||
expect(output.double).toBe(Number.MAX_VALUE);
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('transformUpdate', () => {
|
||||
it('removes Relation types', (done) => {
|
||||
var input = {
|
||||
aRelation: { __type: 'Relation', className: 'Stuff' },
|
||||
};
|
||||
var output = transform.transformUpdate(null, input, {
|
||||
fields: {
|
||||
aRelation: { __type: 'Relation', className: 'Stuff' },
|
||||
},
|
||||
});
|
||||
expect(output).toEqual({});
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -741,4 +741,32 @@ describe('Parse.Relation testing', () => {
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('can be saved without error', done => {
|
||||
let obj1 = new Parse.Object('PPAP');
|
||||
obj1.save()
|
||||
.then(() => {
|
||||
let newRelation = obj1.relation('aRelation');
|
||||
newRelation.add(obj1);
|
||||
obj1.save().then(() => {
|
||||
let relation = obj1.get('aRelation');
|
||||
obj1.set('aRelation', relation);
|
||||
obj1.save().then(() => {
|
||||
done();
|
||||
}, error => {
|
||||
fail('failed to save ParseRelation object');
|
||||
fail(error);
|
||||
done();
|
||||
});
|
||||
}, error => {
|
||||
fail('failed to create relation field');
|
||||
fail(error);
|
||||
done();
|
||||
});
|
||||
}, error => {
|
||||
fail('failed to save obj');
|
||||
fail(error);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -56,6 +56,21 @@ describe('SchemaController', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('can validate Relation object', (done) => {
|
||||
config.database.loadSchema().then((schema) => {
|
||||
return schema.validateObject('Stuff', {aRelation: {__type:'Relation',className:'Stuff'}});
|
||||
}).then((schema) => {
|
||||
return schema.validateObject('Stuff', {aRelation: {__type:'Pointer',className:'Stuff'}})
|
||||
.then((schema) => {
|
||||
fail('expected invalidity');
|
||||
done();
|
||||
}, done);
|
||||
}, (err) => {
|
||||
fail(err);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('rejects inconsistent types', (done) => {
|
||||
config.database.loadSchema().then((schema) => {
|
||||
return schema.validateObject('Stuff', {bacon: 7});
|
||||
|
||||
@@ -319,6 +319,9 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => {
|
||||
restCreate = addLegacyACL(restCreate);
|
||||
let mongoCreate = {}
|
||||
for (let restKey in restCreate) {
|
||||
if (restCreate[restKey] && restCreate[restKey].__type === 'Relation') {
|
||||
continue;
|
||||
}
|
||||
let { key, value } = parseObjectKeyValueToMongoObjectKeyValue(
|
||||
restKey,
|
||||
restCreate[restKey],
|
||||
@@ -359,6 +362,9 @@ const transformUpdate = (className, restUpdate, parseFormatSchema) => {
|
||||
}
|
||||
}
|
||||
for (var restKey in restUpdate) {
|
||||
if (restUpdate[restKey] && restUpdate[restKey].__type === 'Relation') {
|
||||
continue;
|
||||
}
|
||||
var out = transformKeyValueForUpdate(className, restKey, restUpdate[restKey], parseFormatSchema);
|
||||
|
||||
// If the output value is an object with any $ keys, it's an
|
||||
|
||||
@@ -895,6 +895,13 @@ function getObjectType(obj) {
|
||||
targetClass: obj.className
|
||||
}
|
||||
}
|
||||
case 'Relation' :
|
||||
if(obj.className) {
|
||||
return {
|
||||
type: 'Relation',
|
||||
targetClass: obj.className
|
||||
}
|
||||
}
|
||||
case 'File' :
|
||||
if(obj.name) {
|
||||
return 'File';
|
||||
|
||||
Reference in New Issue
Block a user