Repository navigation
Open
Description
Currently the library doesn't support removing an BelongsTo relation. You can set the relation to null but this isn't send to the backend
My current fix:
/**
* Fix clearing of belongsTo relation
*
* @param data
*/
protected getRelationships(data: any): any {
let relationships: any;
const belongsToMetadata: any[] = Reflect.getMetadata('BelongsTo', data) || [];
const hasManyMetadata: any[] = Reflect.getMetadata('HasMany', data) || [];
for (const key in data) {
if (data.hasOwnProperty(key)) {
if (data[key] instanceof JsonApiModel) {
relationships = relationships || {};
if (data[key].id) {
const entity = belongsToMetadata.find((entity: any) => entity.propertyName === key);
const relationshipKey = entity.relationship;
relationships[relationshipKey] = {
data: this.buildSingleRelationshipData(data[key])
};
}
} else if (data[key] instanceof Array) {
const entity = hasManyMetadata.find((entity: any) => entity.propertyName === key);
if (entity && this.isValidToManyRelation(data[key])) {
relationships = relationships || {};
const relationshipKey = entity.relationship;
const relationshipData = data[key]
.filter((model: JsonApiModel) => model.id)
.map((model: JsonApiModel) => this.buildSingleRelationshipData(model));
relationships[relationshipKey] = {
data: relationshipData
};
}
} else if (data[key] === null) {
const entity = belongsToMetadata.find((entity: any) => entity.propertyName === key);
if (entity) {
relationships = relationships || {};
relationships[entity.relationship] = {
data: null
};
}
}
}
}
return relationships;
}
The updateRelationships method can not handle relationshipKey: {data: null} response.
This is fixed with:
/**
* @param model
* @param relationships
*/
protected updateRelationships<T extends JsonApiModel>(model: T, relationships: any): T {
const modelsTypes: any = Reflect.getMetadata('JsonApiDatastoreConfig', this.constructor).models;
for (const relationship in relationships) {
if (relationships.hasOwnProperty(relationship) && model.hasOwnProperty(relationship) && model[relationship]) {
const relationshipModel: JsonApiModel = model[relationship];
const hasMany: any[] = Reflect.getMetadata('HasMany', relationshipModel);
const propertyHasMany: any = find(hasMany, (property) => {
return modelsTypes[property.relationship] === model.constructor;
});
if (propertyHasMany) {
relationshipModel[propertyHasMany.propertyName] = relationshipModel[propertyHasMany.propertyName] || [];
const indexOfModel = relationshipModel[propertyHasMany.propertyName].indexOf(model);
if (indexOfModel === -1) {
relationshipModel[propertyHasMany.propertyName].push(model);
} else {
relationshipModel[propertyHasMany.propertyName][indexOfModel] = model;
}
}
}
}
return model;
}
Metadata
Metadata
Assignees
Labels
No labels
Activity
[BUGFIX] ghidoz#244 Fix removing belongsTo relations
frans-beech-it commentedon Oct 9, 2020
Related PR #245
[BUGFIX] #244 Fix removing belongsTo relations (#245)