Skip to content

Commit 50fb7c9

Browse files
[DURACOM-413] restore translation files, clear cache of findByCustumURL on new version creation
1 parent 703dccb commit 50fb7c9

8 files changed

Lines changed: 17076 additions & 7 deletions

File tree

src/app/core/data/item-data.service.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,26 @@ export abstract class BaseItemDataService extends IdentifiableDataService<Item>
460460
return this.findByHref(hrefObs, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow);
461461
}
462462

463+
464+
/**
465+
* Invalidate cache of request findByCustomURL
466+
*
467+
* @param customUrl
468+
* @param projections
469+
*/
470+
public invalidateFindByCustomUrlCache(customUrl: string, projections: string[] = []): void {
471+
const options: any = {
472+
searchParams: [new RequestParam('q', customUrl)],
473+
};
474+
475+
projections.forEach((p) => options.searchParams.push(new RequestParam('projection', p)));
476+
477+
this.searchData.getSearchByHref('findByCustomURL', options).pipe(take(1)).subscribe((href: string) => {
478+
this.requestService.setStaleByHrefSubstring(href);
479+
this.objectCache.remove(href);
480+
});
481+
}
482+
463483
/**
464484
* Returns an observable of {@link RemoteData} of an object, based on its ID, with a list of
465485
* {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object

src/app/core/data/version-data.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable } from '@angular/core';
22
import { RestRequestMethod } from '@dspace/config/rest-request-method';
3+
import { Item } from '@dspace/core/shared/item.model';
34
import { isNotEmpty } from '@dspace/shared/utils/empty.util';
45
import { Operation } from 'fast-json-patch';
56
import {
@@ -26,7 +27,6 @@ import {
2627
import { DefaultChangeAnalyzer } from './default-change-analyzer.service';
2728
import { RemoteData } from './remote-data';
2829
import { RequestService } from './request.service';
29-
import { Item } from "@dspace/core/shared/item.model";
3030

3131
/**
3232
* Service responsible for handling requests related to the Version object

src/app/item-page/item-page.resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export const itemPageResolver: ResolveFn<RemoteData<Item>> = (
5555
const itemRD$ = itemService.findByIdOrCustomUrl(
5656
route.params.id,
5757
true,
58-
false,
58+
true,
5959
...getItemPageLinksToFollow(),
6060
).pipe(
6161
getFirstCompletedRemoteData(),

src/app/shared/dso-page/dso-versioning-modal-service/dso-versioning-modal.service.spec.ts

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import { waitForAsync } from '@angular/core/testing';
1+
import {
2+
fakeAsync,
3+
flush,
4+
waitForAsync,
5+
} from '@angular/core/testing';
26
import { buildPaginatedList } from '@dspace/core/data/paginated-list.model';
37
import { Item } from '@dspace/core/shared/item.model';
48
import { MetadataMap } from '@dspace/core/shared/metadata.models';
59
import { PageInfo } from '@dspace/core/shared/page-info.model';
610
import { Version } from '@dspace/core/shared/version.model';
11+
import { WorkspaceItem } from '@dspace/core/submission/models/workspaceitem.model';
712
import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils';
813
import {
9-
EMPTY,
1014
of,
15+
Subject,
1116
} from 'rxjs';
1217

1318
import { createRelationshipsObservable } from '../../../item-page/simple/item-types/shared/item.component.spec';
@@ -23,6 +28,9 @@ describe('DsoVersioningModalService', () => {
2328
let workspaceItemDataService;
2429
let itemService;
2530

31+
let createVersionEvent$: Subject<string>;
32+
33+
2634
const mockItem: Item = Object.assign(new Item(), {
2735
bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])),
2836
metadata: new MetadataMap(),
@@ -37,21 +45,40 @@ describe('DsoVersioningModalService', () => {
3745
},
3846
});
3947

48+
const mockVersion = Object.assign(new Version(), {
49+
_links: {
50+
self: {
51+
href: 'version-href',
52+
},
53+
item: {
54+
href: 'item-href',
55+
},
56+
},
57+
});
58+
4059
beforeEach(waitForAsync(() => {
60+
createVersionEvent$ = new Subject<string>();
4161
modalService = jasmine.createSpyObj('modalService', {
42-
open: { componentInstance: { firstVersion: {}, versionNumber: {}, createVersionEvent: EMPTY } },
62+
open: {
63+
componentInstance: { firstVersion: {}, versionNumber: {}, createVersionEvent: createVersionEvent$.asObservable() },
64+
close: jasmine.createSpy('close'),
65+
},
4366
});
4467
versionService = jasmine.createSpyObj('versionService', {
4568
findByHref: createSuccessfulRemoteDataObject$<Version>(new Version()),
69+
invalidateVersionHrefCache: undefined,
4670
});
4771
versionHistoryService = jasmine.createSpyObj('versionHistoryService', {
48-
createVersion: createSuccessfulRemoteDataObject$<Version>(new Version()),
72+
createVersion: createSuccessfulRemoteDataObject$<Version>(mockVersion),
4973
hasDraftVersion$: of(false),
5074
});
5175
itemVersionShared = jasmine.createSpyObj('itemVersionShared', ['notifyCreateNewVersion']);
5276
router = jasmine.createSpyObj('router', ['navigateByUrl']);
5377
workspaceItemDataService = jasmine.createSpyObj('workspaceItemDataService', ['findByItem']);
54-
itemService = jasmine.createSpyObj('itemService', ['findByHref']);
78+
workspaceItemDataService.findByItem.and.returnValue(createSuccessfulRemoteDataObject$<WorkspaceItem>(new WorkspaceItem()));
79+
80+
itemService = jasmine.createSpyObj('itemService', ['findByHref', 'invalidateFindByCustomUrlCache']);
81+
itemService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$<Item>(mockItem));
5582

5683
service = new DsoVersioningModalService(
5784
modalService,
@@ -93,4 +120,27 @@ describe('DsoVersioningModalService', () => {
93120
});
94121
});
95122
});
123+
124+
describe('version modal', () => {
125+
it('should invalidate version href cache after a successful create', fakeAsync(() => {
126+
service.openCreateVersionModal(mockItem);
127+
createVersionEvent$.next('summary');
128+
flush();
129+
expect(versionService.invalidateVersionHrefCache).toHaveBeenCalledWith(mockItem);
130+
expect(itemService.invalidateFindByCustomUrlCache).not.toHaveBeenCalled();
131+
}));
132+
133+
it('should invalidate findByCustomUrl cache when item has dspace.customurl metadata', fakeAsync(() => {
134+
const itemWithCustomUrl: Item = Object.assign(new Item(), mockItem, {
135+
metadata: Object.assign(new MetadataMap(), {
136+
'dspace.customurl': [{ value: 'my-custom-url' }],
137+
}),
138+
});
139+
service.openCreateVersionModal(itemWithCustomUrl);
140+
createVersionEvent$.next('summary');
141+
flush();
142+
expect(versionService.invalidateVersionHrefCache).toHaveBeenCalledWith(itemWithCustomUrl);
143+
expect(itemService.invalidateFindByCustomUrlCache).toHaveBeenCalledWith('my-custom-url');
144+
}));
145+
});
96146
});

src/app/shared/dso-page/dso-versioning-modal-service/dso-versioning-modal.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ export class DsoVersioningModalService {
8282
getFirstSucceededRemoteDataPayload<WorkspaceItem>(),
8383
).subscribe((wsItem) => {
8484
this.versionService.invalidateVersionHrefCache(item);
85+
if (item.hasMetadata('dspace.customurl')) {
86+
// when a new version is created we need to invalidate the cache for findByCustomURL so the item will not be resolved with the cached old version.
87+
this.itemService.invalidateFindByCustomUrlCache(item.firstMetadataValue('dspace.customurl'));
88+
}
8589
const wsiId = wsItem.id;
8690
const route = 'workspaceitems/' + wsiId + '/edit';
8791
this.router.navigateByUrl(route);

0 commit comments

Comments
 (0)