reyesoft / ngx-jsonapi

JSON API client library for Angular 5+ 👌 :: Production Ready 🚀
https://ngx-jsonapi.reyesoft.com/
MIT License
101 stars 52 forks source link

Resource: "hasOneRelated" check failed after calling "removeRelationship" and saved #292

Open lunarmoon26 opened 4 years ago

lunarmoon26 commented 4 years ago

Angular Version:

8.1.3

ngx-jsonapi Version:

2.1.15

npm Version:

6.14.6

Typescript Version:

3.4.5

OS:

Windows 10

Given:

foo is the only possible relationship (One related) The service follows the JSON api specs, i.e. if no related foo, then there won't be relationships key on the Resource Calling the GET service with include: ['foo']

Steps:

  1. Load the resource with GET (doesn't matter with or without the related foo)
  2. Update the resource, call removeRelationship('foo')
  3. Save the resource with .save(), it will POST to the service
  4. Load the same resource again with GET and check hasOneRelated

Issue:

TypeError: Cannot read property 'type' of null at Ln.hasOneRelated ...

Analysis:

  1. The foo was initialized as an empty Resource the first time, if there is no relationships key returned from the service
  2. After the removal & save, the local Resource was updated and relationships.foo.data would become null
  3. Since hasOneRelated checks ...relationships[resource].data).type, it will throw NullPointer exception

Suggestion:

add a condition in hasOneRelated, i.e.

    public hasOneRelated(resource: string): boolean {
        return Boolean(
            this.relationships[resource] &&
------>     this.relationships[resource].data &&
                (<Resource>this.relationships[resource].data).type &&
                (<Resource>this.relationships[resource].data).type !== ''
        );
    }