CC License Submission Step 2 - Storing the results - add SubmissionCcLicenceUrl model

This commit is contained in:
Samuel
2020-05-20 13:55:42 +02:00
committed by Samuel
parent 18007048a3
commit 3db47f5791
11 changed files with 110 additions and 83 deletions

View File

@@ -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[],

View File

@@ -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,

View File

@@ -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);
}
}

View File

@@ -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<SubmissionCcLicence> {
export class SubmissionCcLicenseDataService extends DataService<SubmissionCcLicence> {
protected linkPath = 'submissioncclicenses';
@@ -34,6 +35,7 @@ export class SubmissionCcLicensesDataService extends DataService<SubmissionCcLic
protected rdbService: RemoteDataBuildService,
protected requestService: RequestService,
protected store: Store<CoreState>,
protected submissionCcLicenseUrlDataService: SubmissionCcLicenseUrlDataService,
) {
super();
}
@@ -43,9 +45,7 @@ export class SubmissionCcLicensesDataService extends DataService<SubmissionCcLic
* @param ccLicense the Creative Commons license type
* @param options the selected options of the license fields
*/
getCcLicenseLink(ccLicense: SubmissionCcLicence, options: Map<Field, Option>): Observable<StringResponse> {
const requestId = this.requestService.generateRequestId();
getCcLicenseLink(ccLicense: SubmissionCcLicence, options: Map<Field, Option>): Observable<string> {
return this.getSearchByHref(
'rightsByQuestions',{
@@ -64,18 +64,10 @@ export class SubmissionCcLicensesDataService extends DataService<SubmissionCcLic
]
}
).pipe(
map((endpoint) => 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),
);
}
}

View File

@@ -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<SubmissionCcLicenceUrl> {
protected linkPath = 'submissioncclicenses';
constructor(
protected comparator: DefaultChangeAnalyzer<SubmissionCcLicenceUrl>,
protected halService: HALEndpointService,
protected http: HttpClient,
protected notificationsService: NotificationsService,
protected objectCache: ObjectCacheService,
protected rdbService: RemoteDataBuildService,
protected requestService: RequestService,
protected store: Store<CoreState>,
) {
super();
}
}

View File

@@ -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');

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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 }));
});

View File

@@ -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),
);
}