diff --git a/src/app/core/cache/response.models.ts b/src/app/core/cache/response.models.ts index 56b8947e08..3f46ecf647 100644 --- a/src/app/core/cache/response.models.ts +++ b/src/app/core/cache/response.models.ts @@ -29,21 +29,6 @@ export class RestResponse { } } -/** - * A response containing a string. - */ -export class StringResponse extends RestResponse { - - constructor( - public isSuccessful: boolean, - public statusCode: number, - public statusText: string, - public content: string, - ) { - super(isSuccessful, statusCode, statusText); - } -} - export class DSOSuccessResponse extends RestResponse { constructor( public resourceSelfLinks: string[], diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 0c3555a023..b7937f0472 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -145,9 +145,10 @@ import { Version } from './shared/version.model'; import { VersionHistory } from './shared/version-history.model'; import { WorkflowActionDataService } from './data/workflow-action-data.service'; import { WorkflowAction } from './tasks/models/workflow-action-object.model'; -import { SubmissionCcLicensesDataService } from './data/submission-cc-licenses-data.service'; +import { SubmissionCcLicenseDataService } from './data/submission-cc-license-data.service'; import { SubmissionCcLicence } from './shared/submission-cc-license.model'; -import { StringResponseParsingService } from './data/string-response-parsing.service'; +import { SubmissionCcLicenceUrl } from './shared/submission-cc-license-url.model'; +import { SubmissionCcLicenseUrlDataService } from './data/submission-cc-license-url-data.service'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -215,10 +216,10 @@ const PROVIDERS = [ BrowseResponseParsingService, BrowseEntriesResponseParsingService, BrowseItemsResponseParsingService, - StringResponseParsingService, BrowseService, ConfigResponseParsingService, - SubmissionCcLicensesDataService, + SubmissionCcLicenseDataService, + SubmissionCcLicenseUrlDataService, SubmissionDefinitionsConfigService, SubmissionFormsConfigService, SubmissionRestService, @@ -302,6 +303,7 @@ export const models = WorkflowItem, WorkspaceItem, SubmissionCcLicence, + SubmissionCcLicenceUrl, SubmissionDefinitionsModel, SubmissionFormsModel, SubmissionSectionModel, diff --git a/src/app/core/data/string-response-parsing.service.ts b/src/app/core/data/string-response-parsing.service.ts deleted file mode 100644 index aea314e27a..0000000000 --- a/src/app/core/data/string-response-parsing.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; -import {RestResponse, StringResponse} from '../cache/response.models'; -import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model'; -import { ResponseParsingService } from './parsing.service'; -import { RestRequest } from './request.models'; - -/** - * A responseparser that will parse the response body to a string. - */ -@Injectable() -export class StringResponseParsingService implements ResponseParsingService { - - /** - * Parse the response to a string. - * - * @param request The request that was sent to the server - * @param data The response to parse - */ - parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { - const isSuccessful = data.statusCode >= 200 && data.statusCode < 300; - return new StringResponse(isSuccessful, data.statusCode, data.statusText, data.payload as undefined as string); - } -} diff --git a/src/app/core/data/submission-cc-licenses-data.service.ts b/src/app/core/data/submission-cc-license-data.service.ts similarity index 69% rename from src/app/core/data/submission-cc-licenses-data.service.ts rename to src/app/core/data/submission-cc-license-data.service.ts index 3610e4a3c6..33e0f8ebac 100644 --- a/src/app/core/data/submission-cc-licenses-data.service.ts +++ b/src/app/core/data/submission-cc-license-data.service.ts @@ -9,19 +9,20 @@ import { CoreState } from '../core.reducers'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { DataService } from './data.service'; import { RequestService } from './request.service'; -import { SUBMISSION_CC_LICENSE } from '../shared/submission-cc-licences.resource-type'; +import { SUBMISSION_CC_LICENSE } from '../shared/submission-cc-licence.resource-type'; import { Field, Option, SubmissionCcLicence } from '../shared/submission-cc-license.model'; import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; -import { GetRequest } from './request.models'; -import { configureRequest, getResponseFromEntry } from '../shared/operators'; -import { map, switchMap, tap } from 'rxjs/operators'; +import { + getRemoteDataPayload, + getSucceededRemoteData, +} from '../shared/operators'; +import { map, switchMap } from 'rxjs/operators'; import { Observable } from 'rxjs'; -import { StringResponse } from '../cache/response.models'; -import { StringResponseParsingService } from './string-response-parsing.service'; +import { SubmissionCcLicenseUrlDataService } from './submission-cc-license-url-data.service'; @Injectable() @dataService(SUBMISSION_CC_LICENSE) -export class SubmissionCcLicensesDataService extends DataService { +export class SubmissionCcLicenseDataService extends DataService { protected linkPath = 'submissioncclicenses'; @@ -34,6 +35,7 @@ export class SubmissionCcLicensesDataService extends DataService, + protected submissionCcLicenseUrlDataService: SubmissionCcLicenseUrlDataService, ) { super(); } @@ -43,9 +45,7 @@ export class SubmissionCcLicensesDataService extends DataService): Observable { - - const requestId = this.requestService.generateRequestId(); + getCcLicenseLink(ccLicense: SubmissionCcLicence, options: Map): Observable { return this.getSearchByHref( 'rightsByQuestions',{ @@ -64,18 +64,10 @@ export class SubmissionCcLicensesDataService extends DataService new GetRequest( - requestId, - endpoint, - undefined, { - responseType: 'text', - }, - )), - tap((request) => request.getResponseParser = () => StringResponseParsingService), - configureRequest(this.requestService), - switchMap(() => this.requestService.getByUUID(requestId)), - getResponseFromEntry(), - map((response) => response as StringResponse), + switchMap((href) => this.submissionCcLicenseUrlDataService.findByHref(href)), + getSucceededRemoteData(), + getRemoteDataPayload(), + map((response) => response.url), ); } } diff --git a/src/app/core/data/submission-cc-license-url-data.service.ts b/src/app/core/data/submission-cc-license-url-data.service.ts new file mode 100644 index 0000000000..581b7e2141 --- /dev/null +++ b/src/app/core/data/submission-cc-license-url-data.service.ts @@ -0,0 +1,34 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { dataService } from '../cache/builders/build-decorators'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { CoreState } from '../core.reducers'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { DataService } from './data.service'; +import { RequestService } from './request.service'; +import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; +import { SubmissionCcLicenceUrl } from '../shared/submission-cc-license-url.model'; +import { SUBMISSION_CC_LICENSE_URL } from '../shared/submission-cc-licence-link.resource-type'; + +@Injectable() +@dataService(SUBMISSION_CC_LICENSE_URL) +export class SubmissionCcLicenseUrlDataService extends DataService { + + protected linkPath = 'submissioncclicenses'; + + constructor( + protected comparator: DefaultChangeAnalyzer, + protected halService: HALEndpointService, + protected http: HttpClient, + protected notificationsService: NotificationsService, + protected objectCache: ObjectCacheService, + protected rdbService: RemoteDataBuildService, + protected requestService: RequestService, + protected store: Store, + ) { + super(); + } +} diff --git a/src/app/core/shared/submission-cc-licence-link.resource-type.ts b/src/app/core/shared/submission-cc-licence-link.resource-type.ts new file mode 100644 index 0000000000..b96adbfe6e --- /dev/null +++ b/src/app/core/shared/submission-cc-licence-link.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from './resource-type'; + +/** + * The resource type for License + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const SUBMISSION_CC_LICENSE_URL = new ResourceType('submissioncclicenseUrl'); diff --git a/src/app/core/shared/submission-cc-licences.resource-type.ts b/src/app/core/shared/submission-cc-licence.resource-type.ts similarity index 100% rename from src/app/core/shared/submission-cc-licences.resource-type.ts rename to src/app/core/shared/submission-cc-licence.resource-type.ts diff --git a/src/app/core/shared/submission-cc-license-url.model.ts b/src/app/core/shared/submission-cc-license-url.model.ts new file mode 100644 index 0000000000..8ee444544c --- /dev/null +++ b/src/app/core/shared/submission-cc-license-url.model.ts @@ -0,0 +1,23 @@ +import { autoserialize, inheritSerialization } from 'cerialize'; +import { typedObject } from '../cache/builders/build-decorators'; +import { excludeFromEquals } from '../utilities/equals.decorators'; +import { ResourceType } from './resource-type'; +import { HALResource } from './hal-resource.model'; +import { SUBMISSION_CC_LICENSE_URL } from './submission-cc-licence-link.resource-type'; + +@typedObject +@inheritSerialization(HALResource) +export class SubmissionCcLicenceUrl extends HALResource { + + static type = SUBMISSION_CC_LICENSE_URL; + + /** + * The object type + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + @autoserialize + url: string; +} diff --git a/src/app/core/shared/submission-cc-license.model.ts b/src/app/core/shared/submission-cc-license.model.ts index 2796edf6f2..20de01a826 100644 --- a/src/app/core/shared/submission-cc-license.model.ts +++ b/src/app/core/shared/submission-cc-license.model.ts @@ -3,7 +3,7 @@ import { typedObject } from '../cache/builders/build-decorators'; import { excludeFromEquals } from '../utilities/equals.decorators'; import { ResourceType } from './resource-type'; import { HALResource } from './hal-resource.model'; -import { SUBMISSION_CC_LICENSE } from './submission-cc-licences.resource-type'; +import { SUBMISSION_CC_LICENSE } from './submission-cc-licence.resource-type'; @typedObject @inheritSerialization(HALResource) diff --git a/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.spec.ts b/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.spec.ts index 125cfdadc9..78ea927af6 100644 --- a/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.spec.ts +++ b/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.spec.ts @@ -1,8 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SubmissionSectionCcLicensesComponent } from './submission-section-cc-licenses.component'; -import { SUBMISSION_CC_LICENSE } from '../../core/shared/submission-cc-licences.resource-type'; +import { SUBMISSION_CC_LICENSE } from '../../core/shared/submission-cc-licence.resource-type'; import { of as observableOf } from 'rxjs'; -import { SubmissionCcLicensesDataService } from '../../core/data/submission-cc-licenses-data.service'; +import { SubmissionCcLicenseDataService } from '../../core/data/submission-cc-license-data.service'; import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; import { SharedModule } from '../shared.module'; @@ -16,7 +16,7 @@ import { PaginatedList } from '../../core/data/paginated-list'; import { SubmissionCcLicence } from '../../core/shared/submission-cc-license.model'; import { cold } from 'jasmine-marbles'; import { JsonPatchOperationsBuilder } from '../../core/json-patch/builder/json-patch-operations-builder'; -import { StringResponse } from '../../core/cache/response.models'; +import { SubmissionCcLicenseUrlDataService } from '../../core/data/submission-cc-license-url-data.service'; describe('SubmissionSectionCcLicensesComponent', () => { @@ -130,7 +130,15 @@ describe('SubmissionSectionCcLicensesComponent', () => { ]; const submissionCcLicensesDataService = jasmine.createSpyObj('submissionCcLicensesDataService', { - getCcLicenseLink: observableOf(new StringResponse(true, 200, '200', 'test cc license link')), + getCcLicenseLink: observableOf(new RemoteData( + false, + false, + true, + undefined, + { + url: 'test cc license link', + } + )), findAll: observableOf(new RemoteData( false, false, @@ -141,11 +149,13 @@ describe('SubmissionSectionCcLicensesComponent', () => { }); const sectionService = { - getSectionState: () => observableOf({ - data: {} - }), + getSectionState: () => { + return observableOf({}); + }, setSectionStatus: () => undefined, - updateSectionData: () => undefined, + updateSectionData: (submissionId, sectionId, updatedData) => { + component.sectionData.data = updatedData; + } }; const operationsBuilder = jasmine.createSpyObj('operationsBuilder', { @@ -163,7 +173,8 @@ describe('SubmissionSectionCcLicensesComponent', () => { SubmissionSectionCcLicensesComponent, ], providers: [ - { provide: SubmissionCcLicensesDataService, useValue: submissionCcLicensesDataService }, + { provide: SubmissionCcLicenseDataService, useValue: submissionCcLicensesDataService }, + { provide: SubmissionCcLicenseUrlDataService, useValue: {} }, { provide: SectionsService, useValue: sectionService }, { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, { provide: 'collectionIdProvider', useValue: 'test collection id' }, @@ -212,7 +223,7 @@ describe('SubmissionSectionCcLicensesComponent', () => { expect(de.query(By.css('div.test-field-id-2b'))).toBeTruthy(); }); - it('should not display a license link', () => { + it('should not display a cc license link', () => { expect(de.query(By.css('.license-link'))).toBeNull(); }); @@ -257,10 +268,6 @@ describe('SubmissionSectionCcLicensesComponent', () => { fixture.detectChanges(); }); - it('should call the operations builder add method', () => { - expect(operationsBuilder.add).toHaveBeenCalled(); - }); - it('should have section status complete', () => { expect(component.getSectionStatus()).toBeObservable(cold('(a|)', { a: true })); }); diff --git a/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.ts b/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.ts index c3890c12a1..6c3d52de55 100644 --- a/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.ts +++ b/src/app/shared/submission-section-cc-licenses/submission-section-cc-licenses.component.ts @@ -3,7 +3,7 @@ import { Observable, of as observableOf, Subscription } from 'rxjs'; import { Field, Option, SubmissionCcLicence } from '../../core/shared/submission-cc-license.model'; import { getRemoteDataPayload, getSucceededRemoteData } from '../../core/shared/operators'; import { distinctUntilChanged, filter, map } from 'rxjs/operators'; -import { SubmissionCcLicensesDataService } from '../../core/data/submission-cc-licenses-data.service'; +import { SubmissionCcLicenseDataService } from '../../core/data/submission-cc-license-data.service'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { renderSectionFor } from '../../submission/sections/sections-decorator'; import { SectionsType } from '../../submission/sections/sections-type'; @@ -79,7 +79,7 @@ export class SubmissionSectionCcLicensesComponent extends SectionModelComponent constructor( protected modalService: NgbModal, protected sectionService: SectionsService, - protected submissionCcLicensesDataService: SubmissionCcLicensesDataService, + protected submissionCcLicensesDataService: SubmissionCcLicenseDataService, protected operationsBuilder: JsonPatchOperationsBuilder, @Inject('collectionIdProvider') public injectedCollectionId: string, @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, @@ -185,8 +185,6 @@ export class SubmissionSectionCcLicensesComponent extends SectionModelComponent new Map(selectedCcLicense.fields.map( (field) => [field, this.getSelectedOption(selectedCcLicense, field)] )), - ).pipe( - map((response) => response.content), ); }