diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 6550435aa3..418b22351b 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -60,6 +60,7 @@ import { HALEndpointService } from './shared/hal-endpoint.service'; import { FacetValueResponseParsingService } from './data/facet-value-response-parsing.service'; import { FacetValueMapResponseParsingService } from './data/facet-value-map-response-parsing.service'; import { FacetConfigResponseParsingService } from './data/facet-config-response-parsing.service'; +import { ResourcePolicyService } from './data/resource-policy.service'; import { RegistryService } from './registry/registry.service'; import { RegistryMetadataschemasResponseParsingService } from './data/registry-metadataschemas-response-parsing.service'; import { RegistryMetadatafieldsResponseParsingService } from './data/registry-metadatafields-response-parsing.service'; @@ -125,6 +126,7 @@ const PROVIDERS = [ MetadataService, ObjectCacheService, PaginationComponentOptions, + ResourcePolicyService, RegistryService, NormalizedObjectBuildService, RemoteDataBuildService, diff --git a/src/app/core/data/resource-policy.service.ts b/src/app/core/data/resource-policy.service.ts new file mode 100644 index 0000000000..1a6a1afedc --- /dev/null +++ b/src/app/core/data/resource-policy.service.ts @@ -0,0 +1,67 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; + +import { DataService } from '../data/data.service'; +import { RequestService } from '../data/request.service'; +import { FindAllOptions } from '../data/request.models'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { ResourcePolicy } from '../shared/resource-policy.model'; +import { RemoteData } from '../data/remote-data'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { CoreState } from '../core.reducers'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service'; +import { ChangeAnalyzer } from './change-analyzer'; +import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; +import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service'; + +/* tslint:disable:max-classes-per-file */ +class DataServiceImpl extends DataService { + protected linkPath = 'resourcepolicies'; + protected forceBypassCache = false; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected dataBuildService: NormalizedObjectBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } + + getBrowseEndpoint(options: FindAllOptions = {}, linkPath: string = this.linkPath): Observable { + return this.halService.getEndpoint(linkPath); + } +} + +/** + * A service responsible for fetching/sending data from/to the REST API on the resourcepolicies endpoint + */ +@Injectable() +export class ResourcePolicyService { + private dataService: DataServiceImpl; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected dataBuildService: NormalizedObjectBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + this.dataService = new DataServiceImpl(requestService, rdbService, dataBuildService, null, objectCache, halService, notificationsService, http, comparator); + } + + findByHref(href: string, options?: HttpOptions): Observable> { + return this.dataService.findByHref(href, options); + } +} diff --git a/src/app/submission/sections/upload/section-upload.component.spec.ts b/src/app/submission/sections/upload/section-upload.component.spec.ts index be8f096964..f84ece4969 100644 --- a/src/app/submission/sections/upload/section-upload.component.spec.ts +++ b/src/app/submission/sections/upload/section-upload.component.spec.ts @@ -30,6 +30,7 @@ import { GroupEpersonService } from '../../../core/eperson/group-eperson.service import { cold, hot } from 'jasmine-marbles'; import { Collection } from '../../../core/shared/collection.model'; import { ResourcePolicy } from '../../../core/shared/resource-policy.model'; +import { ResourcePolicyService } from '../../../core/data/resource-policy.service'; import { RemoteData } from '../../../core/data/remote-data'; import { ConfigData } from '../../../core/config/config-data'; import { PageInfo } from '../../../core/shared/page-info.model'; @@ -47,8 +48,7 @@ function getMockSubmissionUploadsConfigService(): SubmissionFormsConfigService { function getMockCollectionDataService(): CollectionDataService { return jasmine.createSpyObj('CollectionDataService', { - findById: jasmine.createSpy('findById'), - findByHref: jasmine.createSpy('findByHref') + findById: jasmine.createSpy('findById') }); } @@ -59,6 +59,12 @@ function getMockGroupEpersonService(): GroupEpersonService { }); } +function getMockResourcePolicyService(): ResourcePolicyService { + return jasmine.createSpyObj('ResourcePolicyService', { + findByHref: jasmine.createSpy('findByHref') + }); +} + const sectionObject: SectionDataObject = { config: 'https://dspace7.4science.it/or2018/api/config/submissionforms/upload', mandatory: true, @@ -80,6 +86,7 @@ describe('SubmissionSectionUploadComponent test suite', () => { let sectionsServiceStub: SectionsServiceStub; let collectionDataService: any; let groupService: any; + let resourcePolicyService: any; let uploadsConfigService: any; let bitstreamService: any; @@ -120,6 +127,7 @@ describe('SubmissionSectionUploadComponent test suite', () => { providers: [ { provide: CollectionDataService, useValue: getMockCollectionDataService() }, { provide: GroupEpersonService, useValue: getMockGroupEpersonService() }, + { provide: ResourcePolicyService, useValue: getMockResourcePolicyService() }, { provide: SubmissionUploadsConfigService, useValue: getMockSubmissionUploadsConfigService() }, { provide: SectionsService, useClass: SectionsServiceStub }, { provide: SubmissionService, useClass: SubmissionServiceStub }, @@ -166,6 +174,7 @@ describe('SubmissionSectionUploadComponent test suite', () => { sectionsServiceStub = TestBed.get(SectionsService); collectionDataService = TestBed.get(CollectionDataService); groupService = TestBed.get(GroupEpersonService); + resourcePolicyService = TestBed.get(ResourcePolicyService); uploadsConfigService = TestBed.get(SubmissionUploadsConfigService); bitstreamService = TestBed.get(SectionUploadService); }); @@ -184,7 +193,7 @@ describe('SubmissionSectionUploadComponent test suite', () => { new RemoteData(false, false, true, undefined, mockCollection))); - collectionDataService.findByHref.and.returnValue(observableOf( + resourcePolicyService.findByHref.and.returnValue(observableOf( new RemoteData(false, false, true, undefined, mockDefaultAccessCondition) )); @@ -230,7 +239,7 @@ describe('SubmissionSectionUploadComponent test suite', () => { new RemoteData(false, false, true, undefined, mockCollection))); - collectionDataService.findByHref.and.returnValue(observableOf( + resourcePolicyService.findByHref.and.returnValue(observableOf( new RemoteData(false, false, true, undefined, mockDefaultAccessCondition) )); diff --git a/src/app/submission/sections/upload/section-upload.component.ts b/src/app/submission/sections/upload/section-upload.component.ts index 3a79a670ad..826385af45 100644 --- a/src/app/submission/sections/upload/section-upload.component.ts +++ b/src/app/submission/sections/upload/section-upload.component.ts @@ -8,6 +8,7 @@ import { hasValue, isNotEmpty, isNotUndefined, isUndefined } from '../../../shar import { SectionUploadService } from './section-upload.service'; import { CollectionDataService } from '../../../core/data/collection-data.service'; import { GroupEpersonService } from '../../../core/eperson/group-eperson.service'; +import { ResourcePolicyService } from '../../../core/data/resource-policy.service'; import { SubmissionUploadsConfigService } from '../../../core/config/submission-uploads-config.service'; import { SubmissionUploadsModel } from '../../../core/config/models/config-submission-uploads.model'; import { SubmissionFormsModel } from '../../../core/config/models/config-submission-forms.model'; @@ -116,6 +117,7 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent { * @param {ChangeDetectorRef} changeDetectorRef * @param {CollectionDataService} collectionDataService * @param {GroupEpersonService} groupService + * @param {ResourcePolicyService} resourcePolicyService * @param {SectionsService} sectionService * @param {SubmissionService} submissionService * @param {SubmissionUploadsConfigService} uploadsConfigService @@ -126,6 +128,7 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent { private changeDetectorRef: ChangeDetectorRef, private collectionDataService: CollectionDataService, private groupService: GroupEpersonService, + private resourcePolicyService: ResourcePolicyService, protected sectionService: SectionsService, private submissionService: SubmissionService, private uploadsConfigService: SubmissionUploadsConfigService, @@ -155,7 +158,7 @@ export class SubmissionSectionUploadComponent extends SectionModelComponent { find((rd: RemoteData) => isNotUndefined((rd.payload))), tap((collectionRemoteData: RemoteData) => this.collectionName = collectionRemoteData.payload.name), flatMap((collectionRemoteData: RemoteData) => { - return this.collectionDataService.findByHref( + return this.resourcePolicyService.findByHref( (collectionRemoteData.payload as any)._links.defaultAccessConditions ); }),