From 0207aa14e8bd222b4283c625942f022e11516046 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Wed, 18 Jul 2018 16:18:02 +0200 Subject: [PATCH 1/2] Added PIDService --- src/app/core/core.module.ts | 2 + src/app/core/data/pid.service.spec.ts | 73 +++++++++++++++++++++++++++ src/app/core/data/pid.service.ts | 36 +++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 src/app/core/data/pid.service.spec.ts create mode 100644 src/app/core/data/pid.service.ts diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index ffdb828420..15d11d9077 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -20,6 +20,7 @@ import { CollectionDataService } from './data/collection-data.service'; import { CommunityDataService } from './data/community-data.service'; import { DebugResponseParsingService } from './data/debug-response-parsing.service'; import { DSOResponseParsingService } from './data/dso-response-parsing.service'; +import { PIDService } from './data/pid.service'; import { SearchResponseParsingService } from './data/search-response-parsing.service'; import { DSpaceRESTv2Service } from './dspace-rest-v2/dspace-rest-v2.service'; import { HostWindowService } from '../shared/host-window.service'; @@ -110,6 +111,7 @@ const PROVIDERS = [ SubmissionFormsConfigService, SubmissionSectionsConfigService, UUIDService, + PIDService, // register AuthInterceptor as HttpInterceptor { provide: HTTP_INTERCEPTORS, diff --git a/src/app/core/data/pid.service.spec.ts b/src/app/core/data/pid.service.spec.ts new file mode 100644 index 0000000000..2ca75b2ee4 --- /dev/null +++ b/src/app/core/data/pid.service.spec.ts @@ -0,0 +1,73 @@ +import { cold, getTestScheduler } from 'jasmine-marbles'; +import { TestScheduler } from '../../../../node_modules/rxjs'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { DSpaceObject } from '../shared/dspace-object.model'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { PIDService } from './pid.service'; +import { FindByIDRequest } from './request.models'; +import { RequestService } from './request.service'; + +fdescribe('PIDService', () => { + let scheduler: TestScheduler; + let service: PIDService; + let halService: HALEndpointService; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + const testObject = { + id: '9b4f22f4-164a-49db-8817-3316b6ee5746' + } as DSpaceObject; + const pidLink = 'https://rest.api/rest/api/pid/find{?id}'; + const requestURL = `https://rest.api/rest/api/pid/find?id=${testObject.id}`; + const requestUUID = '34cfed7c-f597-49ef-9cbe-ea351f0023c2'; + + beforeEach(() => { + scheduler = getTestScheduler(); + + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a', { a: pidLink }) + }); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + configure: true + }); + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('a', { + a: { + payload: testObject + } + }) + }); + + service = new PIDService( + requestService, + rdbService, + halService + ) + }); + + describe('findById', () => { + it('should call HALEndpointService with the path to the pid endpoint', () => { + scheduler.schedule(() => service.findById(testObject.id)); + scheduler.flush(); + + expect(halService.getEndpoint).toHaveBeenCalledWith('pid'); + }); + + it('should configure the proper FindByIDRequest', () => { + scheduler.schedule(() => service.findById(testObject.id)); + scheduler.flush(); + + expect(requestService.configure).toHaveBeenCalledWith(new FindByIDRequest(requestUUID, requestURL, testObject.id)); + }); + + it('should return a RemoteData for the object with the given ID', () => { + const result = service.findById(testObject.id); + const expected = cold('a', { + a: { + payload: testObject + } + }); + expect(result).toBeObservable(expected); + }); + }); +}); diff --git a/src/app/core/data/pid.service.ts b/src/app/core/data/pid.service.ts new file mode 100644 index 0000000000..e9a05d7529 --- /dev/null +++ b/src/app/core/data/pid.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { hasValue } from '../../shared/empty.util'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { NormalizedDSpaceObject } from '../cache/models/normalized-dspace-object.model'; +import { DSpaceObject } from '../shared/dspace-object.model'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { RemoteData } from './remote-data'; +import { FindByIDRequest } from './request.models'; +import { RequestService } from './request.service'; + +@Injectable() +export class PIDService { + protected linkPath = 'pid'; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected halService: HALEndpointService) { + } + + findById(id: string): Observable> { + const hrefObs = this.halService.getEndpoint(this.linkPath) + .map((endpoint: string) => endpoint.replace(/\{\?id\}/,`?id=${id}`)); + + hrefObs + .filter((href: string) => hasValue(href)) + .take(1) + .subscribe((href: string) => { + const request = new FindByIDRequest(this.requestService.generateRequestId(), href, id); + this.requestService.configure(request); + }); + + return this.rdbService.buildSingle(hrefObs); + } +} From c616facd4247ad34db334f8c05ecfe8083377c5b Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Wed, 18 Jul 2018 16:31:36 +0200 Subject: [PATCH 2/2] Delegated PIDService's findByID to DataService --- src/app/core/data/pid.service.spec.ts | 2 +- src/app/core/data/pid.service.ts | 43 +++++++++++++++++++-------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/app/core/data/pid.service.spec.ts b/src/app/core/data/pid.service.spec.ts index 2ca75b2ee4..e435e27d72 100644 --- a/src/app/core/data/pid.service.spec.ts +++ b/src/app/core/data/pid.service.spec.ts @@ -7,7 +7,7 @@ import { PIDService } from './pid.service'; import { FindByIDRequest } from './request.models'; import { RequestService } from './request.service'; -fdescribe('PIDService', () => { +describe('PIDService', () => { let scheduler: TestScheduler; let service: PIDService; let halService: HALEndpointService; diff --git a/src/app/core/data/pid.service.ts b/src/app/core/data/pid.service.ts index e9a05d7529..07ccf66d9a 100644 --- a/src/app/core/data/pid.service.ts +++ b/src/app/core/data/pid.service.ts @@ -1,36 +1,55 @@ import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; import { Observable } from 'rxjs/Observable'; import { hasValue } from '../../shared/empty.util'; +import { BrowseService } from '../browse/browse.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { NormalizedDSpaceObject } from '../cache/models/normalized-dspace-object.model'; +import { ResponseCacheService } from '../cache/response-cache.service'; +import { CoreState } from '../core.reducers'; import { DSpaceObject } from '../shared/dspace-object.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { DataService } from './data.service'; import { RemoteData } from './remote-data'; import { FindByIDRequest } from './request.models'; import { RequestService } from './request.service'; +/* tslint:disable:max-classes-per-file */ +class DataServiceImpl extends DataService { + protected linkPath = 'pid'; + + constructor( + protected responseCache: ResponseCacheService, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + private bs: BrowseService, + protected halService: HALEndpointService) { + super(); + } + + getScopedEndpoint(scope: string): Observable { + return undefined; + } + + getFindByIDHref(endpoint, resourceID): string { + return endpoint.replace(/\{\?id\}/,`?id=${resourceID}`); + } +} + @Injectable() export class PIDService { protected linkPath = 'pid'; + private dataService: DataServiceImpl; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, protected halService: HALEndpointService) { + this.dataService = new DataServiceImpl(null, requestService, rdbService, null, null, halService); } findById(id: string): Observable> { - const hrefObs = this.halService.getEndpoint(this.linkPath) - .map((endpoint: string) => endpoint.replace(/\{\?id\}/,`?id=${id}`)); - - hrefObs - .filter((href: string) => hasValue(href)) - .take(1) - .subscribe((href: string) => { - const request = new FindByIDRequest(this.requestService.generateRequestId(), href, id); - this.requestService.configure(request); - }); - - return this.rdbService.buildSingle(hrefObs); + return this.dataService.findById(id); } }