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();
|
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) => {
|
it('writes the old ACL format in addition to rperm and wperm on update', (done) => {
|
||||||
var input = {
|
var input = {
|
||||||
_rperm: ['*'],
|
_rperm: ['*'],
|
||||||
@@ -280,5 +293,19 @@ describe('parseObjectToMongoObjectForCreate', () => {
|
|||||||
expect(output.double).toBe(Number.MAX_VALUE);
|
expect(output.double).toBe(Number.MAX_VALUE);
|
||||||
done();
|
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();
|
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) => {
|
it('rejects inconsistent types', (done) => {
|
||||||
config.database.loadSchema().then((schema) => {
|
config.database.loadSchema().then((schema) => {
|
||||||
return schema.validateObject('Stuff', {bacon: 7});
|
return schema.validateObject('Stuff', {bacon: 7});
|
||||||
|
|||||||
@@ -319,6 +319,9 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => {
|
|||||||
restCreate = addLegacyACL(restCreate);
|
restCreate = addLegacyACL(restCreate);
|
||||||
let mongoCreate = {}
|
let mongoCreate = {}
|
||||||
for (let restKey in restCreate) {
|
for (let restKey in restCreate) {
|
||||||
|
if (restCreate[restKey] && restCreate[restKey].__type === 'Relation') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let { key, value } = parseObjectKeyValueToMongoObjectKeyValue(
|
let { key, value } = parseObjectKeyValueToMongoObjectKeyValue(
|
||||||
restKey,
|
restKey,
|
||||||
restCreate[restKey],
|
restCreate[restKey],
|
||||||
@@ -359,6 +362,9 @@ const transformUpdate = (className, restUpdate, parseFormatSchema) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var restKey in restUpdate) {
|
for (var restKey in restUpdate) {
|
||||||
|
if (restUpdate[restKey] && restUpdate[restKey].__type === 'Relation') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
var out = transformKeyValueForUpdate(className, restKey, restUpdate[restKey], parseFormatSchema);
|
var out = transformKeyValueForUpdate(className, restKey, restUpdate[restKey], parseFormatSchema);
|
||||||
|
|
||||||
// If the output value is an object with any $ keys, it's an
|
// If the output value is an object with any $ keys, it's an
|
||||||
|
|||||||
@@ -895,6 +895,13 @@ function getObjectType(obj) {
|
|||||||
targetClass: obj.className
|
targetClass: obj.className
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case 'Relation' :
|
||||||
|
if(obj.className) {
|
||||||
|
return {
|
||||||
|
type: 'Relation',
|
||||||
|
targetClass: obj.className
|
||||||
|
}
|
||||||
|
}
|
||||||
case 'File' :
|
case 'File' :
|
||||||
if(obj.name) {
|
if(obj.name) {
|
||||||
return 'File';
|
return 'File';
|
||||||
|
|||||||
Reference in New Issue
Block a user