Fixes after merge

This commit is contained in:
Giuseppe Digilio
2019-03-08 15:51:27 +01:00
parent ffc973007b
commit d351aaf95d
35 changed files with 267 additions and 184 deletions

View File

@@ -31,9 +31,6 @@ export class NormalizedDSpaceObject<T extends DSpaceObject> extends NormalizedOb
/** /**
* The universally unique identifier of this DSpaceObject * The universally unique identifier of this DSpaceObject
*
* Repeated here to make the serialization work,
* inheritSerialization doesn't seem to work for more than one level
*/ */
@autoserializeAs(String) @autoserializeAs(String)
uuid: string; uuid: string;

View File

@@ -8,7 +8,7 @@ import { License } from '../../shared/license.model';
*/ */
@mapsTo(License) @mapsTo(License)
@inheritSerialization(NormalizedDSpaceObject) @inheritSerialization(NormalizedDSpaceObject)
export class NormalizedLicense extends NormalizedDSpaceObject { export class NormalizedLicense extends NormalizedDSpaceObject<License> {
/** /**
* A boolean representing if this License is custom or not * A boolean representing if this License is custom or not

View File

@@ -13,11 +13,11 @@ import { NormalizedEPerson } from '../../eperson/models/normalized-eperson.model
import { NormalizedGroup } from '../../eperson/models/normalized-group.model'; import { NormalizedGroup } from '../../eperson/models/normalized-group.model';
import { NormalizedWorkflowItem } from '../../submission/models/normalized-workflowitem.model'; import { NormalizedWorkflowItem } from '../../submission/models/normalized-workflowitem.model';
import { NormalizedBitstreamFormat } from './normalized-bitstream-format.model'; import { NormalizedBitstreamFormat } from './normalized-bitstream-format.model';
import { SubmissionDefinitionsModel } from '../../config/models/config-submission-definitions.model';
import { SubmissionFormsModel } from '../../config/models/config-submission-forms.model';
import { SubmissionSectionModel } from '../../config/models/config-submission-section.model';
import { NormalizedMetadataSchema } from '../../metadata/normalized-metadata-schema.model'; import { NormalizedMetadataSchema } from '../../metadata/normalized-metadata-schema.model';
import { CacheableObject } from '../object-cache.reducer'; import { CacheableObject } from '../object-cache.reducer';
import { NormalizedSubmissionDefinitionsModel } from '../../config/models/normalized-config-submission-definitions.model';
import { NormalizedSubmissionFormsModel } from '../../config/models/normalized-config-submission-forms.model';
import { NormalizedSubmissionSectionModel } from '../../config/models/normalized-config-submission-section.model';
export class NormalizedObjectFactory { export class NormalizedObjectFactory {
public static getConstructor(type: ResourceType): GenericConstructor<NormalizedObject<CacheableObject>> { public static getConstructor(type: ResourceType): GenericConstructor<NormalizedObject<CacheableObject>> {
@@ -46,9 +46,6 @@ export class NormalizedObjectFactory {
case ResourceType.ResourcePolicy: { case ResourceType.ResourcePolicy: {
return NormalizedResourcePolicy return NormalizedResourcePolicy
} }
case ResourceType.Workspaceitem: {
return NormalizedWorkspaceItem
}
case ResourceType.EPerson: { case ResourceType.EPerson: {
return NormalizedEPerson return NormalizedEPerson
} }
@@ -61,23 +58,23 @@ export class NormalizedObjectFactory {
case ResourceType.MetadataField: { case ResourceType.MetadataField: {
return NormalizedGroup return NormalizedGroup
} }
case ResourceType.Workspaceitem: {
return NormalizedWorkspaceItem
}
case ResourceType.Workflowitem: { case ResourceType.Workflowitem: {
return NormalizedWorkflowItem return NormalizedWorkflowItem
} }
case ResourceType.BitstreamFormat: {
return NormalizedBitstreamFormat
}
case ResourceType.SubmissionDefinition: case ResourceType.SubmissionDefinition:
case ResourceType.SubmissionDefinitions: { case ResourceType.SubmissionDefinitions: {
return SubmissionDefinitionsModel return NormalizedSubmissionDefinitionsModel
} }
case ResourceType.SubmissionForm: case ResourceType.SubmissionForm:
case ResourceType.SubmissionForms: { case ResourceType.SubmissionForms: {
return SubmissionFormsModel return NormalizedSubmissionFormsModel
} }
case ResourceType.SubmissionSection: case ResourceType.SubmissionSection:
case ResourceType.SubmissionSections: { case ResourceType.SubmissionSections: {
return SubmissionSectionModel return NormalizedSubmissionSectionModel
} }
default: { default: {
return undefined; return undefined;

View File

@@ -13,11 +13,8 @@ export abstract class NormalizedObject<T extends CacheableObject> implements Cac
self: string; self: string;
/** /**
* The universally unique identifier of this Object * A string representing the kind of DSpaceObject, e.g. community, item, …
*/ */
@autoserialize
uuid: string;
@autoserialize @autoserialize
type: ResourceType; type: ResourceType;

View File

@@ -1,10 +1,9 @@
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize'; import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { ResourcePolicy } from '../../shared/resource-policy.model'; import { ResourcePolicy } from '../../shared/resource-policy.model';
import { mapsTo, relationship } from '../builders/build-decorators'; import { mapsTo } from '../builders/build-decorators';
import { NormalizedObject } from './normalized-object.model'; import { NormalizedObject } from './normalized-object.model';
import { IDToUUIDSerializer } from '../id-to-uuid-serializer'; import { IDToUUIDSerializer } from '../id-to-uuid-serializer';
import { ResourceType } from '../../shared/resource-type';
import { ActionType } from './action-type.model'; import { ActionType } from './action-type.model';
/** /**

View File

@@ -11,8 +11,9 @@ import { RegistryBitstreamformatsResponse } from '../registry/registry-bitstream
import { AuthStatus } from '../auth/models/auth-status.model'; import { AuthStatus } from '../auth/models/auth-status.model';
import { MetadataSchema } from '../metadata/metadataschema.model'; import { MetadataSchema } from '../metadata/metadataschema.model';
import { MetadataField } from '../metadata/metadatafield.model'; import { MetadataField } from '../metadata/metadatafield.model';
import { NormalizedObject } from './models/normalized-object.model';
import { PaginatedList } from '../data/paginated-list'; import { PaginatedList } from '../data/paginated-list';
import { SubmissionObject } from '../submission/models/submission-object.model';
import { DSpaceObject } from '../shared/dspace-object.model';
/* tslint:disable:max-classes-per-file */ /* tslint:disable:max-classes-per-file */
export class RestResponse { export class RestResponse {
@@ -233,7 +234,7 @@ export class PostPatchSuccessResponse extends RestResponse {
export class SubmissionSuccessResponse extends RestResponse { export class SubmissionSuccessResponse extends RestResponse {
constructor( constructor(
public dataDefinition: Array<NormalizedObject | ConfigObject | string>, public dataDefinition: Array<SubmissionObject | ConfigObject | string>,
public statusCode: number, public statusCode: number,
public statusText: string, public statusText: string,
public pageInfo?: PageInfo public pageInfo?: PageInfo
@@ -244,7 +245,7 @@ export class SubmissionSuccessResponse extends RestResponse {
export class EpersonSuccessResponse extends RestResponse { export class EpersonSuccessResponse extends RestResponse {
constructor( constructor(
public epersonDefinition: NormalizedObject[], public epersonDefinition: DSpaceObject[],
public statusCode: number, public statusCode: number,
public statusText: string, public statusText: string,
public pageInfo?: PageInfo public pageInfo?: PageInfo

View File

@@ -6,10 +6,10 @@ import { ConfigRequest } from '../data/request.models';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { CoreState } from '../core.reducers'; import { CoreState } from '../core.reducers';
import { SubmissionDefinitionsModel } from './models/config-submission-definitions.model';
import { PaginatedList } from '../data/paginated-list'; import { PaginatedList } from '../data/paginated-list';
import { PageInfo } from '../shared/page-info.model'; import { PageInfo } from '../shared/page-info.model';
import { SubmissionSectionModel } from './models/config-submission-section.model'; import { NormalizedSubmissionDefinitionsModel } from './models/normalized-config-submission-definitions.model';
import { NormalizedSubmissionSectionModel } from './models/normalized-config-submission-section.model';
describe('ConfigResponseParsingService', () => { describe('ConfigResponseParsingService', () => {
let service: ConfigResponseParsingService; let service: ConfigResponseParsingService;
@@ -173,7 +173,7 @@ describe('ConfigResponseParsingService', () => {
self: 'https://rest.api/config/submissiondefinitions/traditional/sections' self: 'https://rest.api/config/submissiondefinitions/traditional/sections'
}); });
const definitions = const definitions =
Object.assign(new SubmissionDefinitionsModel(), { Object.assign(new NormalizedSubmissionDefinitionsModel(), {
isDefault: true, isDefault: true,
name: 'traditional', name: 'traditional',
type: 'submissiondefinition', type: 'submissiondefinition',
@@ -183,7 +183,7 @@ describe('ConfigResponseParsingService', () => {
}, },
self: 'https://rest.api/config/submissiondefinitions/traditional', self: 'https://rest.api/config/submissiondefinitions/traditional',
sections: new PaginatedList(pageinfo, [ sections: new PaginatedList(pageinfo, [
Object.assign(new SubmissionSectionModel(), { Object.assign(new NormalizedSubmissionSectionModel(), {
header: 'submit.progressbar.describe.stepone', header: 'submit.progressbar.describe.stepone',
mandatory: true, mandatory: true,
sectionType: 'submission-form', sectionType: 'submission-form',
@@ -198,7 +198,7 @@ describe('ConfigResponseParsingService', () => {
}, },
self: 'https://rest.api/config/submissionsections/traditionalpageone', self: 'https://rest.api/config/submissionsections/traditionalpageone',
}), }),
Object.assign(new SubmissionSectionModel(), { Object.assign(new NormalizedSubmissionSectionModel(), {
header: 'submit.progressbar.describe.steptwo', header: 'submit.progressbar.describe.steptwo',
mandatory: true, mandatory: true,
sectionType: 'submission-form', sectionType: 'submission-form',
@@ -213,7 +213,7 @@ describe('ConfigResponseParsingService', () => {
}, },
self: 'https://rest.api/config/submissionsections/traditionalpagetwo', self: 'https://rest.api/config/submissionsections/traditionalpagetwo',
}), }),
Object.assign(new SubmissionSectionModel(), { Object.assign(new NormalizedSubmissionSectionModel(), {
header: 'submit.progressbar.upload', header: 'submit.progressbar.upload',
mandatory: false, mandatory: false,
sectionType: 'upload', sectionType: 'upload',
@@ -228,7 +228,7 @@ describe('ConfigResponseParsingService', () => {
}, },
self: 'https://rest.api/config/submissionsections/upload', self: 'https://rest.api/config/submissionsections/upload',
}), }),
Object.assign(new SubmissionSectionModel(), { Object.assign(new NormalizedSubmissionSectionModel(), {
header: 'submit.progressbar.license', header: 'submit.progressbar.license',
mandatory: true, mandatory: true,
sectionType: 'license', sectionType: 'license',

View File

@@ -1,30 +1,29 @@
import { GenericConstructor } from '../../shared/generic-constructor'; import { GenericConstructor } from '../../shared/generic-constructor';
import { SubmissionSectionModel } from './config-submission-section.model';
import { SubmissionFormsModel } from './config-submission-forms.model';
import { SubmissionDefinitionsModel } from './config-submission-definitions.model';
import { ConfigType } from './config-type'; import { ConfigType } from './config-type';
import { ConfigObject } from './config.model'; import { ConfigObject } from './config.model';
import { SubmissionUploadsModel } from './config-submission-uploads.model'; import { NormalizedSubmissionDefinitionsModel } from './normalized-config-submission-definitions.model';
import { NormalizedSubmissionFormsModel } from './normalized-config-submission-forms.model';
import { NormalizedSubmissionSectionModel } from './normalized-config-submission-section.model';
import { NormalizedSubmissionUploadsModel } from './normalized-config-submission-uploads.model';
export class ConfigObjectFactory { export class ConfigObjectFactory {
public static getConstructor(type): GenericConstructor<ConfigObject> { public static getConstructor(type): GenericConstructor<ConfigObject> {
switch (type) { switch (type) {
case ConfigType.SubmissionDefinition: case ConfigType.SubmissionDefinition:
case ConfigType.SubmissionDefinitions: { case ConfigType.SubmissionDefinitions: {
return SubmissionDefinitionsModel return NormalizedSubmissionDefinitionsModel
} }
case ConfigType.SubmissionForm: case ConfigType.SubmissionForm:
case ConfigType.SubmissionForms: { case ConfigType.SubmissionForms: {
return SubmissionFormsModel return NormalizedSubmissionFormsModel
} }
case ConfigType.SubmissionSection: case ConfigType.SubmissionSection:
case ConfigType.SubmissionSections: { case ConfigType.SubmissionSections: {
return SubmissionSectionModel return NormalizedSubmissionSectionModel
} }
case ConfigType.SubmissionUpload: case ConfigType.SubmissionUpload:
case ConfigType.SubmissionUploads: { case ConfigType.SubmissionUploads: {
return SubmissionUploadsModel return NormalizedSubmissionUploadsModel
} }
default: { default: {
return undefined; return undefined;

View File

@@ -1,15 +1,17 @@
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { ConfigObject } from './config.model'; import { ConfigObject } from './config.model';
import { SubmissionSectionModel } from './config-submission-section.model'; import { SubmissionSectionModel } from './config-submission-section.model';
import { PaginatedList } from '../../data/paginated-list'; import { PaginatedList } from '../../data/paginated-list';
@inheritSerialization(ConfigObject)
export class SubmissionDefinitionsModel extends ConfigObject { export class SubmissionDefinitionsModel extends ConfigObject {
@autoserialize /**
* A boolean representing if this submission definition is the default or not
*/
isDefault: boolean; isDefault: boolean;
@autoserializeAs(SubmissionSectionModel) /**
* A list of SubmissionSectionModel that are present in this submission definition
*/
sections: PaginatedList<SubmissionSectionModel>; sections: PaginatedList<SubmissionSectionModel>;
} }

View File

@@ -1,14 +1,20 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { ConfigObject } from './config.model'; import { ConfigObject } from './config.model';
import { FormFieldModel } from '../../../shared/form/builder/models/form-field.model'; import { FormFieldModel } from '../../../shared/form/builder/models/form-field.model';
/**
* An interface that define a form row and its properties.
*/
export interface FormRowModel { export interface FormRowModel {
fields: FormFieldModel[]; fields: FormFieldModel[];
} }
@inheritSerialization(ConfigObject) /**
* A model class for a NormalizedObject.
*/
export class SubmissionFormsModel extends ConfigObject { export class SubmissionFormsModel extends ConfigObject {
@autoserialize /**
* An array of [FormRowModel] that are present in this form
*/
rows: FormRowModel[]; rows: FormRowModel[];
} }

View File

@@ -1,23 +1,34 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { ConfigObject } from './config.model'; import { ConfigObject } from './config.model';
import { SectionsType } from '../../../submission/sections/sections-type'; import { SectionsType } from '../../../submission/sections/sections-type';
@inheritSerialization(ConfigObject) /**
export class SubmissionSectionModel extends ConfigObject { * An interface that define section visibility and its properties.
*/
@autoserialize export interface SubmissionSectionVisibility {
header: string;
@autoserialize
mandatory: boolean;
@autoserialize
sectionType: SectionsType;
@autoserialize
visibility: {
main: any, main: any,
other: any other: any
} }
export class SubmissionSectionModel extends ConfigObject {
/**
* The header for this section
*/
header: string;
/**
* A boolean representing if this submission section is the mandatory or not
*/
mandatory: boolean;
/**
* A string representing the kind of section object
*/
sectionType: SectionsType;
/**
* The [SubmissionSectionVisibility] object for this section
*/
visibility: SubmissionSectionVisibility
} }

View File

@@ -1,30 +1,21 @@
import {autoserialize, autoserializeAs, inheritSerialization} from 'cerialize';
import { ConfigObject } from './config.model'; import { ConfigObject } from './config.model';
import { AccessConditionOption } from './config-access-condition-option.model'; import { AccessConditionOption } from './config-access-condition-option.model';
import {SubmissionFormsModel} from './config-submission-forms.model'; import { SubmissionFormsModel } from './config-submission-forms.model';
/**
* Normalized model class for the configuration describing the submission upload section
*/
@inheritSerialization(ConfigObject)
export class SubmissionUploadsModel extends ConfigObject { export class SubmissionUploadsModel extends ConfigObject {
/** /**
* A list of available bitstream access conditions * A list of available bitstream access conditions
*/ */
@autoserialize
accessConditionOptions: AccessConditionOption[]; accessConditionOptions: AccessConditionOption[];
/** /**
* An object representing the configuration describing the bistream metadata form * An object representing the configuration describing the bistream metadata form
*/ */
@autoserializeAs(SubmissionFormsModel)
metadata: SubmissionFormsModel; metadata: SubmissionFormsModel;
@autoserialize
required: boolean; required: boolean;
@autoserialize
maxSize: number; maxSize: number;
} }

View File

@@ -1,8 +1,3 @@
/**
* TODO replace with actual string enum after upgrade to TypeScript 2.4:
* https://github.com/Microsoft/TypeScript/pull/15486
*/
export enum ConfigType { export enum ConfigType {
SubmissionDefinitions = 'submissiondefinitions', SubmissionDefinitions = 'submissiondefinitions',
SubmissionDefinition = 'submissiondefinition', SubmissionDefinition = 'submissiondefinition',

View File

@@ -1,10 +1,27 @@
import { autoserialize, inheritSerialization } from 'cerialize'; import { CacheableObject } from '../../cache/object-cache.reducer';
import { NormalizedObject } from '../../cache/models/normalized-object.model'; import { ResourceType } from '../../shared/resource-type';
@inheritSerialization(NormalizedObject) export abstract class ConfigObject implements CacheableObject {
export abstract class ConfigObject extends NormalizedObject {
@autoserialize /**
* The name for this configuration
*/
public name: string; public name: string;
/**
* A string representing the kind of config object
*/
public type: ResourceType;
/**
* The links to all related resources returned by the rest api.
*/
public _links: {
[name: string]: string
};
/**
* The link to the rest endpoint where this config object can be found
*/
self: string;
} }

View File

@@ -0,0 +1,25 @@
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { SubmissionSectionModel } from './config-submission-section.model';
import { PaginatedList } from '../../data/paginated-list';
import { NormalizedConfigObject } from './normalized-config.model';
import { SubmissionDefinitionsModel } from './config-submission-definitions.model';
/**
* Normalized class for the configuration describing the submission
*/
@inheritSerialization(NormalizedConfigObject)
export class NormalizedSubmissionDefinitionsModel extends NormalizedConfigObject<SubmissionDefinitionsModel> {
/**
* A boolean representing if this submission definition is the default or not
*/
@autoserialize
isDefault: boolean;
/**
* A list of SubmissionSectionModel that are present in this submission definition
*/
@autoserializeAs(SubmissionSectionModel)
sections: PaginatedList<SubmissionSectionModel>;
}

View File

@@ -0,0 +1,16 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedConfigObject } from './normalized-config.model';
import { FormRowModel, SubmissionFormsModel } from './config-submission-forms.model';
/**
* Normalized class for the configuration describing the submission form
*/
@inheritSerialization(NormalizedConfigObject)
export class NormalizedSubmissionFormsModel extends NormalizedConfigObject<SubmissionFormsModel> {
/**
* An array of [FormRowModel] that are present in this form
*/
@autoserialize
rows: FormRowModel[];
}

View File

@@ -0,0 +1,37 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { SectionsType } from '../../../submission/sections/sections-type';
import { NormalizedConfigObject } from './normalized-config.model';
import { SubmissionFormsModel } from './config-submission-forms.model';
import { SubmissionSectionVisibility } from './config-submission-section.model';
/**
* Normalized class for the configuration describing the submission section
*/
@inheritSerialization(NormalizedConfigObject)
export class NormalizedSubmissionSectionModel extends NormalizedConfigObject<SubmissionFormsModel> {
/**
* The header for this section
*/
@autoserialize
header: string;
/**
* A boolean representing if this submission section is the mandatory or not
*/
@autoserialize
mandatory: boolean;
/**
* A string representing the kind of section object
*/
@autoserialize
sectionType: SectionsType;
/**
* The [SubmissionSectionVisibility] object for this section
*/
@autoserialize
visibility: SubmissionSectionVisibility
}

View File

@@ -0,0 +1,31 @@
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { AccessConditionOption } from './config-access-condition-option.model';
import { SubmissionFormsModel } from './config-submission-forms.model';
import { NormalizedConfigObject } from './normalized-config.model';
import { SubmissionUploadsModel } from './config-submission-uploads.model';
/**
* Normalized class for the configuration describing the submission upload section
*/
@inheritSerialization(NormalizedConfigObject)
export class NormalizedSubmissionUploadsModel extends NormalizedConfigObject<SubmissionUploadsModel> {
/**
* A list of available bitstream access conditions
*/
@autoserialize
accessConditionOptions: AccessConditionOption[];
/**
* An object representing the configuration describing the bistream metadata form
*/
@autoserializeAs(SubmissionFormsModel)
metadata: SubmissionFormsModel;
@autoserialize
required: boolean;
@autoserialize
maxSize: number;
}

View File

@@ -0,0 +1,38 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedObject } from '../../cache/models/normalized-object.model';
import { CacheableObject } from '../../cache/object-cache.reducer';
import { ResourceType } from '../../shared/resource-type';
/**
* Normalized abstract class for a configuration object
*/
@inheritSerialization(NormalizedObject)
export abstract class NormalizedConfigObject<T extends CacheableObject> implements CacheableObject {
/**
* The name for this configuration
*/
@autoserialize
public name: string;
/**
* A string representing the kind of config object
*/
@autoserialize
public type: ResourceType;
/**
* The links to all related resources returned by the rest api.
*/
@autoserialize
public _links: {
[name: string]: string
};
/**
* The link to the rest endpoint where this config object can be found
*/
@autoserialize
self: string;
}

View File

@@ -9,9 +9,9 @@ import { BaseResponseParsingService } from '../data/base-response-parsing.servic
import { GLOBAL_CONFIG } from '../../../config'; import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface'; import { GlobalConfig } from '../../../config/global-config.interface';
import { ObjectCacheService } from '../cache/object-cache.service'; import { ObjectCacheService } from '../cache/object-cache.service';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory'; import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
import { ResourceType } from '../shared/resource-type'; import { ResourceType } from '../shared/resource-type';
import { DSpaceObject } from '../shared/dspace-object.model';
/** /**
* Provides method to parse response from eperson endpoint. * Provides method to parse response from eperson endpoint.
@@ -31,7 +31,7 @@ export class EpersonResponseParsingService extends BaseResponseParsingService im
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
const epersonDefinition = this.process<NormalizedObject,ResourceType>(data.payload, request.href); const epersonDefinition = this.process<DSpaceObject,ResourceType>(data.payload, request.href);
return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload)); return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else { } else {
return new ErrorResponse( return new ErrorResponse(

View File

@@ -1,13 +1,12 @@
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { FindAllOptions } from '../data/request.models'; import { FindAllOptions } from '../data/request.models';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { DataService } from '../data/data.service'; import { DataService } from '../data/data.service';
import { CacheableObject } from '../cache/object-cache.reducer'; import { CacheableObject } from '../cache/object-cache.reducer';
/** /**
* An abstract class that provides methods to make HTTP request to eperson endpoint. * An abstract class that provides methods to make HTTP request to eperson endpoint.
*/ */
export abstract class EpersonService<TNormalized extends NormalizedObject, TDomain extends CacheableObject> extends DataService<TNormalized, TDomain> { export abstract class EpersonService<TDomain extends CacheableObject> extends DataService<TDomain> {
public getBrowseEndpoint(options: FindAllOptions): Observable<string> { public getBrowseEndpoint(options: FindAllOptions): Observable<string> {
return this.halService.getEndpoint(this.linkPath); return this.halService.getEndpoint(this.linkPath);

View File

@@ -9,7 +9,6 @@ import { EpersonService } from './eperson.service';
import { RequestService } from '../data/request.service'; import { RequestService } from '../data/request.service';
import { FindAllOptions } from '../data/request.models'; import { FindAllOptions } from '../data/request.models';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { NormalizedGroup } from './models/normalized-group.model';
import { Group } from './models/group.model'; import { Group } from './models/group.model';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { CoreState } from '../core.reducers'; import { CoreState } from '../core.reducers';
@@ -25,13 +24,13 @@ import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
* Provides methods to retrieve eperson group resources. * Provides methods to retrieve eperson group resources.
*/ */
@Injectable() @Injectable()
export class GroupEpersonService extends EpersonService<NormalizedGroup, Group> { export class GroupEpersonService extends EpersonService<Group> {
protected linkPath = 'groups'; protected linkPath = 'groups';
protected browseEndpoint = ''; protected browseEndpoint = '';
protected forceBypassCache = false; protected forceBypassCache = false;
constructor( constructor(
protected comparator: DSOChangeAnalyzer, protected comparator: DSOChangeAnalyzer<Group>,
protected dataBuildService: NormalizedObjectBuildService, protected dataBuildService: NormalizedObjectBuildService,
protected http: HttpClient, protected http: HttpClient,
protected notificationsService: NotificationsService, protected notificationsService: NotificationsService,

View File

@@ -6,5 +6,7 @@ export class Group extends DSpaceObject {
public handle: string; public handle: string;
public name: string;
public permanent: boolean; public permanent: boolean;
} }

View File

@@ -14,9 +14,6 @@ export class NormalizedEPerson extends NormalizedDSpaceObject<EPerson> implement
@autoserialize @autoserialize
public handle: string; public handle: string;
@autoserialize
public name: string;
@autoserializeAs(NormalizedGroup) @autoserializeAs(NormalizedGroup)
groups: Group[]; groups: Group[];

View File

@@ -1,4 +1,4 @@
import { autoserialize, inheritSerialization } from 'cerialize'; import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { CacheableObject } from '../../cache/object-cache.reducer'; import { CacheableObject } from '../../cache/object-cache.reducer';
import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model'; import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
@@ -9,6 +9,9 @@ import { Group } from './group.model';
@inheritSerialization(NormalizedDSpaceObject) @inheritSerialization(NormalizedDSpaceObject)
export class NormalizedGroup extends NormalizedDSpaceObject<Group> implements CacheableObject, ListableObject { export class NormalizedGroup extends NormalizedDSpaceObject<Group> implements CacheableObject, ListableObject {
@autoserializeAs(NormalizedGroup)
groups: Group[];
@autoserialize @autoserialize
public handle: string; public handle: string;

View File

@@ -5,6 +5,6 @@ import { EditItem } from './edititem.model';
@mapsTo(EditItem) @mapsTo(EditItem)
@inheritSerialization(NormalizedSubmissionObject) @inheritSerialization(NormalizedSubmissionObject)
export class NormalizedEditItem extends NormalizedSubmissionObject { export class NormalizedEditItem extends NormalizedSubmissionObject<EditItem> {
} }

View File

@@ -1,13 +1,15 @@
import { autoserialize, inheritSerialization } from 'cerialize'; import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model'; import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
import { WorkspaceitemSectionsObject } from './workspaceitem-sections.model'; import { WorkspaceitemSectionsObject } from './workspaceitem-sections.model';
import { SubmissionObjectError } from './submission-object.model'; import { SubmissionObjectError } from './submission-object.model';
import { DSpaceObject } from '../../shared/dspace-object.model';
/** /**
* An abstract model class for a NormalizedSubmissionObject. * An abstract model class for a NormalizedSubmissionObject.
*/ */
@inheritSerialization(NormalizedDSpaceObject) @inheritSerialization(NormalizedDSpaceObject)
export class NormalizedSubmissionObject extends NormalizedDSpaceObject { export class NormalizedSubmissionObject<T extends DSpaceObject> extends NormalizedDSpaceObject<T> {
/** /**
* The workspaceitem/workflowitem identifier * The workspaceitem/workflowitem identifier

View File

@@ -7,7 +7,7 @@ import { ResourceType } from '../../shared/resource-type';
@mapsTo(Workflowitem) @mapsTo(Workflowitem)
@inheritSerialization(NormalizedSubmissionObject) @inheritSerialization(NormalizedSubmissionObject)
export class NormalizedWorkflowItem extends NormalizedSubmissionObject { export class NormalizedWorkflowItem extends NormalizedSubmissionObject<Workflowitem> {
@autoserialize @autoserialize
@relationship(ResourceType.Collection, false) @relationship(ResourceType.Collection, false)

View File

@@ -5,11 +5,12 @@ import { NormalizedSubmissionObject } from './normalized-submission-object.model
import { mapsTo, relationship } from '../../cache/builders/build-decorators'; import { mapsTo, relationship } from '../../cache/builders/build-decorators';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model'; import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
import { ResourceType } from '../../shared/resource-type'; import { ResourceType } from '../../shared/resource-type';
import { Workflowitem } from './workflowitem.model';
@mapsTo(Workspaceitem) @mapsTo(Workspaceitem)
@inheritSerialization(NormalizedDSpaceObject) @inheritSerialization(NormalizedDSpaceObject)
@inheritSerialization(NormalizedSubmissionObject) @inheritSerialization(NormalizedSubmissionObject)
export class NormalizedWorkspaceItem extends NormalizedSubmissionObject { export class NormalizedWorkspaceItem extends NormalizedSubmissionObject<Workflowitem> {
@autoserialize @autoserialize
@relationship(ResourceType.Collection, false) @relationship(ResourceType.Collection, false)

View File

@@ -1,78 +0,0 @@
import { SubmissionDefinitionsModel } from '../config/models/config-submission-definitions.model';
import { SubmissionFormsModel } from '../config/models/config-submission-forms.model';
import { SubmissionSectionModel } from '../config/models/config-submission-section.model';
import { GenericConstructor } from '../shared/generic-constructor';
import { NormalizedBitstream } from '../cache/models/normalized-bitstream.model';
import { NormalizedBundle } from '../cache/models/normalized-bundle.model';
import { NormalizedCollection } from '../cache/models/normalized-collection.model';
import { NormalizedCommunity } from '../cache/models/normalized-community.model';
import { NormalizedItem } from '../cache/models/normalized-item.model';
import { NormalizedLicense } from '../cache/models/normalized-license.model';
import { NormalizedWorkspaceItem } from './models/normalized-workspaceitem.model';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { ConfigObject } from '../config/models/config.model';
import { SubmissionResourceType } from './submission-resource-type';
import { NormalizedResourcePolicy } from '../cache/models/normalized-resource-policy.model';
import { NormalizedWorkflowItem } from './models/normalized-workflowitem.model';
import { NormalizedEditItem } from './models/normalized-edititem.model';
import { ResourceType } from '../shared/resource-type';
import { NormalizedEPerson } from '../eperson/models/normalized-eperson.model';
import { NormalizedGroup } from '../eperson/models/normalized-group.model';
export class NormalizedSubmissionObjectFactory {
public static getConstructor(type: SubmissionResourceType): GenericConstructor<NormalizedObject | ConfigObject> {
switch (type) {
case SubmissionResourceType.Bitstream: {
return NormalizedBitstream
}
case SubmissionResourceType.Bundle: {
return NormalizedBundle
}
case SubmissionResourceType.Item: {
return NormalizedItem
}
case SubmissionResourceType.Collection: {
return NormalizedCollection
}
case SubmissionResourceType.Community: {
return NormalizedCommunity
}
case SubmissionResourceType.ResourcePolicy: {
return NormalizedResourcePolicy
}
case SubmissionResourceType.License: {
return NormalizedLicense
}
case SubmissionResourceType.EPerson: {
return NormalizedEPerson
}
case SubmissionResourceType.Group: {
return NormalizedGroup
}
case SubmissionResourceType.WorkspaceItem: {
return NormalizedWorkspaceItem
}
case SubmissionResourceType.WorkflowItem: {
return NormalizedWorkflowItem
}
case SubmissionResourceType.EditItem: {
return NormalizedEditItem
}
case SubmissionResourceType.SubmissionDefinition:
case SubmissionResourceType.SubmissionDefinitions: {
return SubmissionDefinitionsModel
}
case SubmissionResourceType.SubmissionForm:
case SubmissionResourceType.SubmissionForms: {
return SubmissionFormsModel
}
case SubmissionResourceType.SubmissionSection:
case SubmissionResourceType.SubmissionSections: {
return SubmissionSectionModel
}
default: {
return undefined;
}
}
}
}

View File

@@ -10,13 +10,13 @@ import { BaseResponseParsingService } from '../data/base-response-parsing.servic
import { GLOBAL_CONFIG } from '../../../config'; import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface'; import { GlobalConfig } from '../../../config/global-config.interface';
import { ObjectCacheService } from '../cache/object-cache.service'; import { ObjectCacheService } from '../cache/object-cache.service';
import { NormalizedSubmissionObjectFactory } from './normalized-submission-object-factory';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { SubmissionResourceType } from './submission-resource-type'; import { SubmissionResourceType } from './submission-resource-type';
import { NormalizedWorkspaceItem } from './models/normalized-workspaceitem.model'; import { NormalizedWorkspaceItem } from './models/normalized-workspaceitem.model';
import { NormalizedWorkflowItem } from './models/normalized-workflowitem.model'; import { NormalizedWorkflowItem } from './models/normalized-workflowitem.model';
import { NormalizedEditItem } from './models/normalized-edititem.model'; import { NormalizedEditItem } from './models/normalized-edititem.model';
import { FormFieldMetadataValueObject } from '../../shared/form/builder/models/form-field-metadata-value.model'; import { FormFieldMetadataValueObject } from '../../shared/form/builder/models/form-field-metadata-value.model';
import { SubmissionObject } from './models/submission-object.model';
import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
export function isServerFormValue(obj: any): boolean { export function isServerFormValue(obj: any): boolean {
return (typeof obj === 'object' return (typeof obj === 'object'
@@ -66,7 +66,7 @@ export function normalizeSectionData(obj: any) {
@Injectable() @Injectable()
export class SubmissionResponseParsingService extends BaseResponseParsingService implements ResponseParsingService { export class SubmissionResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
protected objectFactory = NormalizedSubmissionObjectFactory; protected objectFactory = NormalizedObjectFactory;
protected toCache = false; protected toCache = false;
constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig, constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
@@ -78,7 +78,7 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
if (isNotEmpty(data.payload) if (isNotEmpty(data.payload)
&& isNotEmpty(data.payload._links) && isNotEmpty(data.payload._links)
&& (data.statusCode === 201 || data.statusCode === 200)) { && (data.statusCode === 201 || data.statusCode === 200)) {
const dataDefinition = this.processResponse<NormalizedObject | ConfigObject, SubmissionResourceType>(data.payload, request.href); const dataDefinition = this.processResponse<SubmissionObject | ConfigObject, SubmissionResourceType>(data.payload, request.href);
return new SubmissionSuccessResponse(dataDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload)); return new SubmissionSuccessResponse(dataDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else if (isEmpty(data.payload) && data.statusCode === 204) { } else if (isEmpty(data.payload) && data.statusCode === 204) {
// Response from a DELETE request // Response from a DELETE request
@@ -94,7 +94,7 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
} }
protected processResponse<ObjectDomain, ObjectType>(data: any, requestHref: string): any[] { protected processResponse<ObjectDomain, ObjectType>(data: any, requestHref: string): any[] {
const dataDefinition = this.process<NormalizedObject | ConfigObject, SubmissionResourceType>(data, requestHref); const dataDefinition = this.process<ObjectDomain, ObjectType>(data, requestHref);
const normalizedDefinition = Array.of(); const normalizedDefinition = Array.of();
const processedList = Array.isArray(dataDefinition) ? dataDefinition : Array.of(dataDefinition); const processedList = Array.isArray(dataDefinition) ? dataDefinition : Array.of(dataDefinition);

View File

@@ -6,7 +6,6 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv
import { CoreState } from '../core.reducers'; import { CoreState } from '../core.reducers';
import { DataService } from '../data/data.service'; import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service'; import { RequestService } from '../data/request.service';
import { NormalizedWorkflowItem } from './models/normalized-workflowitem.model';
import { Workflowitem } from './models/workflowitem.model'; import { Workflowitem } from './models/workflowitem.model';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { FindAllOptions } from '../data/request.models'; import { FindAllOptions } from '../data/request.models';
@@ -16,12 +15,12 @@ import { ObjectCacheService } from '../cache/object-cache.service';
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
@Injectable() @Injectable()
export class WorkflowitemDataService extends DataService<NormalizedWorkflowItem, Workflowitem> { export class WorkflowitemDataService extends DataService<Workflowitem> {
protected linkPath = 'workflowitems'; protected linkPath = 'workflowitems';
protected forceBypassCache = true; protected forceBypassCache = true;
constructor( constructor(
protected comparator: DSOChangeAnalyzer, protected comparator: DSOChangeAnalyzer<Workflowitem>,
protected dataBuildService: NormalizedObjectBuildService, protected dataBuildService: NormalizedObjectBuildService,
protected halService: HALEndpointService, protected halService: HALEndpointService,
protected http: HttpClient, protected http: HttpClient,

View File

@@ -7,7 +7,6 @@ import { CoreState } from '../core.reducers';
import { DataService } from '../data/data.service'; import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service'; import { RequestService } from '../data/request.service';
import { Workspaceitem } from './models/workspaceitem.model'; import { Workspaceitem } from './models/workspaceitem.model';
import { NormalizedWorkspaceItem } from './models/normalized-workspaceitem.model';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { FindAllOptions } from '../data/request.models'; import { FindAllOptions } from '../data/request.models';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service'; import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
@@ -16,12 +15,12 @@ import { ObjectCacheService } from '../cache/object-cache.service';
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
@Injectable() @Injectable()
export class WorkspaceitemDataService extends DataService<NormalizedWorkspaceItem, Workspaceitem> { export class WorkspaceitemDataService extends DataService<Workspaceitem> {
protected linkPath = 'workspaceitems'; protected linkPath = 'workspaceitems';
protected forceBypassCache = true; protected forceBypassCache = true;
constructor( constructor(
protected comparator: DSOChangeAnalyzer, protected comparator: DSOChangeAnalyzer<Workspaceitem>,
protected dataBuildService: NormalizedObjectBuildService, protected dataBuildService: NormalizedObjectBuildService,
protected halService: HALEndpointService, protected halService: HALEndpointService,
protected http: HttpClient, protected http: HttpClient,

View File

@@ -52,6 +52,7 @@ export class NotificationsService {
options: Partial<NotificationOptions> = {}, options: Partial<NotificationOptions> = {},
html: boolean = false): INotification { html: boolean = false): INotification {
const notificationOptions = { ...this.getDefaultOptions(), ...options }; const notificationOptions = { ...this.getDefaultOptions(), ...options };
console.log(notificationOptions);
const notification = new Notification(uniqueId(), NotificationType.Info, title, content, notificationOptions, html); const notification = new Notification(uniqueId(), NotificationType.Info, title, content, notificationOptions, html);
this.add(notification); this.add(notification);
return notification; return notification;

View File

@@ -772,7 +772,7 @@ describe('SubmissionService test suite', () => {
it('should return true/false when section is loading/not loading', fakeAsync(() => { it('should return true/false when section is loading/not loading', fakeAsync(() => {
spyOn((service as any).translate, 'get').and.returnValue(observableOf('test')); spyOn((service as any).translate, 'get').and.returnValue(observableOf('test'));
spyOn((service as any).notificationsService, 'info').and.callThrough(); spyOn((service as any).notificationsService, 'info');
service.notifyNewSection(submissionId, sectionId); service.notifyNewSection(submissionId, sectionId);
flush(); flush();
@@ -864,7 +864,7 @@ describe('SubmissionService test suite', () => {
}) })
); );
const result = service.retrieveSubmission('826').subscribe((r) => { service.retrieveSubmission('826').subscribe((r) => {
expect(r).toEqual(new RemoteData( expect(r).toEqual(new RemoteData(
false, false,
false, false,