From 600165210190fb1389abe108b0a6e2aea5cfb6b2 Mon Sep 17 00:00:00 2001 From: Jesiel Viana Date: Thu, 17 Apr 2025 09:08:19 -0300 Subject: [PATCH 1/3] fix: prevent bitstream format cache issue by disabling cached version --- .../item-edit-bitstream-bundle.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts index 969a971ce9..87a0273cd5 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts @@ -246,7 +246,7 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy { switchMap(() => this.bundleService.getBitstreams( this.bundle.id, paginatedOptions, - followLink('format'), + followLink('format', { useCachedVersionIfAvailable: false }), )), ); }), From 4f48f39f7b24903eaea4a639a894520469e4fe95 Mon Sep 17 00:00:00 2001 From: Jesiel Viana Date: Thu, 24 Apr 2025 07:43:05 -0300 Subject: [PATCH 2/3] fix: invalidate cache only for the modified bitstream --- src/app/core/data/bitstream-data.service.ts | 15 +++++++++++++-- .../item-edit-bitstream-bundle.component.ts | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/app/core/data/bitstream-data.service.ts b/src/app/core/data/bitstream-data.service.ts index 9455a456fa..bdf01efc5c 100644 --- a/src/app/core/data/bitstream-data.service.ts +++ b/src/app/core/data/bitstream-data.service.ts @@ -163,12 +163,23 @@ export class BitstreamDataService extends IdentifiableDataService imp sendRequest(this.requestService), take(1), ).subscribe(() => { - this.requestService.removeByHrefSubstring(bitstream.self + '/format'); + this.deleteFormatCache(bitstream); }); - return this.rdbService.buildFromRequestUUID(requestId); } + private deleteFormatCache(bitstream: Bitstream) { + const bitsreamFormatUrl = bitstream.self + '/format'; + this.requestService.setStaleByHrefSubstring(bitsreamFormatUrl); + // Delete also cache by uuid as the format could be cached also there + this.objectCache.getByHref(bitsreamFormatUrl).pipe(take(1)).subscribe((cachedRequest) => { + const requestUuid = cachedRequest.requestUUIDs[0]; + if (this.requestService.hasByUUID(requestUuid)) { + this.requestService.setStaleByUUID(requestUuid); + } + }); + } + /** * Returns an observable of {@link RemoteData} of a {@link Bitstream}, based on a handle and an * optional sequenceId or filename, with a list of {@link FollowLinkConfig}, to automatically diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts index 87a0273cd5..969a971ce9 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts @@ -246,7 +246,7 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy { switchMap(() => this.bundleService.getBitstreams( this.bundle.id, paginatedOptions, - followLink('format', { useCachedVersionIfAvailable: false }), + followLink('format'), )), ); }), From bb536192c27df34222a3e9ea9532a0b1f1854555 Mon Sep 17 00:00:00 2001 From: Jesiel Viana Date: Thu, 24 Apr 2025 10:04:41 -0300 Subject: [PATCH 3/3] fix unit tests for bitstream-data.service.ts --- src/app/core/data/bitstream-data.service.spec.ts | 8 ++++++++ src/app/core/data/bitstream-data.service.ts | 8 +++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/app/core/data/bitstream-data.service.spec.ts b/src/app/core/data/bitstream-data.service.spec.ts index 6aa75065d4..68c6b4850c 100644 --- a/src/app/core/data/bitstream-data.service.spec.ts +++ b/src/app/core/data/bitstream-data.service.spec.ts @@ -37,6 +37,8 @@ import { } from './request.models'; import { RequestService } from './request.service'; import objectContaining = jasmine.objectContaining; +import { RestResponse } from '../cache/response.models'; +import { RequestEntry } from './request-entry.model'; describe('BitstreamDataService', () => { let service: BitstreamDataService; @@ -47,6 +49,7 @@ describe('BitstreamDataService', () => { let rdbService: RemoteDataBuildService; let bundleDataService: BundleDataService; const bitstreamFormatHref = 'rest-api/bitstreamformats'; + let responseCacheEntry: RequestEntry; const bitstream1 = Object.assign(new Bitstream(), { id: 'fake-bitstream1', @@ -71,8 +74,13 @@ describe('BitstreamDataService', () => { const url = 'fake-bitstream-url'; beforeEach(() => { + responseCacheEntry = new RequestEntry(); + responseCacheEntry.request = { href: 'https://rest.api/' } as any; + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + objectCache = jasmine.createSpyObj('objectCache', { remove: jasmine.createSpy('remove'), + getByHref: observableOf(responseCacheEntry), }); requestService = getMockRequestService(); halService = Object.assign(new HALEndpointServiceStub(url)); diff --git a/src/app/core/data/bitstream-data.service.ts b/src/app/core/data/bitstream-data.service.ts index bdf01efc5c..812522ea08 100644 --- a/src/app/core/data/bitstream-data.service.ts +++ b/src/app/core/data/bitstream-data.service.ts @@ -173,9 +173,11 @@ export class BitstreamDataService extends IdentifiableDataService imp this.requestService.setStaleByHrefSubstring(bitsreamFormatUrl); // Delete also cache by uuid as the format could be cached also there this.objectCache.getByHref(bitsreamFormatUrl).pipe(take(1)).subscribe((cachedRequest) => { - const requestUuid = cachedRequest.requestUUIDs[0]; - if (this.requestService.hasByUUID(requestUuid)) { - this.requestService.setStaleByUUID(requestUuid); + if (cachedRequest.requestUUIDs && cachedRequest.requestUUIDs.length > 0){ + const requestUuid = cachedRequest.requestUUIDs[0]; + if (this.requestService.hasByUUID(requestUuid)) { + this.requestService.setStaleByUUID(requestUuid); + } } }); }