diff --git a/src/app/core/cache/builders/link.service.ts b/src/app/core/cache/builders/link.service.ts index b1ced76bb8..6265e89d53 100644 --- a/src/app/core/cache/builders/link.service.ts +++ b/src/app/core/cache/builders/link.service.ts @@ -1,7 +1,6 @@ import { Inject, Injectable, - InjectionToken, Injector, } from '@angular/core'; import { @@ -25,7 +24,7 @@ import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model import { HALDataService } from '../../data/base/hal-data-service.interface'; import { PaginatedList } from '../../data/paginated-list.model'; import { RemoteData } from '../../data/remote-data'; -import { lazyService } from '../../lazy-service'; +import { lazyDataService } from '../../lazy-data-service'; import { GenericConstructor } from '../../shared/generic-constructor'; import { HALResource } from '../../shared/hal-resource.model'; import { @@ -43,7 +42,7 @@ export class LinkService { constructor( protected injector: Injector, - @Inject(APP_DATA_SERVICES_MAP) private map: InjectionToken, + @Inject(APP_DATA_SERVICES_MAP) private map: LazyDataServicesMap, @Inject(LINK_DEFINITION_FACTORY) private getLinkDefinition: (source: GenericConstructor, linkName: keyof T['_links']) => LinkDefinition, @Inject(LINK_DEFINITION_MAP_FACTORY) private getLinkDefinitions: (source: GenericConstructor) => Map>, ) { @@ -73,7 +72,7 @@ export class LinkService { public resolveLinkWithoutAttaching(model, linkToFollow: FollowLinkConfig): Observable>> { const matchingLinkDef = this.getLinkDefinition(model.constructor, linkToFollow.name); if (hasValue(matchingLinkDef)) { - const lazyProvider$: Observable> = lazyService(this.map[matchingLinkDef.resourceType.value], this.injector); + const lazyProvider$: Observable> = lazyDataService(this.map, matchingLinkDef.resourceType.value, this.injector); return lazyProvider$.pipe( switchMap((provider: HALDataService) => { const link = model._links[matchingLinkDef.linkName]; diff --git a/src/app/core/lazy-service.ts b/src/app/core/lazy-data-service.ts similarity index 56% rename from src/app/core/lazy-service.ts rename to src/app/core/lazy-data-service.ts index 25f90f26b1..f2effd0b67 100644 --- a/src/app/core/lazy-service.ts +++ b/src/app/core/lazy-data-service.ts @@ -7,27 +7,32 @@ import { Observable, } from 'rxjs'; +import { LazyDataServicesMap } from '../../config/app-config.interface'; import { isNotEmpty } from '../shared/empty.util'; +import { HALDataService } from './data/base/hal-data-service.interface'; /** * Loads a service lazily. The service is loaded when the observable is subscribed to. * - * @param loader A function that returns a promise of the service to load. + * @param map A map of promises returning the data services to load + * @param key The key of the service * @param injector The injector to use to load the service. If not provided, the current injector is used. * @returns An observable of the service. * * @example * ```ts - * const dataService$ = lazyService(() => import('./data-service').then((m) => m.MyService), this.injector); + * const dataService$ = lazyDataService({ 'data-service': () => import('./data-service').then((m) => m.MyService)}, 'data-service', this.injector); * or - * const dataService$ = lazyService(() => import('./data-service'), this.injector); + * const dataService$ = lazyDataService({'data-service': () => import('./data-service')}, 'data-service', this.injector); * ``` */ -export function lazyService( - loader: () => Promise> | Promise<{ default: Type }>, +export function lazyDataService( + map: LazyDataServicesMap, + key: string, injector: Injector, ): Observable { return defer(() => { + const loader: () => Promise> | { default: HALDataService }> = map[key]; if (isNotEmpty(loader) && typeof loader === 'function') { return loader() .then((serviceOrDefault) => { diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts index 6365f1ea99..cded29230e 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts @@ -7,7 +7,6 @@ import { ChangeDetectorRef, Component, Inject, - InjectionToken, Injector, Input, OnDestroy, @@ -42,7 +41,7 @@ import { import { ArrayMoveChangeAnalyzer } from '../../core/data/array-move-change-analyzer.service'; import { RemoteData } from '../../core/data/remote-data'; import { UpdateDataService } from '../../core/data/update-data.service'; -import { lazyService } from '../../core/lazy-service'; +import { lazyDataService } from '../../core/lazy-data-service'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { ResourceType } from '../../core/shared/resource-type'; @@ -152,7 +151,7 @@ export class DsoEditMetadataComponent implements OnInit, OnDestroy { protected parentInjector: Injector, protected arrayMoveChangeAnalyser: ArrayMoveChangeAnalyzer, protected cdr: ChangeDetectorRef, - @Inject(APP_DATA_SERVICES_MAP) private dataServiceMap: InjectionToken) { + @Inject(APP_DATA_SERVICES_MAP) private dataServiceMap: LazyDataServicesMap) { } /** @@ -186,7 +185,7 @@ export class DsoEditMetadataComponent implements OnInit, OnDestroy { */ retrieveDataService(): Observable> { if (hasNoValue(this.updateDataService)) { - const lazyProvider$: Observable> = lazyService(this.dataServiceMap[this.dsoType], this.parentInjector); + const lazyProvider$: Observable> = lazyDataService(this.dataServiceMap, this.dsoType, this.parentInjector); return lazyProvider$; } else { return EMPTY; diff --git a/src/app/shared/eperson-group-list/eperson-group-list.component.ts b/src/app/shared/eperson-group-list/eperson-group-list.component.ts index 0a33767e34..663418d20c 100644 --- a/src/app/shared/eperson-group-list/eperson-group-list.component.ts +++ b/src/app/shared/eperson-group-list/eperson-group-list.component.ts @@ -7,7 +7,6 @@ import { Component, EventEmitter, Inject, - InjectionToken, Injector, Input, OnDestroy, @@ -35,7 +34,7 @@ import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { EPERSON } from '../../core/eperson/models/eperson.resource-type'; import { GROUP } from '../../core/eperson/models/group.resource-type'; -import { lazyService } from '../../core/lazy-service'; +import { lazyDataService } from '../../core/lazy-data-service'; import { PaginationService } from '../../core/pagination/pagination.service'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; @@ -133,7 +132,7 @@ export class EpersonGroupListComponent implements OnInit, OnDestroy { constructor(public dsoNameService: DSONameService, private parentInjector: Injector, private paginationService: PaginationService, - @Inject(APP_DATA_SERVICES_MAP) private dataServiceMap: InjectionToken) { + @Inject(APP_DATA_SERVICES_MAP) private dataServiceMap: LazyDataServicesMap) { } /** @@ -141,7 +140,7 @@ export class EpersonGroupListComponent implements OnInit, OnDestroy { */ ngOnInit(): void { const resourceType: ResourceType = (this.isListOfEPerson) ? EPERSON : GROUP; - const lazyProvider$: Observable = lazyService(this.dataServiceMap[resourceType.value], this.parentInjector); + const lazyProvider$: Observable = lazyDataService(this.dataServiceMap, resourceType.value, this.parentInjector); lazyProvider$.subscribe((dataService: EPersonDataService | GroupDataService) => { this.dataService = dataService; console.log(dataService); diff --git a/src/app/shared/resource-policies/resolvers/resource-policy-target.resolver.ts b/src/app/shared/resource-policies/resolvers/resource-policy-target.resolver.ts index 76748efad1..4a3712c7d1 100644 --- a/src/app/shared/resource-policies/resolvers/resource-policy-target.resolver.ts +++ b/src/app/shared/resource-policies/resolvers/resource-policy-target.resolver.ts @@ -1,6 +1,5 @@ import { inject, - InjectionToken, Injector, } from '@angular/core'; import { @@ -12,10 +11,13 @@ import { import { Observable } from 'rxjs'; import { switchMap } from 'rxjs/operators'; -import { LazyDataServicesMap } from '../../../../config/app-config.interface'; +import { + APP_DATA_SERVICES_MAP, + LazyDataServicesMap, +} from '../../../../config/app-config.interface'; import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; import { RemoteData } from '../../../core/data/remote-data'; -import { lazyService } from '../../../core/lazy-service'; +import { lazyDataService } from '../../../core/lazy-data-service'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { ResourceType } from '../../../core/shared/resource-type'; @@ -34,7 +36,7 @@ import { isEmpty } from '../../empty.util'; export const resourcePolicyTargetResolver: ResolveFn> = ( route: ActivatedRouteSnapshot, state: RouterStateSnapshot, - dataServiceMap: InjectionToken = inject(InjectionToken), + dataServiceMap: LazyDataServicesMap = inject(APP_DATA_SERVICES_MAP), parentInjector: Injector = inject(Injector), router: Router = inject(Router), ): Observable> => { @@ -46,7 +48,7 @@ export const resourcePolicyTargetResolver: ResolveFn> = } const resourceType: ResourceType = new ResourceType(targetType); - const lazyProvider$: Observable> = lazyService(dataServiceMap[resourceType.value], parentInjector); + const lazyProvider$: Observable> = lazyDataService(dataServiceMap, resourceType.value, parentInjector); return lazyProvider$.pipe( switchMap((dataService: IdentifiableDataService) => { diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index 2de471f20e..540ebcbcb2 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -74,7 +74,7 @@ const APP_CONFIG = new InjectionToken('APP_CONFIG'); const APP_CONFIG_STATE = makeStateKey('APP_CONFIG_STATE'); export interface LazyDataServicesMap { - [type: string]: () => Promise>> + [type: string]: () => Promise> | { default: HALDataService }> } export const APP_DATA_SERVICES_MAP: InjectionToken = new InjectionToken('APP_DATA_SERVICES_MAP');