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..e435e27d72 --- /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'; + +describe('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..07ccf66d9a --- /dev/null +++ b/src/app/core/data/pid.service.ts @@ -0,0 +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> { + return this.dataService.findById(id); + } +}