From c10e660e0b1da868065f1c8ecdd4709636a1e5b9 Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 10 May 2023 10:11:06 +0200 Subject: [PATCH] 101623: Refactor BrowseDefinition model/resource-type to FlatBrowseDefinition --- src/app/browse-by/browse-by-guard.spec.ts | 4 ++-- src/app/browse-by/browse-by-guard.ts | 4 ++-- .../browse-by-switcher.component.spec.ts | 14 +++++++------- .../browse-by-switcher.component.ts | 4 ++-- .../core/browse/browse-definition-data.service.ts | 8 ++++---- src/app/core/browse/browse.service.spec.ts | 6 +++--- src/app/core/browse/browse.service.ts | 10 +++++----- src/app/core/core.module.ts | 4 ++-- ...on.model.ts => flat-browse-definition.model.ts} | 9 ++++----- .../shared/flat-browse-definition.resource-type.ts | 9 +++++++++ src/app/core/shared/operators.ts | 12 ++++++------ src/app/menu.resolver.ts | 8 ++++---- src/app/navbar/navbar.component.spec.ts | 10 +++++----- .../comcol-page-browse-by.component.ts | 8 ++++---- 14 files changed, 59 insertions(+), 51 deletions(-) rename src/app/core/shared/{browse-definition.model.ts => flat-browse-definition.model.ts} (81%) create mode 100644 src/app/core/shared/flat-browse-definition.resource-type.ts diff --git a/src/app/browse-by/browse-by-guard.spec.ts b/src/app/browse-by/browse-by-guard.spec.ts index 933c95a3cb..8a9f9b8c50 100644 --- a/src/app/browse-by/browse-by-guard.spec.ts +++ b/src/app/browse-by/browse-by-guard.spec.ts @@ -2,7 +2,7 @@ import { first } from 'rxjs/operators'; import { BrowseByGuard } from './browse-by-guard'; import { of as observableOf } from 'rxjs'; import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator'; describe('BrowseByGuard', () => { @@ -18,7 +18,7 @@ describe('BrowseByGuard', () => { const id = 'author'; const scope = '1234-65487-12354-1235'; const value = 'Filter'; - const browseDefinition = Object.assign(new BrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); + const browseDefinition = Object.assign(new FlatBrowseDefinition(), { type: BrowseByDataType.Metadata, metadataKeys: ['dc.contributor'] }); beforeEach(() => { dsoService = { diff --git a/src/app/browse-by/browse-by-guard.ts b/src/app/browse-by/browse-by-guard.ts index e4582cb77a..f42359b56b 100644 --- a/src/app/browse-by/browse-by-guard.ts +++ b/src/app/browse-by/browse-by-guard.ts @@ -7,7 +7,7 @@ import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from import { TranslateService } from '@ngx-translate/core'; import { Observable, of as observableOf } from 'rxjs'; import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; @Injectable() /** @@ -23,7 +23,7 @@ export class BrowseByGuard implements CanActivate { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { const title = route.data.title; const id = route.params.id || route.queryParams.id || route.data.id; - let browseDefinition$: Observable; + let browseDefinition$: Observable; if (hasNoValue(route.data.browseDefinition) && hasValue(id)) { browseDefinition$ = this.browseDefinitionService.findById(id).pipe(getFirstSucceededRemoteDataPayload()); } else { diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts index c2e1c9cb68..91c6c29252 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.spec.ts @@ -3,7 +3,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { BROWSE_BY_COMPONENT_FACTORY, BrowseByDataType } from './browse-by-decorator'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; import { BehaviorSubject } from 'rxjs'; import { ThemeService } from '../../shared/theme-support/theme.service'; @@ -13,33 +13,33 @@ describe('BrowseBySwitcherComponent', () => { const types = [ Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } ), ]; - const data = new BehaviorSubject(createDataWithBrowseDefinition(new BrowseDefinition())); + const data = new BehaviorSubject(createDataWithBrowseDefinition(new FlatBrowseDefinition())); const activatedRouteStub = { data @@ -70,7 +70,7 @@ describe('BrowseBySwitcherComponent', () => { comp = fixture.componentInstance; })); - types.forEach((type: BrowseDefinition) => { + types.forEach((type: FlatBrowseDefinition) => { describe(`when switching to a browse-by page for "${type.id}"`, () => { beforeEach(() => { data.next(createDataWithBrowseDefinition(type)); diff --git a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts index 0d3a35bebf..3cfc735135 100644 --- a/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts +++ b/src/app/browse-by/browse-by-switcher/browse-by-switcher.component.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { BROWSE_BY_COMPONENT_FACTORY } from './browse-by-decorator'; import { GenericConstructor } from '../../core/shared/generic-constructor'; -import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../../core/shared/flat-browse-definition.model'; import { ThemeService } from '../../shared/theme-support/theme.service'; @Component({ @@ -31,7 +31,7 @@ export class BrowseBySwitcherComponent implements OnInit { */ ngOnInit(): void { this.browseByComponent = this.route.data.pipe( - map((data: { browseDefinition: BrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.dataType, this.themeService.getThemeName())) + map((data: { browseDefinition: FlatBrowseDefinition }) => this.getComponentByBrowseByType(data.browseDefinition.dataType, this.themeService.getThemeName())) ); } diff --git a/src/app/core/browse/browse-definition-data.service.ts b/src/app/core/browse/browse-definition-data.service.ts index 32c3b44e14..d9c401fc3f 100644 --- a/src/app/core/browse/browse-definition-data.service.ts +++ b/src/app/core/browse/browse-definition-data.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; -import { BrowseDefinition } from '../shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { RequestService } from '../data/request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; @@ -21,8 +21,8 @@ import { dataService } from '../data/base/data-service.decorator'; providedIn: 'root', }) @dataService(BROWSE_DEFINITION) -export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { - private findAllData: FindAllDataImpl; +export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { + private findAllData: FindAllDataImpl; constructor( protected requestService: RequestService, @@ -49,7 +49,7 @@ export class BrowseDefinitionDataService extends IdentifiableDataService>>} * Return an observable that emits object list */ - findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/core/browse/browse.service.spec.ts b/src/app/core/browse/browse.service.spec.ts index 46ac8c44f4..9e0615385b 100644 --- a/src/app/core/browse/browse.service.spec.ts +++ b/src/app/core/browse/browse.service.spec.ts @@ -6,7 +6,7 @@ import { getMockRequestService } from '../../shared/mocks/request.service.mock'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RequestService } from '../data/request.service'; -import { BrowseDefinition } from '../shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { BrowseEntrySearchOptions } from './browse-entry-search-options.model'; import { BrowseService } from './browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; @@ -23,7 +23,7 @@ describe('BrowseService', () => { const browsesEndpointURL = 'https://rest.api/browses'; const halService: any = new HALEndpointServiceStub(browsesEndpointURL); const browseDefinitions = [ - Object.assign(new BrowseDefinition(), { + Object.assign(new FlatBrowseDefinition(), { id: 'date', metadataBrowse: false, sortOptions: [ @@ -50,7 +50,7 @@ describe('BrowseService', () => { items: { href: 'https://rest.api/discover/browses/dateissued/items' } } }), - Object.assign(new BrowseDefinition(), { + Object.assign(new FlatBrowseDefinition(), { id: 'author', metadataBrowse: true, sortOptions: [ diff --git a/src/app/core/browse/browse.service.ts b/src/app/core/browse/browse.service.ts index 2fab189254..9e5589e3d8 100644 --- a/src/app/core/browse/browse.service.ts +++ b/src/app/core/browse/browse.service.ts @@ -6,7 +6,7 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv import { PaginatedList } from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { RequestService } from '../data/request.service'; -import { BrowseDefinition } from '../shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../shared/flat-browse-definition.model'; import { BrowseEntry } from '../shared/browse-entry.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; @@ -60,7 +60,7 @@ export class BrowseService { /** * Get all BrowseDefinitions */ - getBrowseDefinitions(): Observable>> { + getBrowseDefinitions(): Observable>> { // TODO properly support pagination return this.browseDefinitionDataService.findAll({ elementsPerPage: 9999 }).pipe( getFirstSucceededRemoteData(), @@ -233,13 +233,13 @@ export class BrowseService { return this.getBrowseDefinitions().pipe( getRemoteDataPayload(), getPaginatedListPayload(), - map((browseDefinitions: BrowseDefinition[]) => browseDefinitions - .find((def: BrowseDefinition) => { + map((browseDefinitions: FlatBrowseDefinition[]) => browseDefinitions + .find((def: FlatBrowseDefinition) => { const matchingKeys = def.metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0); return isNotEmpty(matchingKeys); }) ), - map((def: BrowseDefinition) => { + map((def: FlatBrowseDefinition) => { if (isEmpty(def) || isEmpty(def._links) || isEmpty(def._links[linkPath])) { throw new Error(`A browse endpoint for ${linkPath} on ${metadataKey} isn't configured`); } else { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index ede23ba43b..81b70e42c2 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -73,7 +73,7 @@ import { ServerResponseService } from './services/server-response.service'; import { NativeWindowFactory, NativeWindowService } from './services/window.service'; import { BitstreamFormat } from './shared/bitstream-format.model'; import { Bitstream } from './shared/bitstream.model'; -import { BrowseDefinition } from './shared/browse-definition.model'; +import { FlatBrowseDefinition } from './shared/flat-browse-definition.model'; import { BrowseEntry } from './shared/browse-entry.model'; import { Bundle } from './shared/bundle.model'; import { Collection } from './shared/collection.model'; @@ -324,7 +324,7 @@ export const models = SubmissionUploadsModel, AuthStatus, BrowseEntry, - BrowseDefinition, + FlatBrowseDefinition, ClaimedTask, TaskObject, PoolTask, diff --git a/src/app/core/shared/browse-definition.model.ts b/src/app/core/shared/flat-browse-definition.model.ts similarity index 81% rename from src/app/core/shared/browse-definition.model.ts rename to src/app/core/shared/flat-browse-definition.model.ts index 863f454422..38df4a562d 100644 --- a/src/app/core/shared/browse-definition.model.ts +++ b/src/app/core/shared/flat-browse-definition.model.ts @@ -1,7 +1,7 @@ import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; -import { BROWSE_DEFINITION } from './browse-definition.resource-type'; +import { FLAT_BROWSE_DEFINITION } from './flat-browse-definition.resource-type'; import { HALLink } from './hal-link.model'; import { ResourceType } from './resource-type'; import { SortOption } from './sort-option.model'; @@ -9,15 +9,14 @@ import { CacheableObject } from '../cache/cacheable-object.model'; import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-decorator'; @typedObject -export class BrowseDefinition extends CacheableObject { - static type = BROWSE_DEFINITION; +export class FlatBrowseDefinition extends CacheableObject { + static type = FLAT_BROWSE_DEFINITION; /** * The object type */ @excludeFromEquals - @autoserialize - type: ResourceType; + type: ResourceType = FLAT_BROWSE_DEFINITION; @autoserialize id: string; diff --git a/src/app/core/shared/flat-browse-definition.resource-type.ts b/src/app/core/shared/flat-browse-definition.resource-type.ts new file mode 100644 index 0000000000..bfb01cd98c --- /dev/null +++ b/src/app/core/shared/flat-browse-definition.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from './resource-type'; + +/** + * The resource type for FlatBrowseDefinition + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const FLAT_BROWSE_DEFINITION = new ResourceType('flatBrowse'); diff --git a/src/app/core/shared/operators.ts b/src/app/core/shared/operators.ts index 32610c82fd..dd0ade112a 100644 --- a/src/app/core/shared/operators.ts +++ b/src/app/core/shared/operators.ts @@ -6,7 +6,7 @@ import { PaginatedList } from '../data/paginated-list.model'; import { RemoteData } from '../data/remote-data'; import { MetadataField } from '../metadata/metadata-field.model'; import { MetadataSchema } from '../metadata/metadata-schema.model'; -import { BrowseDefinition } from './browse-definition.model'; +import { FlatBrowseDefinition } from './flat-browse-definition.model'; import { DSpaceObject } from './dspace-object.model'; import { InjectionToken } from '@angular/core'; import { MonoTypeOperatorFunction, SchedulerLike } from 'rxjs/internal/types'; @@ -171,17 +171,17 @@ export const toDSpaceObjectListRD = () => /** * Get the browse links from a definition by ID given an array of all definitions * @param {string} definitionID - * @returns {(source: Observable>) => Observable} + * @returns {(source: Observable>) => Observable} */ export const getBrowseDefinitionLinks = (definitionID: string) => - (source: Observable>>): Observable => + (source: Observable>>): Observable => source.pipe( getRemoteDataPayload(), getPaginatedListPayload(), - map((browseDefinitions: BrowseDefinition[]) => browseDefinitions - .find((def: BrowseDefinition) => def.id === definitionID) + map((browseDefinitions: FlatBrowseDefinition[]) => browseDefinitions + .find((def: FlatBrowseDefinition) => def.id === definitionID) ), - map((def: BrowseDefinition) => { + map((def: FlatBrowseDefinition) => { if (isNotEmpty(def)) { return def._links; } else { diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index f771ef8b27..d423d3bc33 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -7,7 +7,7 @@ import { MenuItemType } from './shared/menu/menu-item-type.model'; import { LinkMenuItemModel } from './shared/menu/menu-item/models/link.model'; import { getFirstCompletedRemoteData } from './core/shared/operators'; import { PaginatedList } from './core/data/paginated-list.model'; -import { BrowseDefinition } from './core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from './core/shared/flat-browse-definition.model'; import { RemoteData } from './core/data/remote-data'; import { TextMenuItemModel } from './shared/menu/menu-item/models/text.model'; import { BrowseService } from './core/browse/browse.service'; @@ -108,10 +108,10 @@ export class MenuResolver implements Resolve { ]; // Read the different Browse-By types from config and add them to the browse menu this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { if (browseDefListRD.hasSucceeded) { - browseDefListRD.payload.page.forEach((browseDef: BrowseDefinition) => { + browseDefListRD.payload.page.forEach((browseDef: FlatBrowseDefinition) => { menuList.push({ id: `browse_global_by_${browseDef.id}`, parentID: 'browse_global', diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index ada9be9d0b..084047fc46 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -16,7 +16,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { BrowseService } from '../core/browse/browse.service'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { buildPaginatedList } from '../core/data/paginated-list.model'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../core/shared/flat-browse-definition.model'; import { BrowseByDataType } from '../browse-by/browse-by-switcher/browse-by-decorator'; import { Item } from '../core/shared/item.model'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; @@ -66,26 +66,26 @@ describe('NavbarComponent', () => { beforeEach(waitForAsync(() => { browseDefinitions = [ Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'title', dataType: BrowseByDataType.Title, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'dateissued', dataType: BrowseByDataType.Date, metadataKeys: ['dc.date.issued'] } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'author', dataType: BrowseByDataType.Metadata, } ), Object.assign( - new BrowseDefinition(), { + new FlatBrowseDefinition(), { id: 'subject', dataType: BrowseByDataType.Metadata, } diff --git a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts index 0527d283f0..668bd138c8 100644 --- a/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts +++ b/src/app/shared/comcol/comcol-page-browse-by/comcol-page-browse-by.component.ts @@ -6,7 +6,7 @@ import { getCommunityPageRoute } from '../../../community-page/community-page-ro import { getCollectionPageRoute } from '../../../collection-page/collection-page-routing-paths'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { BrowseDefinition } from '../../../core/shared/browse-definition.model'; +import { FlatBrowseDefinition } from '../../../core/shared/flat-browse-definition.model'; import { RemoteData } from '../../../core/data/remote-data'; import { BrowseService } from '../../../core/browse/browse.service'; @@ -46,11 +46,11 @@ export class ComcolPageBrowseByComponent implements OnInit { ngOnInit(): void { this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { if (browseDefListRD.hasSucceeded) { this.allOptions = browseDefListRD.payload.page - .map((config: BrowseDefinition) => ({ + .map((config: FlatBrowseDefinition) => ({ id: config.id, label: `browse.comcol.by.${config.id}`, routerLink: `/browse/${config.id}`,