From a7a7fa5511e3ef6fbf3ab8006c6de308d16c6aa6 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 (cherry picked from commit 600165210190fb1389abe108b0a6e2aea5cfb6b2) --- .../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 c8f393d7f1..a3398a9002 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 @@ -250,7 +250,7 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy { switchMap(() => this.bundleService.getBitstreams( this.bundle.id, paginatedOptions, - followLink('format'), + followLink('format', { useCachedVersionIfAvailable: false }), )), ); }), From 416bfedc66d1f618d6e77eed2e03967ed00ee8fa 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 (cherry picked from commit 4f48f39f7b24903eaea4a639a894520469e4fe95) --- 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 cb9d487020..24033d9db6 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 a3398a9002..c8f393d7f1 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 @@ -250,7 +250,7 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy { switchMap(() => this.bundleService.getBitstreams( this.bundle.id, paginatedOptions, - followLink('format', { useCachedVersionIfAvailable: false }), + followLink('format'), )), ); }), From 2787baa176cfcd5f9594a3c65dff894ce0bb7df4 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 (cherry picked from commit bb536192c27df34222a3e9ea9532a0b1f1854555) --- 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 35fb398980..b18b61d006 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 24033d9db6..2f63bf4e4e 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); + } } }); }