108915: Prevent self links & unresolved followLinks to be added as dependencies

This commit is contained in:
Alexandre Vryghem
2024-02-19 18:56:43 +01:00
parent ecb20bbcbf
commit 8ddc62168e
2 changed files with 22 additions and 14 deletions

View File

@@ -78,6 +78,8 @@ describe('BaseDataService', () => {
const msToLive = 15 * 60 * 1000; const msToLive = 15 * 60 * 1000;
const payload = { const payload = {
foo: 'bar', foo: 'bar',
followLink1: {},
followLink2: {},
_links: { _links: {
self: Object.assign(new HALLink(), { self: Object.assign(new HALLink(), {
href: 'self-test-link', href: 'self-test-link',
@@ -407,7 +409,7 @@ describe('BaseDataService', () => {
expectObservable(service.findByHref(selfLink, false, false, ...linksToFollow)).toBe(expected, values); expectObservable(service.findByHref(selfLink, false, false, ...linksToFollow)).toBe(expected, values);
flush(); flush();
expect(objectCache.addDependency).toHaveBeenCalledTimes(4); expect(objectCache.addDependency).toHaveBeenCalledTimes(3);
}); });
}); });
}); });
@@ -610,7 +612,7 @@ describe('BaseDataService', () => {
expectObservable(service.findListByHref(selfLink, findListOptions, false, false, ...linksToFollow)).toBe(expected, values); expectObservable(service.findListByHref(selfLink, findListOptions, false, false, ...linksToFollow)).toBe(expected, values);
flush(); flush();
expect(objectCache.addDependency).toHaveBeenCalledTimes(4); expect(objectCache.addDependency).toHaveBeenCalledTimes(3);
}); });
}); });
}); });

View File

@@ -282,12 +282,15 @@ export class BaseDataService<T extends CacheableObject> implements HALDataServic
// Ensure all followLinks from the cached object are automatically invalidated when invalidating the cached object // Ensure all followLinks from the cached object are automatically invalidated when invalidating the cached object
tap((remoteDataObject: RemoteData<T>) => { tap((remoteDataObject: RemoteData<T>) => {
if (hasValue(remoteDataObject?.payload?._links)) { if (hasValue(remoteDataObject?.payload?._links)) {
for (const followLink of Object.values(remoteDataObject.payload._links)) { for (const followLinkName of Object.keys(remoteDataObject.payload._links)) {
// followLink can be either an individual HALLink or a HALLink[] // only add the followLinks if they are embedded
const followLinksList: HALLink[] = [].concat(followLink); if (hasValue(remoteDataObject.payload[followLinkName]) && followLinkName !== 'self') {
for (const individualFollowLink of followLinksList) { // followLink can be either an individual HALLink or a HALLink[]
if (hasValue(individualFollowLink?.href)) { const followLinksList: HALLink[] = [].concat(remoteDataObject.payload._links[followLinkName]);
this.addDependency(response$, individualFollowLink.href); for (const individualFollowLink of followLinksList) {
if (hasValue(individualFollowLink?.href)) {
this.addDependency(response$, individualFollowLink.href);
}
} }
} }
} }
@@ -334,12 +337,15 @@ export class BaseDataService<T extends CacheableObject> implements HALDataServic
if (hasValue(remoteDataObject?.payload?.page)) { if (hasValue(remoteDataObject?.payload?.page)) {
for (const object of remoteDataObject.payload.page) { for (const object of remoteDataObject.payload.page) {
if (hasValue(object?._links)) { if (hasValue(object?._links)) {
for (const followLink of Object.values(object._links)) { for (const followLinkName of Object.keys(object._links)) {
// followLink can be either an individual HALLink or a HALLink[] // only add the followLinks if they are embedded
const followLinksList: HALLink[] = [].concat(followLink); if (hasValue(object[followLinkName]) && followLinkName !== 'self') {
for (const individualFollowLink of followLinksList) { // followLink can be either an individual HALLink or a HALLink[]
if (hasValue(individualFollowLink?.href)) { const followLinksList: HALLink[] = [].concat(object._links[followLinkName]);
this.addDependency(response$, individualFollowLink.href); for (const individualFollowLink of followLinksList) {
if (hasValue(individualFollowLink?.href)) {
this.addDependency(response$, individualFollowLink.href);
}
} }
} }
} }