angular2-jsonapi icon indicating copy to clipboard operation
angular2-jsonapi copied to clipboard

Can not remove belongsTo relation

Open frans-beech-it opened this issue 6 years ago • 1 comments

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;
    }

frans-beech-it avatar Sep 20 '19 13:09 frans-beech-it

Related PR https://github.com/ghidoz/angular2-jsonapi/pull/245

frans-beech-it avatar Oct 09 '20 15:10 frans-beech-it