diff --git a/src/app/+item-page/edit-item-page/item-status/item-status.component.spec.ts b/src/app/+item-page/edit-item-page/item-status/item-status.component.spec.ts
index 00ea9b9f62..30f326bec4 100644
--- a/src/app/+item-page/edit-item-page/item-status/item-status.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/item-status/item-status.component.spec.ts
@@ -11,7 +11,7 @@ import { Item } from '../../../core/shared/item.model';
import { By } from '@angular/platform-browser';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { of as observableOf } from 'rxjs';
-import { RemoteData } from '../../../core/data/remote-data';
+import { createSuccessfulRemoteDataObject } from '../../../shared/testing/utils';
describe('ItemStatusComponent', () => {
let comp: ItemStatusComponent;
@@ -27,7 +27,7 @@ describe('ItemStatusComponent', () => {
const routeStub = {
parent: {
- data: observableOf({ item: new RemoteData(false, false, true, null, mockItem) })
+ data: observableOf({ item: createSuccessfulRemoteDataObject(mockItem) })
}
};
diff --git a/src/app/+item-page/edit-item-page/item-withdraw/item-withdraw.component.spec.ts b/src/app/+item-page/edit-item-page/item-withdraw/item-withdraw.component.spec.ts
index ac49eee7e7..4c23a1d1e5 100644
--- a/src/app/+item-page/edit-item-page/item-withdraw/item-withdraw.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/item-withdraw/item-withdraw.component.spec.ts
@@ -16,6 +16,7 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ItemWithdrawComponent } from './item-withdraw.component';
import { By } from '@angular/platform-browser';
import { RestResponse } from '../../../core/cache/response.models';
+import { createSuccessfulRemoteDataObject } from '../../../shared/testing/utils';
let comp: ItemWithdrawComponent;
let fixture: ComponentFixture
;
@@ -50,7 +51,7 @@ describe('ItemWithdrawComponent', () => {
routeStub = {
data: observableOf({
- item: new RemoteData(false, false, true, null, {
+ item: createSuccessfulRemoteDataObject({
id: 'fake-id'
})
})
diff --git a/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts b/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts
index 32acdef467..e4413e47c6 100644
--- a/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/simple-item-action/abstract-simple-item-action.component.spec.ts
@@ -17,6 +17,10 @@ import { By } from '@angular/platform-browser';
import { of as observableOf } from 'rxjs';
import { getItemEditPath } from '../../item-page-routing.module';
import { RestResponse } from '../../../core/cache/response.models';
+import {
+ createSuccessfulRemoteDataObject,
+ createSuccessfulRemoteDataObject$
+} from '../../../shared/testing/utils';
/**
* Test component that implements the AbstractSimpleItemActionComponent used to test the
@@ -65,12 +69,12 @@ describe('AbstractSimpleItemActionComponent', () => {
});
mockItemDataService = jasmine.createSpyObj({
- findById: observableOf(new RemoteData(false, false, true, undefined, mockItem))
+ findById: createSuccessfulRemoteDataObject$(mockItem)
});
routeStub = {
data: observableOf({
- item: new RemoteData(false, false, true, null, {
+ item: createSuccessfulRemoteDataObject({
id: 'fake-id'
})
})
diff --git a/src/app/+item-page/field-components/collections/collections.component.spec.ts b/src/app/+item-page/field-components/collections/collections.component.spec.ts
index 53fcded9e3..b53f499881 100644
--- a/src/app/+item-page/field-components/collections/collections.component.spec.ts
+++ b/src/app/+item-page/field-components/collections/collections.component.spec.ts
@@ -9,6 +9,10 @@ import { Item } from '../../../core/shared/item.model';
import { of as observableOf } from 'rxjs';
import { RemoteData } from '../../../core/data/remote-data';
import { TranslateModule } from '@ngx-translate/core';
+import {
+ createFailedRemoteDataObject$,
+ createSuccessfulRemoteDataObject$
+} from '../../../shared/testing/utils';
let collectionsComponent: CollectionsComponent;
let fixture: ComponentFixture;
@@ -24,8 +28,8 @@ const mockCollection1: Collection = Object.assign(new Collection(), {
}
});
-const succeededMockItem: Item = Object.assign(new Item(), {owningCollection: observableOf(new RemoteData(false, false, true, null, mockCollection1))});
-const failedMockItem: Item = Object.assign(new Item(), {owningCollection: observableOf(new RemoteData(false, false, false, null, mockCollection1))});
+const succeededMockItem: Item = Object.assign(new Item(), {owningCollection: createSuccessfulRemoteDataObject$(mockCollection1)});
+const failedMockItem: Item = Object.assign(new Item(), {owningCollection: createFailedRemoteDataObject$(mockCollection1)});
describe('CollectionsComponent', () => {
beforeEach(async(() => {
diff --git a/src/app/+item-page/full/full-item-page.component.spec.ts b/src/app/+item-page/full/full-item-page.component.spec.ts
index 15dd001964..2f151b4997 100644
--- a/src/app/+item-page/full/full-item-page.component.spec.ts
+++ b/src/app/+item-page/full/full-item-page.component.spec.ts
@@ -17,9 +17,13 @@ import { RemoteData } from '../../core/data/remote-data';
import { of as observableOf } from 'rxjs';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { By } from '@angular/platform-browser';
+import {
+ createSuccessfulRemoteDataObject,
+ createSuccessfulRemoteDataObject$
+} from '../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
'dc.title': [
{
@@ -30,7 +34,7 @@ const mockItem: Item = Object.assign(new Item(), {
}
});
const routeStub = Object.assign(new ActivatedRouteStub(), {
- data: observableOf({ item: new RemoteData(false, false, true, null, mockItem) })
+ data: observableOf({ item: createSuccessfulRemoteDataObject(mockItem) })
});
const metadataServiceStub = {
/* tslint:disable:no-empty */
diff --git a/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts
index ebb46e6600..3dd47dc7be 100644
--- a/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts
@@ -11,6 +11,7 @@ import { ItemPageFieldComponent } from './item-page-field.component';
import { MetadataValuesComponent } from '../../../field-components/metadata-values/metadata-values.component';
import { of as observableOf } from 'rxjs';
import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
let comp: ItemPageFieldComponent;
let fixture: ComponentFixture;
@@ -52,7 +53,7 @@ describe('ItemPageFieldComponent', () => {
export function mockItemWithMetadataFieldAndValue(field: string, value: string): Item {
const item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: new MetadataMap()
});
item.metadata[field] = [{
diff --git a/src/app/+item-page/simple/item-page.component.spec.ts b/src/app/+item-page/simple/item-page.component.spec.ts
index e1202ab725..cd5c385671 100644
--- a/src/app/+item-page/simple/item-page.component.spec.ts
+++ b/src/app/+item-page/simple/item-page.component.spec.ts
@@ -16,9 +16,13 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { By } from '@angular/platform-browser';
import { createRelationshipsObservable } from './item-types/shared/item.component.spec';
import { of as observableOf } from 'rxjs';
+import {
+ createFailedRemoteDataObject$, createPendingRemoteDataObject$, createSuccessfulRemoteDataObject,
+ createSuccessfulRemoteDataObject$
+} from '../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: [],
relationships: createRelationshipsObservable()
});
@@ -33,7 +37,7 @@ describe('ItemPageComponent', () => {
/* tslint:enable:no-empty */
};
const mockRoute = Object.assign(new ActivatedRouteStub(), {
- data: observableOf({ item: new RemoteData(false, false, true, null, mockItem) })
+ data: observableOf({ item: createSuccessfulRemoteDataObject(mockItem) })
});
beforeEach(async(() => {
@@ -66,7 +70,8 @@ describe('ItemPageComponent', () => {
describe('when the item is loading', () => {
beforeEach(() => {
- comp.itemRD$ = observableOf(new RemoteData(true, true, true, null, undefined));
+ comp.itemRD$ = createPendingRemoteDataObject$(undefined);
+ // comp.itemRD$ = observableOf(new RemoteData(true, true, true, null, undefined));
fixture.detectChanges();
});
@@ -78,7 +83,7 @@ describe('ItemPageComponent', () => {
describe('when the item failed loading', () => {
beforeEach(() => {
- comp.itemRD$ = observableOf(new RemoteData(false, false, false, null, undefined));
+ comp.itemRD$ = createFailedRemoteDataObject$(undefined);
fixture.detectChanges();
});
diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts
index 823095602a..6c0429a356 100644
--- a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts
+++ b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts
@@ -16,9 +16,10 @@ import { createRelationshipsObservable } from '../shared/item.component.spec';
import { PublicationComponent } from './publication.component';
import { of as observableOf } from 'rxjs';
import { MetadataMap } from '../../../../core/shared/metadata.models';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: new MetadataMap(),
relationships: createRelationshipsObservable()
});
diff --git a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
index 21972f93a5..90297cf268 100644
--- a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
+++ b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
@@ -25,6 +25,7 @@ import { MetadatumRepresentation } from '../../../../core/shared/metadata-repres
import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';
import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models';
import { compareArraysUsing, compareArraysUsingIds } from './item-relationships-utils';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
/**
* Create a generic test for an item-page-fields component using a mockItem and the type of component
@@ -94,13 +95,13 @@ export function containsFieldInput(fields: DebugElement[], metadataKey: string):
}
export function createRelationshipsObservable() {
- return observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), [
+ return createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [
Object.assign(new Relationship(), {
- relationshipType: observableOf(new RemoteData(false, false, true, null, new RelationshipType())),
- leftItem: observableOf(new RemoteData(false, false, true, null, new Item())),
- rightItem: observableOf(new RemoteData(false, false, true, null, new Item()))
+ relationshipType: createSuccessfulRemoteDataObject$(new RelationshipType()),
+ leftItem: createSuccessfulRemoteDataObject$(new Item()),
+ rightItem: createSuccessfulRemoteDataObject$(new Item())
})
- ])));
+ ]));
}
describe('ItemComponent', () => {
const arr1 = [
@@ -329,15 +330,15 @@ describe('ItemComponent', () => {
uuid: '1',
metadata: new MetadataMap()
});
- mockItem.relationships = observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), [
+ mockItem.relationships = createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [
Object.assign(new Relationship(), {
uuid: '123',
id: '123',
- leftItem: observableOf(new RemoteData(false, false, true, null, mockItem)),
- rightItem: observableOf(new RemoteData(false, false, true, null, relatedItem)),
- relationshipType: observableOf(new RemoteData(false, false, true, null, new RelationshipType()))
+ leftItem: createSuccessfulRemoteDataObject$(mockItem),
+ rightItem: createSuccessfulRemoteDataObject$(relatedItem),
+ relationshipType: createSuccessfulRemoteDataObject$(new RelationshipType())
})
- ])));
+ ]));
mockItem.metadata[metadataField] = [
{
value: 'Second value',
@@ -358,6 +359,13 @@ describe('ItemComponent', () => {
authority: '123'
}
] as MetadataValue[];
+ const mockItemDataService = Object.assign({
+ findById: (id) => {
+ if (id === relatedItem.id) {
+ return createSuccessfulRemoteDataObject$(relatedItem)
+ }
+ }
+ }) as ItemDataService;
let representations: Observable;
diff --git a/src/app/+item-page/simple/related-items/related-items.component.spec.ts b/src/app/+item-page/simple/related-items/related-items.component.spec.ts
index ef42ab1098..1896f46015 100644
--- a/src/app/+item-page/simple/related-items/related-items.component.spec.ts
+++ b/src/app/+item-page/simple/related-items/related-items.component.spec.ts
@@ -8,14 +8,15 @@ import { PageInfo } from '../../../core/shared/page-info.model';
import { By } from '@angular/platform-browser';
import { createRelationshipsObservable } from '../item-types/shared/item.component.spec';
import { of as observableOf } from 'rxjs';
+import { createSuccessfulRemoteDataObject$ } from '../../../shared/testing/utils';
const mockItem1: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: [],
relationships: createRelationshipsObservable()
});
const mockItem2: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: [],
relationships: createRelationshipsObservable()
});
diff --git a/src/app/+my-dspace-page/my-dspace-page.component.spec.ts b/src/app/+my-dspace-page/my-dspace-page.component.spec.ts
index f0341a6937..4ead113078 100644
--- a/src/app/+my-dspace-page/my-dspace-page.component.spec.ts
+++ b/src/app/+my-dspace-page/my-dspace-page.component.spec.ts
@@ -28,6 +28,7 @@ import { SearchFilterService } from '../core/shared/search/search-filter.service
import { RoleDirective } from '../shared/roles/role.directive';
import { RoleService } from '../core/roles/role.service';
import { MockRoleService } from '../shared/mocks/mock-role-service';
+import { createSuccessfulRemoteDataObject$ } from '../shared/testing/utils';
describe('MyDSpacePageComponent', () => {
let comp: MyDSpacePageComponent;
@@ -45,7 +46,7 @@ describe('MyDSpacePageComponent', () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
const sort: SortOptions = new SortOptions('score', SortDirection.DESC);
- const mockResults = observableOf(new RemoteData(false, false, true, null, ['test', 'data']));
+ const mockResults = createSuccessfulRemoteDataObject$(['test', 'data']);
const searchServiceStub = jasmine.createSpyObj('SearchService', {
search: mockResults,
getSearchLink: '/mydspace',
diff --git a/src/app/+search-page/search-page.component.spec.ts b/src/app/+search-page/search-page.component.spec.ts
index eb65dcbdba..4168646a19 100644
--- a/src/app/+search-page/search-page.component.spec.ts
+++ b/src/app/+search-page/search-page.component.spec.ts
@@ -19,10 +19,10 @@ import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap';
import { SearchSidebarService } from '../core/shared/search/search-sidebar.service';
import { SearchFilterService } from '../core/shared/search/search-filter.service';
import { SearchConfigurationService } from '../core/shared/search/search-configuration.service';
-import { RemoteData } from '../core/data/remote-data';
import { SEARCH_CONFIG_SERVICE } from '../+my-dspace-page/my-dspace-page.component';
import { RouteService } from '../shared/services/route.service';
import { SearchConfigurationServiceStub } from '../shared/testing/search-configuration-service-stub';
+import { createSuccessfulRemoteDataObject$ } from '../shared/testing/utils';
import { PaginatedSearchOptions } from '../shared/search/paginated-search-options.model';
let comp: SearchPageComponent;
@@ -40,7 +40,7 @@ pagination.id = 'search-results-pagination';
pagination.currentPage = 1;
pagination.pageSize = 10;
const sort: SortOptions = new SortOptions('score', SortDirection.DESC);
-const mockResults = observableOf(new RemoteData(false, false, true, null, ['test', 'data']));
+const mockResults = createSuccessfulRemoteDataObject$(['test', 'data']);
const searchServiceStub = jasmine.createSpyObj('SearchService', {
search: mockResults,
getSearchLink: '/search',
diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts
index aa182eb291..d5df70698c 100644
--- a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts
+++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts
@@ -20,4 +20,4 @@ import { SubmissionEditComponent } from '../submission/edit/submission-edit.comp
/**
* This module defines the default component to load when navigating to the workflowitems edit page path.
*/
-export class WorkflowitemsEditPageRoutingModule { }
+export class WorkflowItemsEditPageRoutingModule { }
diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts
index fbb53d8dcc..7a89f18c7d 100644
--- a/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts
+++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts
@@ -1,12 +1,12 @@
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { SharedModule } from '../shared/shared.module';
-import { WorkflowitemsEditPageRoutingModule } from './workflowitems-edit-page-routing.module';
+import { WorkflowItemsEditPageRoutingModule } from './workflowitems-edit-page-routing.module';
import { SubmissionModule } from '../submission/submission.module';
@NgModule({
imports: [
- WorkflowitemsEditPageRoutingModule,
+ WorkflowItemsEditPageRoutingModule,
CommonModule,
SharedModule,
SubmissionModule,
@@ -16,6 +16,6 @@ import { SubmissionModule } from '../submission/submission.module';
/**
* This module handles all modules that need to access the workflowitems edit page.
*/
-export class WorkflowitemsEditPageModule {
+export class WorkflowItemsEditPageModule {
}
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index cb80d0165e..86364aca89 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -32,7 +32,7 @@ export function getCommunityModulePath() {
{ path: 'logout', loadChildren: './+logout-page/logout-page.module#LogoutPageModule' },
{ path: 'submit', loadChildren: './+submit-page/submit-page.module#SubmitPageModule' },
{ path: 'workspaceitems', loadChildren: './+workspaceitems-edit-page/workspaceitems-edit-page.module#WorkspaceitemsEditPageModule' },
- { path: 'workflowitems', loadChildren: './+workflowitems-edit-page/workflowitems-edit-page.module#WorkflowitemsEditPageModule' },
+ { path: 'workflowitems', loadChildren: './+workflowitems-edit-page/workflowitems-edit-page.module#WorkflowItemsEditPageModule' },
{ path: '**', pathMatch: 'full', component: PageNotFoundComponent },
])
],
diff --git a/src/app/core/auth/auth-object-factory.ts b/src/app/core/auth/auth-object-factory.ts
deleted file mode 100644
index 02458f4e3e..0000000000
--- a/src/app/core/auth/auth-object-factory.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { AuthType } from './auth-type';
-import { GenericConstructor } from '../shared/generic-constructor';
-import { NormalizedAuthStatus } from './models/normalized-auth-status.model';
-import { NormalizedEPerson } from '../eperson/models/normalized-eperson.model';
-import { NormalizedObject } from '../cache/models/normalized-object.model';
-import { CacheableObject } from '../cache/object-cache.reducer';
-import { NormalizedGroup } from '../eperson/models/normalized-group.model';
-
-export class AuthObjectFactory {
- public static getConstructor(type): GenericConstructor> {
- switch (type) {
- case AuthType.EPerson: {
- return NormalizedEPerson
- }
-
- case AuthType.Group: {
- return NormalizedGroup
- }
-
- case AuthType.Status: {
- return NormalizedAuthStatus
- }
-
- default: {
- return undefined;
- }
- }
- }
-}
diff --git a/src/app/core/auth/auth-response-parsing.service.spec.ts b/src/app/core/auth/auth-response-parsing.service.spec.ts
index 0b2c32fc04..112d60b8d2 100644
--- a/src/app/core/auth/auth-response-parsing.service.spec.ts
+++ b/src/app/core/auth/auth-response-parsing.service.spec.ts
@@ -35,95 +35,103 @@ describe('AuthResponseParsingService', () => {
});
describe('parse', () => {
- const validRequest = new AuthPostRequest(
- '69f375b5-19f4-4453-8c7a-7dc5c55aafbb',
- 'https://rest.api/dspace-spring-rest/api/authn/login',
- 'password=test&user=myself@testshib.org');
+ let validRequest;
+ let validRequest2;
+ let validResponse;
+ let validResponse1;
+ let validResponse2;
+ beforeEach(() => {
- const validRequest2 = new AuthGetRequest(
- '69f375b5-19f4-4453-8c7a-7dc5c55aafbb',
- 'https://rest.api/dspace-spring-rest/api/authn/status');
+ validRequest = new AuthPostRequest(
+ '69f375b5-19f4-4453-8c7a-7dc5c55aafbb',
+ 'https://rest.api/dspace-spring-rest/api/authn/login',
+ 'password=test&user=myself@testshib.org');
- const validResponse = {
- payload: {
- authenticated: true,
- id: null,
- okay: true,
- token: {
- accessToken: 'eyJhbGciOiJIUzI1NiJ9.eyJlaWQiOiI0ZGM3MGFiNS1jZDczLTQ5MmYtYjAwNy0zMTc5ZDJkOTI5NmIiLCJzZyI6W10sImV4cCI6MTUyNjMxODMyMn0.ASmvcbJFBfzhN7D5ncloWnaVZr5dLtgTuOgHaCKiimc',
- expires: 1526318322000
- },
- } as AuthStatus,
- statusCode: 200,
- statusText: '200'
- };
+ validRequest2 = new AuthGetRequest(
+ '69f375b5-19f4-4453-8c7a-7dc5c55aafbb',
+ 'https://rest.api/dspace-spring-rest/api/authn/status');
- const validResponse1 = {
- payload: {},
- statusCode: 404,
- statusText: '404'
- };
+ validResponse = {
+ payload: {
+ authenticated: true,
+ id: null,
+ okay: true,
+ token: {
+ accessToken: 'eyJhbGciOiJIUzI1NiJ9.eyJlaWQiOiI0ZGM3MGFiNS1jZDczLTQ5MmYtYjAwNy0zMTc5ZDJkOTI5NmIiLCJzZyI6W10sImV4cCI6MTUyNjMxODMyMn0.ASmvcbJFBfzhN7D5ncloWnaVZr5dLtgTuOgHaCKiimc',
+ expires: 1526318322000
+ },
+ } as AuthStatus,
+ statusCode: 200,
+ statusText: '200'
+ };
- const validResponse2 = {
- payload: {
- authenticated: true,
- id: null,
- okay: true,
- type: 'status',
- _embedded: {
- eperson: {
- canLogIn: true,
- email: 'myself@testshib.org',
- groups: [],
- handle: null,
- id: '4dc70ab5-cd73-492f-b007-3179d2d9296b',
- lastActive: '2018-05-14T17:03:31.277+0000',
- metadata: {
- 'eperson.firstname': [
- {
- language: null,
- value: 'User'
+ validResponse1 = {
+ payload: {},
+ statusCode: 404,
+ statusText: '404'
+ };
+
+ validResponse2 = {
+ payload: {
+ authenticated: true,
+ id: null,
+ okay: true,
+ type: 'status',
+ _embedded: {
+ eperson: {
+ canLogIn: true,
+ email: 'myself@testshib.org',
+ groups: [],
+ handle: null,
+ id: '4dc70ab5-cd73-492f-b007-3179d2d9296b',
+ lastActive: '2018-05-14T17:03:31.277+0000',
+ metadata: {
+ 'eperson.firstname': [
+ {
+ language: null,
+ value: 'User'
+ }
+ ],
+ 'eperson.lastname': [
+ {
+ language: null,
+ value: 'Test'
+ }
+ ],
+ 'eperson.language': [
+ {
+ language: null,
+ value: 'en'
+ }
+ ]
+ },
+ name: 'User Test',
+ netid: 'myself@testshib.org',
+ requireCertificate: false,
+ selfRegistered: false,
+ type: 'eperson',
+ uuid: '4dc70ab5-cd73-492f-b007-3179d2d9296b',
+ _links: {
+ self: {
+ href: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/eperson/epersons/4dc70ab5-cd73-492f-b007-3179d2d9296b'
}
- ],
- 'eperson.lastname': [
- {
- language: null,
- value: 'Test'
- }
- ],
- 'eperson.language': [
- {
- language: null,
- value: 'en'
- }
- ]
- },
- name: 'User Test',
- netid: 'myself@testshib.org',
- requireCertificate: false,
- selfRegistered: false,
- type: 'eperson',
- uuid: '4dc70ab5-cd73-492f-b007-3179d2d9296b',
- _links: {
- self: {
- href: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/eperson/epersons/4dc70ab5-cd73-492f-b007-3179d2d9296b'
}
}
+ },
+ _links: {
+ eperson: {
+ href: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/eperson/epersons/4dc70ab5-cd73-492f-b007-3179d2d9296b'
+ },
+ self: {
+ href: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/authn/status'
+ }
}
},
- _links: {
- eperson: {
- href: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/eperson/epersons/4dc70ab5-cd73-492f-b007-3179d2d9296b'
- },
- self: {
- href: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/authn/status'
- }
- }
- },
- statusCode: 200,
- statusText: '200'
+ statusCode: 200,
+ statusText: '200'
- };
+ };
+ });
it('should return a AuthStatusResponse if data contains a valid AuthStatus object as payload', () => {
const response = service.parse(validRequest, validResponse);
diff --git a/src/app/core/auth/auth-response-parsing.service.ts b/src/app/core/auth/auth-response-parsing.service.ts
index c736c3b22b..a5a160531c 100644
--- a/src/app/core/auth/auth-response-parsing.service.ts
+++ b/src/app/core/auth/auth-response-parsing.service.ts
@@ -1,6 +1,5 @@
import { Inject, Injectable } from '@angular/core';
-import { AuthObjectFactory } from './auth-object-factory';
import { BaseResponseParsingService } from '../data/base-response-parsing.service';
import { AuthStatusResponse, RestResponse } from '../cache/response.models';
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
@@ -10,7 +9,6 @@ import { isNotEmpty } from '../../shared/empty.util';
import { ObjectCacheService } from '../cache/object-cache.service';
import { ResponseParsingService } from '../data/parsing.service';
import { RestRequest } from '../data/request.models';
-import { AuthType } from './auth-type';
import { AuthStatus } from './models/auth-status.model';
import { NormalizedAuthStatus } from './models/normalized-auth-status.model';
import { NormalizedObject } from '../cache/models/normalized-object.model';
@@ -18,7 +16,6 @@ import { NormalizedObject } from '../cache/models/normalized-object.model';
@Injectable()
export class AuthResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- protected objectFactory = AuthObjectFactory;
protected toCache = true;
constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
@@ -28,7 +25,7 @@ export class AuthResponseParsingService extends BaseResponseParsingService imple
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 200)) {
- const response = this.process, AuthType>(data.payload, request.uuid);
+ const response = this.process>(data.payload, request.uuid);
return new AuthStatusResponse(response, data.statusCode, data.statusText);
} else {
return new AuthStatusResponse(data.payload as NormalizedAuthStatus, data.statusCode, data.statusText);
diff --git a/src/app/core/auth/auth-type.ts b/src/app/core/auth/auth-type.ts
deleted file mode 100644
index f0460449ea..0000000000
--- a/src/app/core/auth/auth-type.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export enum AuthType {
- EPerson = 'eperson',
- Status = 'status',
- Group = 'group'
-}
diff --git a/src/app/core/auth/models/auth-status.model.ts b/src/app/core/auth/models/auth-status.model.ts
index 6e722a80c9..e0d568397a 100644
--- a/src/app/core/auth/models/auth-status.model.ts
+++ b/src/app/core/auth/models/auth-status.model.ts
@@ -4,20 +4,51 @@ import { EPerson } from '../../eperson/models/eperson.model';
import { RemoteData } from '../../data/remote-data';
import { Observable } from 'rxjs';
import { CacheableObject } from '../../cache/object-cache.reducer';
+import { ResourceType } from '../../shared/resource-type';
+/**
+ * Object that represents the authenticated status of a user
+ */
export class AuthStatus implements CacheableObject {
+ static type = new ResourceType('status');
+ /**
+ * The unique identifier of this auth status
+ */
id: string;
+ /**
+ * The unique uuid of this auth status
+ */
+ uuid: string;
+
+ /**
+ * True if REST API is up and running, should never return false
+ */
okay: boolean;
+ /**
+ * If the auth status represents an authenticated state
+ */
authenticated: boolean;
+ /**
+ * Authentication error if there was one for this status
+ */
error?: AuthError;
+ /**
+ * The eperson of this auth status
+ */
eperson: Observable>;
+ /**
+ * True if the token is valid, false if there was no token or the token wasn't valid
+ */
token?: AuthTokenInfo;
+ /**
+ * The self link of this auth status' REST object
+ */
self: string;
}
diff --git a/src/app/core/auth/models/normalized-auth-status.model.ts b/src/app/core/auth/models/normalized-auth-status.model.ts
index a13a996604..3892bee408 100644
--- a/src/app/core/auth/models/normalized-auth-status.model.ts
+++ b/src/app/core/auth/models/normalized-auth-status.model.ts
@@ -1,16 +1,22 @@
import { AuthStatus } from './auth-status.model';
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
import { NormalizedObject } from '../../cache/models/normalized-object.model';
import { IDToUUIDSerializer } from '../../cache/id-to-uuid-serializer';
+import { EPerson } from '../../eperson/models/eperson.model';
@mapsTo(AuthStatus)
@inheritSerialization(NormalizedObject)
export class NormalizedAuthStatus extends NormalizedObject {
+ /**
+ * The unique identifier of this auth status
+ */
@autoserialize
id: string;
+ /**
+ * The unique generated uuid of this auth status
+ */
@autoserializeAs(new IDToUUIDSerializer('auth-status'), 'id')
uuid: string;
@@ -26,7 +32,10 @@ export class NormalizedAuthStatus extends NormalizedObject {
@autoserialize
authenticated: boolean;
- @relationship(ResourceType.EPerson, false)
+ /**
+ * The self link to the eperson of this auth status
+ */
+ @relationship(EPerson, false)
@autoserialize
eperson: string;
}
diff --git a/src/app/core/browse/browse.service.ts b/src/app/core/browse/browse.service.ts
index bf368e37ce..eb494d7bdb 100644
--- a/src/app/core/browse/browse.service.ts
+++ b/src/app/core/browse/browse.service.ts
@@ -1,8 +1,9 @@
import { Injectable } from '@angular/core';
import { Observable, of as observableOf } from 'rxjs';
-import { distinctUntilChanged, map, startWith, take } from 'rxjs/operators';
+import { distinctUntilChanged, map, startWith } from 'rxjs/operators';
import {
- ensureArrayHasValue, hasValue,
+ ensureArrayHasValue,
+ hasValue,
hasValueOperator,
isEmpty,
isNotEmpty,
@@ -23,7 +24,9 @@ import { BrowseEntry } from '../shared/browse-entry.model';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import {
configureRequest,
- filterSuccessfulResponses, getBrowseDefinitionLinks, getFirstOccurrence,
+ filterSuccessfulResponses,
+ getBrowseDefinitionLinks,
+ getFirstOccurrence,
getRemoteDataPayload,
getRequestFromRequestHref
} from '../shared/operators';
@@ -32,7 +35,6 @@ import { Item } from '../shared/item.model';
import { DSpaceObject } from '../shared/dspace-object.model';
import { BrowseEntrySearchOptions } from './browse-entry-search-options.model';
import { GenericSuccessResponse } from '../cache/response.models';
-import { RequestEntry } from '../data/request.reducer';
/**
* The service handling all browse requests
diff --git a/src/app/core/cache/builders/build-decorators.ts b/src/app/core/cache/builders/build-decorators.ts
index 937fb37cd3..0bfb5f0321 100644
--- a/src/app/core/cache/builders/build-decorators.ts
+++ b/src/app/core/cache/builders/build-decorators.ts
@@ -1,23 +1,59 @@
import 'reflect-metadata';
import { GenericConstructor } from '../../shared/generic-constructor';
-import { CacheableObject } from '../object-cache.reducer';
+import { CacheableObject, TypedObject } from '../object-cache.reducer';
import { ResourceType } from '../../shared/resource-type';
const mapsToMetadataKey = Symbol('mapsTo');
const relationshipKey = Symbol('relationship');
const relationshipMap = new Map();
+const typeMap = new Map();
-export function mapsTo(value: GenericConstructor) {
- return Reflect.metadata(mapsToMetadataKey, value);
+/**
+ * Decorator function to map a normalized class to it's not-normalized counter part class
+ * It will also maps a type to the matching class
+ * @param value The not-normalized class to map to
+ */
+export function mapsTo(value: GenericConstructor) {
+ return function decorator(objectConstructor: GenericConstructor) {
+ Reflect.defineMetadata(mapsToMetadataKey, value, objectConstructor);
+ mapsToType((value as any).type, objectConstructor);
+ }
}
+/**
+ * Maps a type to the matching class
+ * @param value The resourse type
+ * @param objectConstructor The class to map to
+ */
+function mapsToType(value: ResourceType, objectConstructor: GenericConstructor) {
+ if (!objectConstructor || !value) {
+ return;
+ }
+ typeMap.set(value.value, objectConstructor);
+}
+
+/**
+ * Returns the mapped class for the given normalized class
+ * @param target The normalized class
+ */
export function getMapsTo(target: any) {
return Reflect.getOwnMetadata(mapsToMetadataKey, target);
}
-export function relationship(value: ResourceType, isList: boolean = false): any {
+/**
+ * Returns the mapped class for the given type
+ * @param type The resource type
+ */
+export function getMapsToType(type: string | ResourceType) {
+ if (typeof(type) === 'object') {
+ type = (type as ResourceType).value;
+ }
+ return typeMap.get(type);
+}
+
+export function relationship(value: GenericConstructor, isList: boolean = false): any {
return function r(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
if (!target || !propertyKey) {
return;
@@ -28,8 +64,10 @@ export function relationship(value: ResourceType, isList: boolean = false): any
metaDataList.push(propertyKey);
}
relationshipMap.set(target.constructor, metaDataList);
-
- return Reflect.metadata(relationshipKey, { resourceType: value, isList }).apply(this, arguments);
+ return Reflect.metadata(relationshipKey, {
+ resourceType: (value as any).type.value,
+ isList
+ }).apply(this, arguments);
};
}
diff --git a/src/app/core/cache/builders/normalized-object-build.service.ts b/src/app/core/cache/builders/normalized-object-build.service.ts
index 79665fec3d..936548cdd4 100644
--- a/src/app/core/cache/builders/normalized-object-build.service.ts
+++ b/src/app/core/cache/builders/normalized-object-build.service.ts
@@ -1,9 +1,8 @@
import { Injectable } from '@angular/core';
import { NormalizedObject } from '../models/normalized-object.model';
-import { CacheableObject } from '../object-cache.reducer';
-import { getRelationships } from './build-decorators';
-import { NormalizedObjectFactory } from '../models/normalized-object-factory';
+import { getMapsToType, getRelationships } from './build-decorators';
import { hasValue, isNotEmpty } from '../../../shared/empty.util';
+import { TypedObject } from '../object-cache.reducer';
/**
* Return true if halObj has a value for `_links.self`
@@ -35,8 +34,8 @@ export class NormalizedObjectBuildService {
*
* @param {TDomain} domainModel a domain model
*/
- normalize(domainModel: T): NormalizedObject {
- const normalizedConstructor = NormalizedObjectFactory.getConstructor(domainModel.type);
+ normalize(domainModel: T): NormalizedObject {
+ const normalizedConstructor = getMapsToType((domainModel as any).type);
const relationships = getRelationships(normalizedConstructor) || [];
const normalizedModel = Object.assign({}, domainModel) as any;
diff --git a/src/app/core/cache/builders/remote-data-build.service.spec.ts b/src/app/core/cache/builders/remote-data-build.service.spec.ts
index 272969050d..2f0e024521 100644
--- a/src/app/core/cache/builders/remote-data-build.service.spec.ts
+++ b/src/app/core/cache/builders/remote-data-build.service.spec.ts
@@ -4,6 +4,7 @@ import { PaginatedList } from '../../data/paginated-list';
import { PageInfo } from '../../shared/page-info.model';
import { RemoteData } from '../../data/remote-data';
import { of as observableOf } from 'rxjs';
+import { createSuccessfulRemoteDataObject } from '../../../shared/testing/utils';
const pageInfo = new PageInfo();
const array = [
@@ -29,8 +30,8 @@ const array = [
})
];
const paginatedList = new PaginatedList(pageInfo, array);
-const arrayRD = new RemoteData(false, false, true, undefined, array);
-const paginatedListRD = new RemoteData(false, false, true, undefined, paginatedList);
+const arrayRD = createSuccessfulRemoteDataObject(array);
+const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList);
describe('RemoteDataBuildService', () => {
let service: RemoteDataBuildService;
diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts
index 67a35da8c9..c6ba704d81 100644
--- a/src/app/core/cache/builders/remote-data-build.service.ts
+++ b/src/app/core/cache/builders/remote-data-build.service.ts
@@ -21,7 +21,8 @@ import {
getRequestFromRequestUUID,
getResourceLinksFromResponse
} from '../../shared/operators';
-import { CacheableObject } from '../object-cache.reducer';
+import { CacheableObject, TypedObject } from '../object-cache.reducer';
+import { createSuccessfulRemoteDataObject$ } from '../../../shared/testing/utils';
@Injectable()
export class RemoteDataBuildService {
@@ -200,7 +201,7 @@ export class RemoteDataBuildService {
aggregate(input: Array>>): Observable> {
if (isEmpty(input)) {
- return observableOf(new RemoteData(false, false, true, null, []));
+ return createSuccessfulRemoteDataObject$([]);
}
return observableCombineLatest(...input).pipe(
diff --git a/src/app/core/cache/models/items/normalized-item-type.model.ts b/src/app/core/cache/models/items/normalized-item-type.model.ts
index ed38d80a4b..fdb3b9e455 100644
--- a/src/app/core/cache/models/items/normalized-item-type.model.ts
+++ b/src/app/core/cache/models/items/normalized-item-type.model.ts
@@ -1,6 +1,5 @@
import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
import { ItemType } from '../../../shared/item-relationships/item-type.model';
-import { ResourceType } from '../../../shared/resource-type';
import { mapsTo } from '../../builders/build-decorators';
import { NormalizedObject } from '../normalized-object.model';
import { IDToUUIDSerializer } from '../../id-to-uuid-serializer';
@@ -11,7 +10,6 @@ import { IDToUUIDSerializer } from '../../id-to-uuid-serializer';
@mapsTo(ItemType)
@inheritSerialization(NormalizedObject)
export class NormalizedItemType extends NormalizedObject {
-
/**
* The label that describes the ResourceType of the Item
*/
@@ -27,6 +25,6 @@ export class NormalizedItemType extends NormalizedObject {
/**
* The universally unique identifier of this ItemType
*/
- @autoserializeAs(new IDToUUIDSerializer(ResourceType.ItemType), 'id')
+ @autoserializeAs(new IDToUUIDSerializer(ItemType.type.value), 'id')
uuid: string;
}
diff --git a/src/app/core/cache/models/items/normalized-relationship-type.model.ts b/src/app/core/cache/models/items/normalized-relationship-type.model.ts
index d201fb2746..800b27cd7e 100644
--- a/src/app/core/cache/models/items/normalized-relationship-type.model.ts
+++ b/src/app/core/cache/models/items/normalized-relationship-type.model.ts
@@ -5,6 +5,7 @@ import { mapsTo, relationship } from '../../builders/build-decorators';
import { NormalizedDSpaceObject } from '../normalized-dspace-object.model';
import { NormalizedObject } from '../normalized-object.model';
import { IDToUUIDSerializer } from '../../id-to-uuid-serializer';
+import { ItemType } from '../../../shared/item-relationships/item-type.model';
/**
* Normalized model class for a DSpace RelationshipType
@@ -12,7 +13,6 @@ import { IDToUUIDSerializer } from '../../id-to-uuid-serializer';
@mapsTo(RelationshipType)
@inheritSerialization(NormalizedDSpaceObject)
export class NormalizedRelationshipType extends NormalizedObject {
-
/**
* The identifier of this RelationshipType
*/
@@ -59,19 +59,19 @@ export class NormalizedRelationshipType extends NormalizedObject {
* The item to the left of this relationship
*/
@autoserialize
- @relationship(ResourceType.Item, false)
+ @relationship(Item, false)
leftItem: string;
/**
* The item to the right of this relationship
*/
@autoserialize
- @relationship(ResourceType.Item, false)
+ @relationship(Item, false)
rightItem: string;
/**
@@ -48,12 +49,12 @@ export class NormalizedRelationship extends NormalizedObject {
* The type of Relationship
*/
@autoserialize
- @relationship(ResourceType.RelationshipType, false)
+ @relationship(RelationshipType, false)
relationshipType: string;
/**
* The universally unique identifier of this Relationship
*/
- @autoserializeAs(new IDToUUIDSerializer(ResourceType.Relationship), 'id')
+ @autoserializeAs(new IDToUUIDSerializer(Relationship.type.value), 'id')
uuid: string;
}
diff --git a/src/app/core/cache/models/normalized-bitstream-format.model.ts b/src/app/core/cache/models/normalized-bitstream-format.model.ts
index 994792d535..5ee135b530 100644
--- a/src/app/core/cache/models/normalized-bitstream-format.model.ts
+++ b/src/app/core/cache/models/normalized-bitstream-format.model.ts
@@ -12,7 +12,6 @@ import { SupportLevel } from './support-level.model';
@mapsTo(BitstreamFormat)
@inheritSerialization(NormalizedObject)
export class NormalizedBitstreamFormat extends NormalizedObject {
-
/**
* Short description of this Bitstream Format
*/
diff --git a/src/app/core/cache/models/normalized-bitstream.model.ts b/src/app/core/cache/models/normalized-bitstream.model.ts
index 64a17aae84..a9e389fd41 100644
--- a/src/app/core/cache/models/normalized-bitstream.model.ts
+++ b/src/app/core/cache/models/normalized-bitstream.model.ts
@@ -1,9 +1,10 @@
-import { inheritSerialization, autoserialize } from 'cerialize';
+import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedDSpaceObject } from './normalized-dspace-object.model';
import { Bitstream } from '../../shared/bitstream.model';
import { mapsTo, relationship } from '../builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
+import { Item } from '../../shared/item.model';
+import { BitstreamFormat } from '../../shared/bitstream-format.model';
/**
* Normalized model class for a DSpace Bitstream
@@ -11,7 +12,6 @@ import { ResourceType } from '../../shared/resource-type';
@mapsTo(Bitstream)
@inheritSerialization(NormalizedDSpaceObject)
export class NormalizedBitstream extends NormalizedDSpaceObject {
-
/**
* The size of this bitstream in bytes
*/
@@ -28,7 +28,7 @@ export class NormalizedBitstream extends NormalizedDSpaceObject {
* The format of this Bitstream
*/
@autoserialize
- @relationship(ResourceType.BitstreamFormat, false)
+ @relationship(BitstreamFormat, false)
format: string;
/**
@@ -41,14 +41,14 @@ export class NormalizedBitstream extends NormalizedDSpaceObject {
* An array of Bundles that are direct parents of this Bitstream
*/
@autoserialize
- @relationship(ResourceType.Item, true)
+ @relationship(Item, true)
parents: string[];
/**
* The Bundle that owns this Bitstream
*/
@autoserialize
- @relationship(ResourceType.Item, false)
+ @relationship(Item, false)
owner: string;
/**
diff --git a/src/app/core/cache/models/normalized-bundle.model.ts b/src/app/core/cache/models/normalized-bundle.model.ts
index 342b13629f..3f4e28bca5 100644
--- a/src/app/core/cache/models/normalized-bundle.model.ts
+++ b/src/app/core/cache/models/normalized-bundle.model.ts
@@ -3,7 +3,7 @@ import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedDSpaceObject } from './normalized-dspace-object.model';
import { Bundle } from '../../shared/bundle.model';
import { mapsTo, relationship } from '../builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
+import { Bitstream } from '../../shared/bitstream.model';
/**
* Normalized model class for a DSpace Bundle
@@ -15,7 +15,7 @@ export class NormalizedBundle extends NormalizedDSpaceObject {
* The primary bitstream of this Bundle
*/
@autoserialize
- @relationship(ResourceType.Bitstream, false)
+ @relationship(Bitstream, false)
primaryBitstream: string;
/**
@@ -32,7 +32,7 @@ export class NormalizedBundle extends NormalizedDSpaceObject {
* List of Bitstreams that are part of this Bundle
*/
@autoserialize
- @relationship(ResourceType.Bitstream, true)
+ @relationship(Bitstream, true)
bitstreams: string[];
}
diff --git a/src/app/core/cache/models/normalized-collection.model.ts b/src/app/core/cache/models/normalized-collection.model.ts
index ddfcc29a2c..9b3419675a 100644
--- a/src/app/core/cache/models/normalized-collection.model.ts
+++ b/src/app/core/cache/models/normalized-collection.model.ts
@@ -3,7 +3,15 @@ import { autoserialize, deserialize, inheritSerialization } from 'cerialize';
import { NormalizedDSpaceObject } from './normalized-dspace-object.model';
import { Collection } from '../../shared/collection.model';
import { mapsTo, relationship } from '../builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
+import { NormalizedResourcePolicy } from './normalized-resource-policy.model';
+import { NormalizedBitstream } from './normalized-bitstream.model';
+import { NormalizedCommunity } from './normalized-community.model';
+import { NormalizedItem } from './normalized-item.model';
+import { License } from '../../shared/license.model';
+import { ResourcePolicy } from '../../shared/resource-policy.model';
+import { Bitstream } from '../../shared/bitstream.model';
+import { Community } from '../../shared/community.model';
+import { Item } from '../../shared/item.model';
/**
* Normalized model class for a DSpace Collection
@@ -22,42 +30,42 @@ export class NormalizedCollection extends NormalizedDSpaceObject {
* The Bitstream that represents the license of this Collection
*/
@autoserialize
- @relationship(ResourceType.License, false)
+ @relationship(License, false)
license: string;
/**
* The Bitstream that represents the default Access Conditions of this Collection
*/
@autoserialize
- @relationship(ResourceType.ResourcePolicy, false)
+ @relationship(ResourcePolicy, false)
defaultAccessConditions: string;
/**
* The Bitstream that represents the logo of this Collection
*/
@deserialize
- @relationship(ResourceType.Bitstream, false)
+ @relationship(Bitstream, false)
logo: string;
/**
* An array of Communities that are direct parents of this Collection
*/
@deserialize
- @relationship(ResourceType.Community, true)
+ @relationship(Community, true)
parents: string[];
/**
* The Community that owns this Collection
*/
@deserialize
- @relationship(ResourceType.Community, false)
+ @relationship(Community, false)
owner: string;
/**
* List of Items that are part of (not necessarily owned by) this Collection
*/
@deserialize
- @relationship(ResourceType.Item, true)
+ @relationship(Item, true)
items: string[];
}
diff --git a/src/app/core/cache/models/normalized-community.model.ts b/src/app/core/cache/models/normalized-community.model.ts
index f561089949..173760ca72 100644
--- a/src/app/core/cache/models/normalized-community.model.ts
+++ b/src/app/core/cache/models/normalized-community.model.ts
@@ -1,9 +1,13 @@
-import { autoserialize, deserialize, inheritSerialization, serialize } from 'cerialize';
+import { autoserialize, deserialize, inheritSerialization } from 'cerialize';
import { NormalizedDSpaceObject } from './normalized-dspace-object.model';
import { Community } from '../../shared/community.model';
import { mapsTo, relationship } from '../builders/build-decorators';
import { ResourceType } from '../../shared/resource-type';
+import { NormalizedBitstream } from './normalized-bitstream.model';
+import { NormalizedCollection } from './normalized-collection.model';
+import { Bitstream } from '../../shared/bitstream.model';
+import { Collection } from '../../shared/collection.model';
/**
* Normalized model class for a DSpace Community
@@ -11,7 +15,6 @@ import { ResourceType } from '../../shared/resource-type';
@mapsTo(Community)
@inheritSerialization(NormalizedDSpaceObject)
export class NormalizedCommunity extends NormalizedDSpaceObject {
-
/**
* A string representing the unique handle of this Community
*/
@@ -22,32 +25,32 @@ export class NormalizedCommunity extends NormalizedDSpaceObject {
* The Bitstream that represents the logo of this Community
*/
@deserialize
- @relationship(ResourceType.Bitstream, false)
+ @relationship(Bitstream, false)
logo: string;
/**
* An array of Communities that are direct parents of this Community
*/
@deserialize
- @relationship(ResourceType.Community, true)
+ @relationship(Community, true)
parents: string[];
/**
* The Community that owns this Community
*/
@deserialize
- @relationship(ResourceType.Community, false)
+ @relationship(Community, false)
owner: string;
/**
* List of Collections that are owned by this Community
*/
@deserialize
- @relationship(ResourceType.Collection, true)
+ @relationship(Collection, true)
collections: string[];
@deserialize
- @relationship(ResourceType.Community, true)
+ @relationship(Community, true)
subcommunities: string[];
}
diff --git a/src/app/core/cache/models/normalized-dspace-object.model.ts b/src/app/core/cache/models/normalized-dspace-object.model.ts
index e12faa4a77..3c43dd85dc 100644
--- a/src/app/core/cache/models/normalized-dspace-object.model.ts
+++ b/src/app/core/cache/models/normalized-dspace-object.model.ts
@@ -1,15 +1,15 @@
-import { autoserializeAs, deserializeAs } from 'cerialize';
+import { autoserializeAs, deserializeAs, autoserialize } from 'cerialize';
import { DSpaceObject } from '../../shared/dspace-object.model';
import { MetadataMap, MetadataMapSerializer } from '../../shared/metadata.models';
-import { ResourceType } from '../../shared/resource-type';
import { mapsTo } from '../builders/build-decorators';
import { NormalizedObject } from './normalized-object.model';
+import { TypedObject } from '../object-cache.reducer';
/**
* An model class for a DSpaceObject.
*/
@mapsTo(DSpaceObject)
-export class NormalizedDSpaceObject extends NormalizedObject {
+export class NormalizedDSpaceObject extends NormalizedObject implements TypedObject {
/**
* The link to the rest endpoint where this object can be found
@@ -38,8 +38,8 @@ export class NormalizedDSpaceObject extends NormalizedOb
/**
* A string representing the kind of DSpaceObject, e.g. community, item, …
*/
- @autoserializeAs(String)
- type: ResourceType;
+ @autoserialize
+ type: string;
/**
* All metadata of this DSpaceObject
diff --git a/src/app/core/cache/models/normalized-item.model.ts b/src/app/core/cache/models/normalized-item.model.ts
index d2b7b9c92d..4afceb7612 100644
--- a/src/app/core/cache/models/normalized-item.model.ts
+++ b/src/app/core/cache/models/normalized-item.model.ts
@@ -4,6 +4,12 @@ import { NormalizedDSpaceObject } from './normalized-dspace-object.model';
import { Item } from '../../shared/item.model';
import { mapsTo, relationship } from '../builders/build-decorators';
import { ResourceType } from '../../shared/resource-type';
+import { NormalizedCollection } from './normalized-collection.model';
+import { NormalizedBitstream } from './normalized-bitstream.model';
+import { NormalizedRelationship } from './items/normalized-relationship.model';
+import { Collection } from '../../shared/collection.model';
+import { Bitstream } from '../../shared/bitstream.model';
+import { Relationship } from '../../shared/item-relationships/relationship.model';
/**
* Normalized model class for a DSpace Item
@@ -46,25 +52,25 @@ export class NormalizedItem extends NormalizedDSpaceObject- {
* An array of Collections that are direct parents of this Item
*/
@deserialize
- @relationship(ResourceType.Collection, true)
+ @relationship(Collection, true)
parents: string[];
/**
* The Collection that owns this Item
*/
@deserialize
- @relationship(ResourceType.Collection, false)
+ @relationship(Collection, false)
owningCollection: string;
/**
* List of Bitstreams that are owned by this Item
*/
@deserialize
- @relationship(ResourceType.Bitstream, true)
+ @relationship(Bitstream, true)
bitstreams: string[];
@autoserialize
- @relationship(ResourceType.Relationship, true)
+ @relationship(Relationship, true)
relationships: string[];
}
diff --git a/src/app/core/cache/models/normalized-object-factory.ts b/src/app/core/cache/models/normalized-object-factory.ts
deleted file mode 100644
index aa1f6f2958..0000000000
--- a/src/app/core/cache/models/normalized-object-factory.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { NormalizedItemType } from './items/normalized-item-type.model';
-import { NormalizedRelationshipType } from './items/normalized-relationship-type.model';
-import { NormalizedRelationship } from './items/normalized-relationship.model';
-import { NormalizedBitstream } from './normalized-bitstream.model';
-import { NormalizedBundle } from './normalized-bundle.model';
-import { NormalizedItem } from './normalized-item.model';
-import { NormalizedCollection } from './normalized-collection.model';
-import { GenericConstructor } from '../../shared/generic-constructor';
-import { NormalizedCommunity } from './normalized-community.model';
-import { ResourceType } from '../../shared/resource-type';
-import { NormalizedObject } from './normalized-object.model';
-import { NormalizedLicense } from './normalized-license.model';
-import { NormalizedResourcePolicy } from './normalized-resource-policy.model';
-import { NormalizedWorkspaceItem } from '../../submission/models/normalized-workspaceitem.model';
-import { NormalizedEPerson } from '../../eperson/models/normalized-eperson.model';
-import { NormalizedGroup } from '../../eperson/models/normalized-group.model';
-import { NormalizedWorkflowItem } from '../../submission/models/normalized-workflowitem.model';
-import { NormalizedClaimedTask } from '../../tasks/models/normalized-claimed-task-object.model';
-import { NormalizedPoolTask } from '../../tasks/models/normalized-pool-task-object.model';
-import { NormalizedBitstreamFormat } from './normalized-bitstream-format.model';
-import { NormalizedMetadataSchema } from '../../metadata/normalized-metadata-schema.model';
-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 {
- public static getConstructor(type: ResourceType): GenericConstructor> {
- switch (type) {
- case ResourceType.Bitstream: {
- return NormalizedBitstream
- }
- case ResourceType.Bundle: {
- return NormalizedBundle
- }
- case ResourceType.Item: {
- return NormalizedItem
- }
- case ResourceType.Collection: {
- return NormalizedCollection
- }
- case ResourceType.Community: {
- return NormalizedCommunity
- }
- case ResourceType.BitstreamFormat: {
- return NormalizedBitstreamFormat
- }
- case ResourceType.License: {
- return NormalizedLicense
- }
- case ResourceType.ResourcePolicy: {
- return NormalizedResourcePolicy
- }
- case ResourceType.Relationship: {
- return NormalizedRelationship
- }
- case ResourceType.RelationshipType: {
- return NormalizedRelationshipType
- }
- case ResourceType.ItemType: {
- return NormalizedItemType
- }
- case ResourceType.EPerson: {
- return NormalizedEPerson
- }
- case ResourceType.Group: {
- return NormalizedGroup
- }
- case ResourceType.MetadataSchema: {
- return NormalizedMetadataSchema
- }
- case ResourceType.MetadataField: {
- return NormalizedGroup
- }
- case ResourceType.Workspaceitem: {
- return NormalizedWorkspaceItem
- }
- case ResourceType.Workflowitem: {
- return NormalizedWorkflowItem
- }
- case ResourceType.ClaimedTask: {
- return NormalizedClaimedTask
- }
- case ResourceType.PoolTask: {
- return NormalizedPoolTask
- }
- case ResourceType.SubmissionDefinition:
- case ResourceType.SubmissionDefinitions: {
- return NormalizedSubmissionDefinitionsModel
- }
- case ResourceType.SubmissionForm:
- case ResourceType.SubmissionForms: {
- return NormalizedSubmissionFormsModel
- }
- case ResourceType.SubmissionSection:
- case ResourceType.SubmissionSections: {
- return NormalizedSubmissionSectionModel
- }
- default: {
- return undefined;
- }
- }
- }
-}
diff --git a/src/app/core/cache/models/normalized-object.model.ts b/src/app/core/cache/models/normalized-object.model.ts
index 6ac8985d64..bb5f192a7a 100644
--- a/src/app/core/cache/models/normalized-object.model.ts
+++ b/src/app/core/cache/models/normalized-object.model.ts
@@ -1,25 +1,24 @@
-import { CacheableObject } from '../object-cache.reducer';
+import { CacheableObject, TypedObject } from '../object-cache.reducer';
import { autoserialize } from 'cerialize';
import { ResourceType } from '../../shared/resource-type';
/**
* An abstract model class for a NormalizedObject.
*/
-export abstract class NormalizedObject implements CacheableObject {
-
+export abstract class NormalizedObject implements CacheableObject {
/**
* The link to the rest endpoint where this object can be found
*/
@autoserialize
self: string;
- /**
- * A string representing the kind of DSpaceObject, e.g. community, item, …
- */
- @autoserialize
- type: ResourceType;
-
@autoserialize
_links: {
[name: string]: string
- }
+ };
+
+ /**
+ * A string representing the kind of object
+ */
+ @autoserialize
+ type: string;
}
diff --git a/src/app/core/cache/models/normalized-resource-policy.model.ts b/src/app/core/cache/models/normalized-resource-policy.model.ts
index 9438c1da0a..cd25a0af05 100644
--- a/src/app/core/cache/models/normalized-resource-policy.model.ts
+++ b/src/app/core/cache/models/normalized-resource-policy.model.ts
@@ -12,7 +12,6 @@ import { ActionType } from './action-type.model';
@mapsTo(ResourcePolicy)
@inheritSerialization(NormalizedObject)
export class NormalizedResourcePolicy extends NormalizedObject {
-
/**
* The action that is allowed by this Resource Policy
*/
diff --git a/src/app/core/cache/models/support-level.model.ts b/src/app/core/cache/models/support-level.model.ts
index 30f759d55f..103ff2c626 100644
--- a/src/app/core/cache/models/support-level.model.ts
+++ b/src/app/core/cache/models/support-level.model.ts
@@ -8,7 +8,7 @@ export enum SupportLevel {
Unknown = 0,
/**
- * Unknown for Bitstream Formats that are known to the system, but not fully supported
+ * Known for Bitstream Formats that are known to the system, but not fully supported
*/
Known = 1,
diff --git a/src/app/core/cache/object-cache.reducer.spec.ts b/src/app/core/cache/object-cache.reducer.spec.ts
index efa28d7249..a65e63ab86 100644
--- a/src/app/core/cache/object-cache.reducer.spec.ts
+++ b/src/app/core/cache/object-cache.reducer.spec.ts
@@ -9,6 +9,7 @@ import {
ResetObjectCacheTimestampsAction
} from './object-cache.actions';
import { Operation } from 'fast-json-patch';
+import { Item } from '../shared/item.model';
class NullAction extends RemoveFromObjectCacheAction {
type = null;
@@ -28,6 +29,7 @@ describe('objectCacheReducer', () => {
const testState = {
[selfLink1]: {
data: {
+ type: Item.type,
self: selfLink1,
foo: 'bar'
},
@@ -39,6 +41,7 @@ describe('objectCacheReducer', () => {
},
[selfLink2]: {
data: {
+ type: Item.type,
self: requestUUID2,
foo: 'baz'
},
@@ -67,7 +70,7 @@ describe('objectCacheReducer', () => {
it('should add the payload to the cache in response to an ADD action', () => {
const state = Object.create(null);
- const objectToCache = { self: selfLink1 };
+ const objectToCache = { self: selfLink1, type: Item.type };
const timeAdded = new Date().getTime();
const msToLive = 900000;
const requestUUID = requestUUID1;
@@ -80,7 +83,12 @@ describe('objectCacheReducer', () => {
});
it('should overwrite an object in the cache in response to an ADD action if it already exists', () => {
- const objectToCache = { self: selfLink1, foo: 'baz', somethingElse: true };
+ const objectToCache = {
+ self: selfLink1,
+ foo: 'baz',
+ somethingElse: true,
+ type: Item.type
+ };
const timeAdded = new Date().getTime();
const msToLive = 900000;
const requestUUID = requestUUID1;
@@ -95,7 +103,7 @@ describe('objectCacheReducer', () => {
it('should perform the ADD action without affecting the previous state', () => {
const state = Object.create(null);
- const objectToCache = { self: selfLink1 };
+ const objectToCache = { self: selfLink1, type: Item.type };
const timeAdded = new Date().getTime();
const msToLive = 900000;
const requestUUID = requestUUID1;
diff --git a/src/app/core/cache/object-cache.reducer.ts b/src/app/core/cache/object-cache.reducer.ts
index 982c77341e..f41151fd90 100644
--- a/src/app/core/cache/object-cache.reducer.ts
+++ b/src/app/core/cache/object-cache.reducer.ts
@@ -32,15 +32,19 @@ export interface Patch {
operations: Operation[];
}
+export abstract class TypedObject {
+ static type: ResourceType;
+}
+
+/* tslint:disable:max-classes-per-file */
/**
* An interface to represent objects that can be cached
*
* A cacheable object should have a self link
*/
-export interface CacheableObject {
+export class CacheableObject extends TypedObject {
uuid?: string;
self: string;
- type?: ResourceType;
// isNew: boolean;
// dirtyType: DirtyType;
// hasDirtyAttributes: boolean;
@@ -59,6 +63,7 @@ export class ObjectCacheEntry implements CacheEntry {
patches: Patch[] = [];
isDirty: boolean;
}
+/* tslint:enable:max-classes-per-file */
/**
* The ObjectCache State
diff --git a/src/app/core/cache/object-cache.service.spec.ts b/src/app/core/cache/object-cache.service.spec.ts
index 20e12108ad..39dc10de2c 100644
--- a/src/app/core/cache/object-cache.service.spec.ts
+++ b/src/app/core/cache/object-cache.service.spec.ts
@@ -10,13 +10,13 @@ import {
RemoveFromObjectCacheAction
} from './object-cache.actions';
import { CoreState } from '../core.reducers';
-import { ResourceType } from '../shared/resource-type';
import { NormalizedItem } from './models/normalized-item.model';
import { first } from 'rxjs/operators';
import { Operation } from 'fast-json-patch';
import { RestRequestMethod } from '../data/rest-request-method';
import { AddToSSBAction } from './server-sync-buffer.actions';
import { Patch } from './object-cache.reducer';
+import { Item } from '../shared/item.model';
describe('ObjectCacheService', () => {
let service: ObjectCacheService;
@@ -28,7 +28,7 @@ describe('ObjectCacheService', () => {
const msToLive = 900000;
let objectToCache = {
self: selfLink,
- type: ResourceType.Item
+ type: Item.type
};
let cacheEntry;
let invalidCacheEntry;
@@ -37,7 +37,7 @@ describe('ObjectCacheService', () => {
function init() {
objectToCache = {
self: selfLink,
- type: ResourceType.Item
+ type: Item.type
};
cacheEntry = {
data: objectToCache,
diff --git a/src/app/core/cache/object-cache.service.ts b/src/app/core/cache/object-cache.service.ts
index c61ed981ec..6a07b8074d 100644
--- a/src/app/core/cache/object-cache.service.ts
+++ b/src/app/core/cache/object-cache.service.ts
@@ -10,7 +10,6 @@ import { coreSelector } from '../core.selectors';
import { RestRequestMethod } from '../data/rest-request-method';
import { selfLinkFromUuidSelector } from '../index/index.selectors';
import { GenericConstructor } from '../shared/generic-constructor';
-import { NormalizedObjectFactory } from './models/normalized-object-factory';
import { NormalizedObject } from './models/normalized-object.model';
import {
AddPatchObjectCacheAction,
@@ -21,6 +20,7 @@ import {
import { CacheableObject, ObjectCacheEntry, ObjectCacheState } from './object-cache.reducer';
import { AddToSSBAction } from './server-sync-buffer.actions';
+import { getMapsToType } from './builders/build-decorators';
/**
* The base selector function to select the object cache in the store
@@ -109,7 +109,7 @@ export class ObjectCacheService {
}
),
map((entry: ObjectCacheEntry) => {
- const type: GenericConstructor> = NormalizedObjectFactory.getConstructor(entry.data.type);
+ const type: GenericConstructor> = getMapsToType((entry.data as any).type);
return Object.assign(new type(), entry.data) as NormalizedObject
})
);
diff --git a/src/app/core/cache/response.models.ts b/src/app/core/cache/response.models.ts
index 8c6ea1afe2..3915eca23f 100644
--- a/src/app/core/cache/response.models.ts
+++ b/src/app/core/cache/response.models.ts
@@ -8,12 +8,12 @@ import { IntegrationModel } from '../integration/models/integration.model';
import { RegistryMetadataschemasResponse } from '../registry/registry-metadataschemas-response.model';
import { RegistryMetadatafieldsResponse } from '../registry/registry-metadatafields-response.model';
import { RegistryBitstreamformatsResponse } from '../registry/registry-bitstreamformats-response.model';
-import { MetadataSchema } from '../metadata/metadataschema.model';
-import { MetadataField } from '../metadata/metadatafield.model';
import { PaginatedList } from '../data/paginated-list';
import { SubmissionObject } from '../submission/models/submission-object.model';
import { DSpaceObject } from '../shared/dspace-object.model';
import { NormalizedAuthStatus } from '../auth/models/normalized-auth-status.model';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
+import { MetadataField } from '../metadata/metadata-field.model';
/* tslint:disable:max-classes-per-file */
export class RestResponse {
diff --git a/src/app/core/config/config-response-parsing.service.spec.ts b/src/app/core/config/config-response-parsing.service.spec.ts
index 7c69f1bdb3..90dd1670b8 100644
--- a/src/app/core/config/config-response-parsing.service.spec.ts
+++ b/src/app/core/config/config-response-parsing.service.spec.ts
@@ -8,8 +8,8 @@ import { Store } from '@ngrx/store';
import { CoreState } from '../core.reducers';
import { PaginatedList } from '../data/paginated-list';
import { PageInfo } from '../shared/page-info.model';
-import { NormalizedSubmissionDefinitionsModel } from './models/normalized-config-submission-definitions.model';
import { NormalizedSubmissionSectionModel } from './models/normalized-config-submission-section.model';
+import { NormalizedSubmissionDefinitionModel } from './models/normalized-config-submission-definition.model';
describe('ConfigResponseParsingService', () => {
let service: ConfigResponseParsingService;
@@ -173,7 +173,7 @@ describe('ConfigResponseParsingService', () => {
self: 'https://rest.api/config/submissiondefinitions/traditional/sections'
});
const definitions =
- Object.assign(new NormalizedSubmissionDefinitionsModel(), {
+ Object.assign(new NormalizedSubmissionDefinitionModel(), {
isDefault: true,
name: 'traditional',
type: 'submissiondefinition',
diff --git a/src/app/core/config/config-response-parsing.service.ts b/src/app/core/config/config-response-parsing.service.ts
index b81dc07624..08fe581406 100644
--- a/src/app/core/config/config-response-parsing.service.ts
+++ b/src/app/core/config/config-response-parsing.service.ts
@@ -5,10 +5,8 @@ import { RestRequest } from '../data/request.models';
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
import { ConfigSuccessResponse, ErrorResponse, RestResponse } from '../cache/response.models';
import { isNotEmpty } from '../../shared/empty.util';
-import { ConfigObjectFactory } from './models/config-object-factory';
import { ConfigObject } from './models/config.model';
-import { ConfigType } from './models/config-type';
import { BaseResponseParsingService } from '../data/base-response-parsing.service';
import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface';
@@ -16,8 +14,6 @@ import { ObjectCacheService } from '../cache/object-cache.service';
@Injectable()
export class ConfigResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-
- protected objectFactory = ConfigObjectFactory;
protected toCache = false;
constructor(
@@ -28,7 +24,7 @@ export class ConfigResponseParsingService extends BaseResponseParsingService imp
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 201 || data.statusCode === 200)) {
- const configDefinition = this.process(data.payload, request.uuid);
+ const configDefinition = this.process(data.payload, request.uuid);
return new ConfigSuccessResponse(configDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else {
return new ErrorResponse(
diff --git a/src/app/core/config/models/config-object-factory.ts b/src/app/core/config/models/config-object-factory.ts
deleted file mode 100644
index 44b2e377c4..0000000000
--- a/src/app/core/config/models/config-object-factory.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { GenericConstructor } from '../../shared/generic-constructor';
-import { ConfigType } from './config-type';
-import { ConfigObject } from './config.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';
-
-/**
- * Class to return normalized models for config objects
- */
-export class ConfigObjectFactory {
- public static getConstructor(type): GenericConstructor {
- switch (type) {
- case ConfigType.SubmissionDefinition:
- case ConfigType.SubmissionDefinitions: {
- return NormalizedSubmissionDefinitionsModel
- }
- case ConfigType.SubmissionForm:
- case ConfigType.SubmissionForms: {
- return NormalizedSubmissionFormsModel
- }
- case ConfigType.SubmissionSection:
- case ConfigType.SubmissionSections: {
- return NormalizedSubmissionSectionModel
- }
- case ConfigType.SubmissionUpload:
- case ConfigType.SubmissionUploads: {
- return NormalizedSubmissionUploadsModel
- }
- default: {
- return undefined;
- }
- }
- }
-}
diff --git a/src/app/core/config/models/config-submission-definition.model.ts b/src/app/core/config/models/config-submission-definition.model.ts
new file mode 100644
index 0000000000..0449e6a964
--- /dev/null
+++ b/src/app/core/config/models/config-submission-definition.model.ts
@@ -0,0 +1,22 @@
+import { ConfigObject } from './config.model';
+import { SubmissionSectionModel } from './config-submission-section.model';
+import { PaginatedList } from '../../data/paginated-list';
+import { ResourceType } from '../../shared/resource-type';
+
+/**
+ * Class for the configuration describing the submission
+ */
+export class SubmissionDefinitionModel extends ConfigObject {
+ static type = new ResourceType('submissiondefinition');
+
+ /**
+ * A boolean representing if this submission definition is the default or not
+ */
+ isDefault: boolean;
+
+ /**
+ * A list of SubmissionSectionModel that are present in this submission definition
+ */
+ sections: PaginatedList;
+
+}
diff --git a/src/app/core/config/models/config-submission-definitions.model.ts b/src/app/core/config/models/config-submission-definitions.model.ts
index 8bbbc90056..d9892f542f 100644
--- a/src/app/core/config/models/config-submission-definitions.model.ts
+++ b/src/app/core/config/models/config-submission-definitions.model.ts
@@ -1,17 +1,7 @@
-import { ConfigObject } from './config.model';
-import { SubmissionSectionModel } from './config-submission-section.model';
-import { PaginatedList } from '../../data/paginated-list';
+import { SubmissionDefinitionModel } from './config-submission-definition.model';
+import { ResourceType } from '../../shared/resource-type';
-export class SubmissionDefinitionsModel extends ConfigObject {
-
- /**
- * A boolean representing if this submission definition is the default or not
- */
- isDefault: boolean;
-
- /**
- * A list of SubmissionSectionModel that are present in this submission definition
- */
- sections: PaginatedList;
+export class SubmissionDefinitionsModel extends SubmissionDefinitionModel {
+ static type = new ResourceType('submissiondefinitions');
}
diff --git a/src/app/core/config/models/config-submission-form.model.ts b/src/app/core/config/models/config-submission-form.model.ts
new file mode 100644
index 0000000000..a65d285c95
--- /dev/null
+++ b/src/app/core/config/models/config-submission-form.model.ts
@@ -0,0 +1,22 @@
+import { ConfigObject } from './config.model';
+import { FormFieldModel } from '../../../shared/form/builder/models/form-field.model';
+import { ResourceType } from '../../shared/resource-type';
+
+/**
+ * An interface that define a form row and its properties.
+ */
+export interface FormRowModel {
+ fields: FormFieldModel[];
+}
+
+/**
+ * A model class for a NormalizedObject.
+ */
+export class SubmissionFormModel extends ConfigObject {
+ static type = new ResourceType('submissionform');
+
+ /**
+ * An array of [FormRowModel] that are present in this form
+ */
+ rows: FormRowModel[];
+}
diff --git a/src/app/core/config/models/config-submission-forms.model.ts b/src/app/core/config/models/config-submission-forms.model.ts
index ee0962f0e9..017d7d68cc 100644
--- a/src/app/core/config/models/config-submission-forms.model.ts
+++ b/src/app/core/config/models/config-submission-forms.model.ts
@@ -1,20 +1,9 @@
-import { ConfigObject } from './config.model';
-import { FormFieldModel } from '../../../shared/form/builder/models/form-field.model';
-
-/**
- * An interface that define a form row and its properties.
- */
-export interface FormRowModel {
- fields: FormFieldModel[];
-}
+import { SubmissionFormModel } from './config-submission-form.model';
+import { ResourceType } from '../../shared/resource-type';
/**
* A model class for a NormalizedObject.
*/
-export class SubmissionFormsModel extends ConfigObject {
-
- /**
- * An array of [FormRowModel] that are present in this form
- */
- rows: FormRowModel[];
+export class SubmissionFormsModel extends SubmissionFormModel {
+ static type = new ResourceType('submissionforms');
}
diff --git a/src/app/core/config/models/config-submission-section.model.ts b/src/app/core/config/models/config-submission-section.model.ts
index 377a8869e1..4c560fa631 100644
--- a/src/app/core/config/models/config-submission-section.model.ts
+++ b/src/app/core/config/models/config-submission-section.model.ts
@@ -1,5 +1,6 @@
import { ConfigObject } from './config.model';
import { SectionsType } from '../../../submission/sections/sections-type';
+import { ResourceType } from '../../shared/resource-type';
/**
* An interface that define section visibility and its properties.
@@ -10,6 +11,7 @@ export interface SubmissionSectionVisibility {
}
export class SubmissionSectionModel extends ConfigObject {
+ static type = new ResourceType('submissionsection');
/**
* The header for this section
diff --git a/src/app/core/config/models/config-submission-sections.model.ts b/src/app/core/config/models/config-submission-sections.model.ts
new file mode 100644
index 0000000000..ae7b133391
--- /dev/null
+++ b/src/app/core/config/models/config-submission-sections.model.ts
@@ -0,0 +1,6 @@
+import { SubmissionSectionModel } from './config-submission-section.model';
+import { ResourceType } from '../../shared/resource-type';
+
+export class SubmissionSectionsModel extends SubmissionSectionModel {
+ static type = new ResourceType('submissionsections');
+}
diff --git a/src/app/core/config/models/config-submission-uploads.model.ts b/src/app/core/config/models/config-submission-uploads.model.ts
index 8bb9ba7f1e..812a590041 100644
--- a/src/app/core/config/models/config-submission-uploads.model.ts
+++ b/src/app/core/config/models/config-submission-uploads.model.ts
@@ -1,9 +1,10 @@
import { ConfigObject } from './config.model';
import { AccessConditionOption } from './config-access-condition-option.model';
import { SubmissionFormsModel } from './config-submission-forms.model';
+import { ResourceType } from '../../shared/resource-type';
export class SubmissionUploadsModel extends ConfigObject {
-
+ static type = new ResourceType('submissionupload');
/**
* A list of available bitstream access conditions
*/
diff --git a/src/app/core/config/models/config.model.ts b/src/app/core/config/models/config.model.ts
index 81f20a0b3c..20d67ec69d 100644
--- a/src/app/core/config/models/config.model.ts
+++ b/src/app/core/config/models/config.model.ts
@@ -8,11 +8,6 @@ export abstract class ConfigObject implements CacheableObject {
*/
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.
*/
diff --git a/src/app/core/config/models/normalized-config-submission-definition.model.ts b/src/app/core/config/models/normalized-config-submission-definition.model.ts
new file mode 100644
index 0000000000..cb56e01acf
--- /dev/null
+++ b/src/app/core/config/models/normalized-config-submission-definition.model.ts
@@ -0,0 +1,28 @@
+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';
+import { mapsTo } from '../../cache/builders/build-decorators';
+import { SubmissionDefinitionModel } from './config-submission-definition.model';
+
+/**
+ * Normalized class for the configuration describing the submission
+ */
+@mapsTo(SubmissionDefinitionModel)
+@inheritSerialization(NormalizedConfigObject)
+export class NormalizedSubmissionDefinitionModel extends NormalizedConfigObject {
+
+ /**
+ * 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;
+
+}
diff --git a/src/app/core/config/models/normalized-config-submission-definitions.model.ts b/src/app/core/config/models/normalized-config-submission-definitions.model.ts
index 3887c566c1..4c52d96458 100644
--- a/src/app/core/config/models/normalized-config-submission-definitions.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-definitions.model.ts
@@ -1,25 +1,13 @@
-import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
-import { SubmissionSectionModel } from './config-submission-section.model';
-import { PaginatedList } from '../../data/paginated-list';
+import { inheritSerialization } from 'cerialize';
import { NormalizedConfigObject } from './normalized-config.model';
import { SubmissionDefinitionsModel } from './config-submission-definitions.model';
+import { mapsTo } from '../../cache/builders/build-decorators';
+import { NormalizedSubmissionDefinitionModel } from './normalized-config-submission-definition.model';
/**
* Normalized class for the configuration describing the submission
*/
+@mapsTo(SubmissionDefinitionsModel)
@inheritSerialization(NormalizedConfigObject)
-export class NormalizedSubmissionDefinitionsModel extends NormalizedConfigObject {
-
- /**
- * 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;
-
+export class NormalizedSubmissionDefinitionsModel extends NormalizedSubmissionDefinitionModel {
}
diff --git a/src/app/core/config/models/normalized-config-submission-form.model.ts b/src/app/core/config/models/normalized-config-submission-form.model.ts
new file mode 100644
index 0000000000..afdfef4818
--- /dev/null
+++ b/src/app/core/config/models/normalized-config-submission-form.model.ts
@@ -0,0 +1,18 @@
+import { autoserialize, inheritSerialization } from 'cerialize';
+import { NormalizedConfigObject } from './normalized-config.model';
+import { mapsTo } from '../../cache/builders/build-decorators';
+import { FormRowModel, SubmissionFormModel } from './config-submission-form.model';
+
+/**
+ * Normalized class for the configuration describing the submission form
+ */
+@mapsTo(SubmissionFormModel)
+@inheritSerialization(NormalizedConfigObject)
+export class NormalizedSubmissionFormModel extends NormalizedConfigObject {
+
+ /**
+ * An array of [FormRowModel] that are present in this form
+ */
+ @autoserialize
+ rows: FormRowModel[];
+}
diff --git a/src/app/core/config/models/normalized-config-submission-forms.model.ts b/src/app/core/config/models/normalized-config-submission-forms.model.ts
index a957e8c7fa..c040a94587 100644
--- a/src/app/core/config/models/normalized-config-submission-forms.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-forms.model.ts
@@ -1,16 +1,12 @@
-import { autoserialize, inheritSerialization } from 'cerialize';
-import { NormalizedConfigObject } from './normalized-config.model';
-import { FormRowModel, SubmissionFormsModel } from './config-submission-forms.model';
+import { inheritSerialization } from 'cerialize';
+import { mapsTo } from '../../cache/builders/build-decorators';
+import { SubmissionFormsModel } from './config-submission-forms.model';
+import { NormalizedSubmissionFormModel } from './normalized-config-submission-form.model';
/**
* Normalized class for the configuration describing the submission form
*/
-@inheritSerialization(NormalizedConfigObject)
-export class NormalizedSubmissionFormsModel extends NormalizedConfigObject {
-
- /**
- * An array of [FormRowModel] that are present in this form
- */
- @autoserialize
- rows: FormRowModel[];
+@mapsTo(SubmissionFormsModel)
+@inheritSerialization(NormalizedSubmissionFormModel)
+export class NormalizedSubmissionFormsModel extends NormalizedSubmissionFormModel {
}
diff --git a/src/app/core/config/models/normalized-config-submission-section.model.ts b/src/app/core/config/models/normalized-config-submission-section.model.ts
index c876acf607..364a981060 100644
--- a/src/app/core/config/models/normalized-config-submission-section.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-section.model.ts
@@ -1,14 +1,18 @@
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';
+import {
+ SubmissionSectionModel,
+ SubmissionSectionVisibility
+} from './config-submission-section.model';
+import { mapsTo } from '../../cache/builders/build-decorators';
/**
* Normalized class for the configuration describing the submission section
*/
+@mapsTo(SubmissionSectionModel)
@inheritSerialization(NormalizedConfigObject)
-export class NormalizedSubmissionSectionModel extends NormalizedConfigObject {
+export class NormalizedSubmissionSectionModel extends NormalizedConfigObject {
/**
* The header for this section
diff --git a/src/app/core/config/models/normalized-config-submission-sections.model.ts b/src/app/core/config/models/normalized-config-submission-sections.model.ts
new file mode 100644
index 0000000000..fb1e4c671a
--- /dev/null
+++ b/src/app/core/config/models/normalized-config-submission-sections.model.ts
@@ -0,0 +1,18 @@
+import { autoserialize, inheritSerialization } from 'cerialize';
+import { SectionsType } from '../../../submission/sections/sections-type';
+import { NormalizedConfigObject } from './normalized-config.model';
+import {
+ SubmissionSectionModel,
+ SubmissionSectionVisibility
+} from './config-submission-section.model';
+import { mapsTo } from '../../cache/builders/build-decorators';
+import { SubmissionSectionsModel } from './config-submission-sections.model';
+import { NormalizedSubmissionSectionModel } from './normalized-config-submission-section.model';
+
+/**
+ * Normalized class for the configuration describing the submission section
+ */
+@mapsTo(SubmissionSectionsModel)
+@inheritSerialization(NormalizedSubmissionSectionModel)
+export class NormalizedSubmissionSectionsModel extends NormalizedSubmissionSectionModel {
+}
diff --git a/src/app/core/config/models/normalized-config-submission-uploads.model.ts b/src/app/core/config/models/normalized-config-submission-uploads.model.ts
index e49171d6a7..7a21c15912 100644
--- a/src/app/core/config/models/normalized-config-submission-uploads.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-uploads.model.ts
@@ -3,10 +3,12 @@ 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';
+import { mapsTo } from '../../cache/builders/build-decorators';
/**
* Normalized class for the configuration describing the submission upload section
*/
+@mapsTo(SubmissionUploadsModel)
@inheritSerialization(NormalizedConfigObject)
export class NormalizedSubmissionUploadsModel extends NormalizedConfigObject {
diff --git a/src/app/core/config/models/normalized-config.model.ts b/src/app/core/config/models/normalized-config.model.ts
index 0b75158588..1bf4ffb826 100644
--- a/src/app/core/config/models/normalized-config.model.ts
+++ b/src/app/core/config/models/normalized-config.model.ts
@@ -1,6 +1,6 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedObject } from '../../cache/models/normalized-object.model';
-import { CacheableObject } from '../../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../../cache/object-cache.reducer';
import { ResourceType } from '../../shared/resource-type';
/**
@@ -15,12 +15,6 @@ export abstract class NormalizedConfigObject implemen
@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.
*/
diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts
index 53c719997a..9c4620d72e 100644
--- a/src/app/core/core.module.ts
+++ b/src/app/core/core.module.ts
@@ -64,7 +64,7 @@ import { RegistryService } from './registry/registry.service';
import { RegistryMetadataschemasResponseParsingService } from './data/registry-metadataschemas-response-parsing.service';
import { RegistryMetadatafieldsResponseParsingService } from './data/registry-metadatafields-response-parsing.service';
import { RegistryBitstreamformatsResponseParsingService } from './data/registry-bitstreamformats-response-parsing.service';
-import { WorkflowitemDataService } from './submission/workflowitem-data.service';
+import { WorkflowItemDataService } from './submission/workflowitem-data.service';
import { NotificationsService } from '../shared/notifications/notifications.service';
import { UploaderService } from '../shared/uploader/uploader.service';
import { FileService } from './shared/file.service';
@@ -82,19 +82,50 @@ import { ObjectUpdatesService } from './data/object-updates/object-updates.servi
import { DefaultChangeAnalyzer } from './data/default-change-analyzer.service';
import { SearchService } from './shared/search/search.service';
import { RelationshipService } from './data/relationship.service';
+import { NormalizedCollection } from './cache/models/normalized-collection.model';
+import { NormalizedCommunity } from './cache/models/normalized-community.model';
+import { NormalizedDSpaceObject } from './cache/models/normalized-dspace-object.model';
+import { NormalizedBitstream } from './cache/models/normalized-bitstream.model';
+import { NormalizedBundle } from './cache/models/normalized-bundle.model';
+import { NormalizedBitstreamFormat } from './cache/models/normalized-bitstream-format.model';
+import { NormalizedItem } from './cache/models/normalized-item.model';
+import { NormalizedEPerson } from './eperson/models/normalized-eperson.model';
+import { NormalizedGroup } from './eperson/models/normalized-group.model';
+import { NormalizedResourcePolicy } from './cache/models/normalized-resource-policy.model';
+import { NormalizedMetadataSchema } from './metadata/normalized-metadata-schema.model';
+import { NormalizedMetadataField } from './metadata/normalized-metadata-field.model';
+import { NormalizedLicense } from './cache/models/normalized-license.model';
+import { NormalizedWorkflowItem } from './submission/models/normalized-workflowitem.model';
+import { NormalizedWorkspaceItem } from './submission/models/normalized-workspaceitem.model';
+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';
+import { NormalizedAuthStatus } from './auth/models/normalized-auth-status.model';
+import { NormalizedAuthorityValue } from './integration/models/normalized-authority-value.model';
import { RoleService } from './roles/role.service';
import { MyDSpaceGuard } from '../+my-dspace-page/my-dspace.guard';
import { MyDSpaceResponseParsingService } from './data/mydspace-response-parsing.service';
import { ClaimedTaskDataService } from './tasks/claimed-task-data.service';
import { PoolTaskDataService } from './tasks/pool-task-data.service';
import { TaskResponseParsingService } from './tasks/task-response-parsing.service';
+import { NormalizedClaimedTask } from './tasks/models/normalized-claimed-task-object.model';
+import { NormalizedTaskObject } from './tasks/models/normalized-task-object.model';
+import { NormalizedPoolTask } from './tasks/models/normalized-pool-task-object.model';
+import { NormalizedRelationship } from './cache/models/items/normalized-relationship.model';
+import { NormalizedRelationshipType } from './cache/models/items/normalized-relationship-type.model';
+import { NormalizedItemType } from './cache/models/items/normalized-item-type.model';
+import { MetadatafieldParsingService } from './data/metadatafield-parsing.service';
+import { NormalizedSubmissionUploadsModel } from './config/models/normalized-config-submission-uploads.model';
+import { NormalizedBrowseEntry } from './shared/normalized-browse-entry.model';
+import { BrowseDefinition } from './shared/browse-definition.model';
+
import {
MOCK_RESPONSE_MAP,
MockResponseMap,
mockResponseMap
} from './dspace-rest-v2/mocks/mock-response-map';
import { EndpointMockingRestService } from './dspace-rest-v2/endpoint-mocking-rest.service';
-import { GLOBAL_CONFIG, GlobalConfig } from '../../config';
+import { ENV_CONFIG, GLOBAL_CONFIG, GlobalConfig } from '../../config';
import { SearchSidebarService } from './shared/search/search-sidebar.service';
import { SearchFilterService } from './shared/search/search-filter.service';
import { SearchConfigurationService } from './shared/search/search-configuration.service';
@@ -102,11 +133,11 @@ import { SelectableListService } from '../shared/object-list/selectable-list/sel
import { RelationshipTypeService } from './data/relationship-type.service';
export const restServiceFactory = (cfg: GlobalConfig, mocks: MockResponseMap, http: HttpClient) => {
- // if (ENV_CONFIG.production) {
- // return new DSpaceRESTv2Service(http);
- // } else {
+ if (ENV_CONFIG.production) {
+ return new DSpaceRESTv2Service(http);
+ } else {
return new EndpointMockingRestService(cfg, mocks, http);
- // }
+ }
};
const IMPORTS = [
@@ -115,13 +146,9 @@ const IMPORTS = [
EffectsModule.forFeature(coreEffects)
];
-const DECLARATIONS = [
+const DECLARATIONS = [];
-];
-
-const EXPORTS = [
-
-];
+const EXPORTS = [];
const PROVIDERS = [
ApiService,
@@ -179,11 +206,12 @@ const PROVIDERS = [
AuthorityService,
IntegrationResponseParsingService,
MetadataschemaParsingService,
+ MetadatafieldParsingService,
UploaderService,
UUIDService,
NotificationsService,
WorkspaceitemDataService,
- WorkflowitemDataService,
+ WorkflowItemDataService,
UploaderService,
FileService,
DSpaceObjectDataService,
@@ -217,6 +245,42 @@ const PROVIDERS = [
{ provide: NativeWindowService, useFactory: NativeWindowFactory }
];
+/**
+ * Declaration needed to make sure all decorator functions are called in time
+ */
+export const normalizedModels =
+ [
+ NormalizedDSpaceObject,
+ NormalizedBundle,
+ NormalizedBitstream,
+ NormalizedBitstreamFormat,
+ NormalizedItem,
+ NormalizedCollection,
+ NormalizedCommunity,
+ NormalizedEPerson,
+ NormalizedGroup,
+ NormalizedResourcePolicy,
+ NormalizedMetadataSchema,
+ NormalizedMetadataField,
+ NormalizedLicense,
+ NormalizedWorkflowItem,
+ NormalizedWorkspaceItem,
+ NormalizedSubmissionDefinitionsModel,
+ NormalizedSubmissionFormsModel,
+ NormalizedSubmissionSectionModel,
+ NormalizedSubmissionUploadsModel,
+ NormalizedAuthStatus,
+ NormalizedAuthorityValue,
+ NormalizedBrowseEntry,
+ BrowseDefinition,
+ NormalizedClaimedTask,
+ NormalizedTaskObject,
+ NormalizedPoolTask,
+ NormalizedRelationship,
+ NormalizedRelationshipType,
+ NormalizedItemType
+ ];
+
@NgModule({
imports: [
...IMPORTS
@@ -231,8 +295,8 @@ const PROVIDERS = [
...PROVIDERS
]
})
-export class CoreModule {
+export class CoreModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: CoreModule,
@@ -242,10 +306,9 @@ export class CoreModule {
};
}
- constructor( @Optional() @SkipSelf() parentModule: CoreModule) {
+ constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
if (isNotEmpty(parentModule)) {
throw new Error('CoreModule is already loaded. Import it in the AppModule only');
}
}
-
}
diff --git a/src/app/core/data/base-response-parsing.service.ts b/src/app/core/data/base-response-parsing.service.ts
index 0929b057db..c9866c6adf 100644
--- a/src/app/core/data/base-response-parsing.service.ts
+++ b/src/app/core/data/base-response-parsing.service.ts
@@ -7,16 +7,16 @@ import { GlobalConfig } from '../../../config/global-config.interface';
import { GenericConstructor } from '../shared/generic-constructor';
import { PaginatedList } from './paginated-list';
import { isRestDataObject, isRestPaginatedList } from '../cache/builders/normalized-object-build.service';
-
+import { ResourceType } from '../shared/resource-type';
+import { getMapsToType } from '../cache/builders/build-decorators';
/* tslint:disable:max-classes-per-file */
export abstract class BaseResponseParsingService {
protected abstract EnvConfig: GlobalConfig;
protected abstract objectCache: ObjectCacheService;
- protected abstract objectFactory: any;
protected abstract toCache: boolean;
- protected process(data: any, requestUUID: string): any {
+ protected process(data: any, requestUUID: string): any {
if (isNotEmpty(data)) {
if (hasNoValue(data) || (typeof data !== 'object')) {
return data;
@@ -31,7 +31,7 @@ export abstract class BaseResponseParsingService {
.keys(data._embedded)
.filter((property) => data._embedded.hasOwnProperty(property))
.forEach((property) => {
- const parsedObj = this.process(data._embedded[property], requestUUID);
+ const parsedObj = this.process(data._embedded[property], requestUUID);
if (isNotEmpty(parsedObj)) {
if (isRestPaginatedList(data._embedded[property])) {
object[property] = parsedObj;
@@ -59,7 +59,7 @@ export abstract class BaseResponseParsingService {
}
}
- protected processPaginatedList(data: any, requestUUID: string): PaginatedList {
+ protected processPaginatedList(data: any, requestUUID: string): PaginatedList {
const pageInfo: PageInfo = this.processPageInfo(data);
let list = data._embedded;
@@ -73,7 +73,7 @@ export abstract class BaseResponseParsingService {
return new PaginatedList(pageInfo, page, );
}
- protected processArray(data: any, requestUUID: string): ObjectDomain[] {
+ protected processArray(data: any, requestUUID: string): ObjectDomain[] {
let array: ObjectDomain[] = [];
data.forEach((datum) => {
array = [...array, this.process(datum, requestUUID)];
@@ -82,10 +82,10 @@ export abstract class BaseResponseParsingService {
return array;
}
- protected deserialize(obj): any {
- const type: ObjectType = obj.type;
+ protected deserialize(obj): any {
+ const type: string = obj.type;
if (hasValue(type)) {
- const normObjConstructor = this.objectFactory.getConstructor(type) as GenericConstructor;
+ const normObjConstructor = getMapsToType(type) as GenericConstructor;
if (hasValue(normObjConstructor)) {
const serializer = new DSpaceRESTv2Serializer(normObjConstructor);
@@ -103,7 +103,7 @@ export abstract class BaseResponseParsingService {
}
}
- protected cache(obj, requestUUID) {
+ protected cache(obj, requestUUID) {
if (this.toCache) {
this.addToObjectCache(obj, requestUUID);
}
diff --git a/src/app/core/data/browse-entries-response-parsing.service.ts b/src/app/core/data/browse-entries-response-parsing.service.ts
index 4690d738ed..a2f5f21312 100644
--- a/src/app/core/data/browse-entries-response-parsing.service.ts
+++ b/src/app/core/data/browse-entries-response-parsing.service.ts
@@ -3,24 +3,17 @@ import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface';
import { isNotEmpty } from '../../shared/empty.util';
import { ObjectCacheService } from '../cache/object-cache.service';
-import {
- ErrorResponse,
- GenericSuccessResponse,
- RestResponse
-} from '../cache/response.models';
+import { ErrorResponse, GenericSuccessResponse, RestResponse } from '../cache/response.models';
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer';
-import { BrowseEntry } from '../shared/browse-entry.model';
import { BaseResponseParsingService } from './base-response-parsing.service';
import { ResponseParsingService } from './parsing.service';
import { RestRequest } from './request.models';
+import { NormalizedBrowseEntry } from '../shared/normalized-browse-entry.model';
@Injectable()
export class BrowseEntriesResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- protected objectFactory = {
- getConstructor: () => BrowseEntry
- };
protected toCache = false;
constructor(
@@ -33,7 +26,7 @@ export class BrowseEntriesResponseParsingService extends BaseResponseParsingServ
if (isNotEmpty(data.payload)) {
let browseEntries = [];
if (isNotEmpty(data.payload._embedded) && Array.isArray(data.payload._embedded[Object.keys(data.payload._embedded)[0]])) {
- const serializer = new DSpaceRESTv2Serializer(BrowseEntry);
+ const serializer = new DSpaceRESTv2Serializer(NormalizedBrowseEntry);
browseEntries = serializer.deserializeArray(data.payload._embedded[Object.keys(data.payload._embedded)[0]]);
}
return new GenericSuccessResponse(browseEntries, data.statusCode, data.statusText, this.processPageInfo(data.payload));
diff --git a/src/app/core/data/browse-items-response-parsing-service.ts b/src/app/core/data/browse-items-response-parsing-service.ts
index fb950f6c68..324b36199a 100644
--- a/src/app/core/data/browse-items-response-parsing-service.ts
+++ b/src/app/core/data/browse-items-response-parsing-service.ts
@@ -18,10 +18,6 @@ import { NormalizedDSpaceObject } from '../cache/models/normalized-dspace-object
*/
@Injectable()
export class BrowseItemsResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-
- protected objectFactory = {
- getConstructor: () => DSpaceObject
- };
protected toCache = false;
constructor(
diff --git a/src/app/core/data/browse-response-parsing.service.spec.ts b/src/app/core/data/browse-response-parsing.service.spec.ts
index c1b0566e0b..8d0fe7cd41 100644
--- a/src/app/core/data/browse-response-parsing.service.spec.ts
+++ b/src/app/core/data/browse-response-parsing.service.spec.ts
@@ -113,7 +113,6 @@ describe('BrowseResponseParsingService', () => {
}
],
defaultSortOrder: 'ASC',
- type: 'browse',
metadataKeys: [
'dc.date.issued'
],
@@ -139,7 +138,6 @@ describe('BrowseResponseParsingService', () => {
}
],
defaultSortOrder: 'ASC',
- type: 'browse',
metadataKeys: [
'dc.contributor.*',
'dc.creator'
@@ -173,6 +171,5 @@ describe('BrowseResponseParsingService', () => {
const response = service.parse(validRequest, validResponse);
expect((response as GenericSuccessResponse).payload).toEqual(definitions);
});
-
});
});
diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts
index fc4da69a5c..ad0db51980 100644
--- a/src/app/core/data/data.service.ts
+++ b/src/app/core/data/data.service.ts
@@ -31,12 +31,12 @@ import { configureRequest, getResponseFromEntry } from '../shared/operators';
import { ErrorResponse, RestResponse } from '../cache/response.models';
import { NotificationOptions } from '../../shared/notifications/models/notification-options.model';
import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
import { CacheableObject } from '../cache/object-cache.reducer';
import { RequestEntry } from './request.reducer';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { ChangeAnalyzer } from './change-analyzer';
import { RestRequestMethod } from './rest-request-method';
+import { getMapsToType } from '../cache/builders/build-decorators';
export abstract class DataService {
protected abstract requestService: RequestService;
@@ -243,7 +243,7 @@ export abstract class DataService {
);
const normalizedObject: NormalizedObject = this.dataBuildService.normalize(dso);
- const serializedDso = new DSpaceRESTv2Serializer(NormalizedObjectFactory.getConstructor(dso.type)).serialize(normalizedObject);
+ const serializedDso = new DSpaceRESTv2Serializer(getMapsToType((dso as any).type)).serialize(normalizedObject);
const request$ = endpoint$.pipe(
take(1),
diff --git a/src/app/core/data/dso-response-parsing.service.ts b/src/app/core/data/dso-response-parsing.service.ts
index eb95cdae8a..d6c3b2caa6 100644
--- a/src/app/core/data/dso-response-parsing.service.ts
+++ b/src/app/core/data/dso-response-parsing.service.ts
@@ -4,8 +4,6 @@ import { ObjectCacheService } from '../cache/object-cache.service';
import { GlobalConfig } from '../../../config/global-config.interface';
import { GLOBAL_CONFIG } from '../../../config';
import { NormalizedObject } from '../cache/models/normalized-object.model';
-import { ResourceType } from '../shared/resource-type';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
import { RestResponse, DSOSuccessResponse } from '../cache/response.models';
import { RestRequest } from './request.models';
@@ -17,8 +15,6 @@ import { DSpaceObject } from '../shared/dspace-object.model';
@Injectable()
export class DSOResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-
- protected objectFactory = NormalizedObjectFactory;
protected toCache = true;
constructor(
@@ -34,7 +30,7 @@ export class DSOResponseParsingService extends BaseResponseParsingService implem
if (hasValue(data.payload) && hasValue(data.payload.page) && data.payload.page.totalElements === 0) {
processRequestDTO = { page: [] };
} else {
- processRequestDTO = this.process, ResourceType>(data.payload, request.uuid);
+ processRequestDTO = this.process>(data.payload, request.uuid);
}
let objectList = processRequestDTO;
diff --git a/src/app/core/data/facet-config-response-parsing.service.ts b/src/app/core/data/facet-config-response-parsing.service.ts
index ecc3d0fcc8..19b37f8b5d 100644
--- a/src/app/core/data/facet-config-response-parsing.service.ts
+++ b/src/app/core/data/facet-config-response-parsing.service.ts
@@ -15,7 +15,6 @@ import { GLOBAL_CONFIG } from '../../../config';
@Injectable()
export class FacetConfigResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- objectFactory = {};
toCache = false;
constructor(
@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
diff --git a/src/app/core/data/facet-value-map-response-parsing.service.ts b/src/app/core/data/facet-value-map-response-parsing.service.ts
index f8f36c752d..64c8e87e7d 100644
--- a/src/app/core/data/facet-value-map-response-parsing.service.ts
+++ b/src/app/core/data/facet-value-map-response-parsing.service.ts
@@ -17,7 +17,6 @@ import { GLOBAL_CONFIG } from '../../../config';
@Injectable()
export class FacetValueMapResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- objectFactory = {};
toCache = false;
constructor(
diff --git a/src/app/core/data/facet-value-response-parsing.service.ts b/src/app/core/data/facet-value-response-parsing.service.ts
index 418a58dc4f..70585bc3d9 100644
--- a/src/app/core/data/facet-value-response-parsing.service.ts
+++ b/src/app/core/data/facet-value-response-parsing.service.ts
@@ -12,7 +12,6 @@ import { GlobalConfig } from '../../../config/global-config.interface';
@Injectable()
export class FacetValueResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- objectFactory = {};
toCache = false;
constructor(
@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
diff --git a/src/app/core/data/metadata-schema-data.service.ts b/src/app/core/data/metadata-schema-data.service.ts
index 5e58d972f7..4baca6e8ed 100644
--- a/src/app/core/data/metadata-schema-data.service.ts
+++ b/src/app/core/data/metadata-schema-data.service.ts
@@ -9,12 +9,12 @@ import { RequestService } from './request.service';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { FindAllOptions } from './request.models';
import { ObjectCacheService } from '../cache/object-cache.service';
-import { MetadataSchema } from '../metadata/metadataschema.model';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { HttpClient } from '@angular/common/http';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { ChangeAnalyzer } from './change-analyzer';
import { DefaultChangeAnalyzer } from './default-change-analyzer.service';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
/* tslint:disable:max-classes-per-file */
class DataServiceImpl extends DataService {
diff --git a/src/app/core/data/metadatafield-parsing.service.ts b/src/app/core/data/metadatafield-parsing.service.ts
index f9582c394d..092285e9c5 100644
--- a/src/app/core/data/metadatafield-parsing.service.ts
+++ b/src/app/core/data/metadatafield-parsing.service.ts
@@ -3,8 +3,8 @@ import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.
import { RestRequest } from './request.models';
import { ResponseParsingService } from './parsing.service';
import { Injectable } from '@angular/core';
-import { MetadatafieldSuccessResponse, MetadataschemaSuccessResponse, RestResponse } from '../cache/response.models';
-import { MetadataField } from '../metadata/metadatafield.model';
+import { MetadatafieldSuccessResponse, RestResponse } from '../cache/response.models';
+import { MetadataField } from '../metadata/metadata-field.model';
/**
* A service responsible for parsing DSpaceRESTV2Response data related to a single MetadataField to a valid RestResponse
diff --git a/src/app/core/data/metadataschema-parsing.service.ts b/src/app/core/data/metadataschema-parsing.service.ts
index f76d6ed2e3..3e9fd257bb 100644
--- a/src/app/core/data/metadataschema-parsing.service.ts
+++ b/src/app/core/data/metadataschema-parsing.service.ts
@@ -1,10 +1,10 @@
-import { MetadataSchema } from '../metadata/metadataschema.model';
import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer';
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
import { RestRequest } from './request.models';
import { ResponseParsingService } from './parsing.service';
import { Injectable } from '@angular/core';
import { MetadataschemaSuccessResponse, RestResponse } from '../cache/response.models';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
@Injectable()
export class MetadataschemaParsingService implements ResponseParsingService {
diff --git a/src/app/core/data/request.effects.ts b/src/app/core/data/request.effects.ts
index 5e7bec698b..9ef85bfe8b 100644
--- a/src/app/core/data/request.effects.ts
+++ b/src/app/core/data/request.effects.ts
@@ -17,10 +17,10 @@ import { RequestError, RestRequest } from './request.models';
import { RequestEntry } from './request.reducer';
import { RequestService } from './request.service';
import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
import { catchError, filter, flatMap, map, take, tap } from 'rxjs/operators';
import { ErrorResponse, RestResponse } from '../cache/response.models';
import { StoreActionTypes } from '../../store.actions';
+import { getMapsToType } from '../cache/builders/build-decorators';
export const addToResponseCacheAndCompleteAction = (request: RestRequest, envConfig: GlobalConfig) =>
(source: Observable): Observable =>
@@ -45,7 +45,7 @@ export class RequestEffects {
flatMap((request: RestRequest) => {
let body;
if (isNotEmpty(request.body)) {
- const serializer = new DSpaceRESTv2Serializer(NormalizedObjectFactory.getConstructor(request.body.type));
+ const serializer = new DSpaceRESTv2Serializer(getMapsToType(request.body.type));
body = serializer.serialize(request.body);
}
return this.restApi.request(request.method, request.href, body, request.options).pipe(
diff --git a/src/app/core/eperson/eperson-response-parsing.service.ts b/src/app/core/eperson/eperson-response-parsing.service.ts
index 6c591b0b99..481f37d1fa 100644
--- a/src/app/core/eperson/eperson-response-parsing.service.ts
+++ b/src/app/core/eperson/eperson-response-parsing.service.ts
@@ -9,8 +9,6 @@ import { BaseResponseParsingService } from '../data/base-response-parsing.servic
import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface';
import { ObjectCacheService } from '../cache/object-cache.service';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
-import { ResourceType } from '../shared/resource-type';
import { DSpaceObject } from '../shared/dspace-object.model';
/**
@@ -19,7 +17,6 @@ import { DSpaceObject } from '../shared/dspace-object.model';
@Injectable()
export class EpersonResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- protected objectFactory = NormalizedObjectFactory;
protected toCache = false;
constructor(
@@ -31,7 +28,7 @@ export class EpersonResponseParsingService extends BaseResponseParsingService im
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
- const epersonDefinition = this.process(data.payload, request.href);
+ const epersonDefinition = this.process(data.payload, request.href);
return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else {
return new ErrorResponse(
diff --git a/src/app/core/eperson/models/eperson.model.ts b/src/app/core/eperson/models/eperson.model.ts
index f8c11c1201..d99a059e8b 100644
--- a/src/app/core/eperson/models/eperson.model.ts
+++ b/src/app/core/eperson/models/eperson.model.ts
@@ -4,8 +4,10 @@ import { DSpaceObject } from '../../shared/dspace-object.model';
import { Group } from './group.model';
import { RemoteData } from '../../data/remote-data';
import { PaginatedList } from '../../data/paginated-list';
+import { ResourceType } from '../../shared/resource-type';
export class EPerson extends DSpaceObject {
+ static type = new ResourceType('eperson');
/**
* A string representing the unique handle of this Collection
diff --git a/src/app/core/eperson/models/group.model.ts b/src/app/core/eperson/models/group.model.ts
index 91ce5d90f3..9c14c20de7 100644
--- a/src/app/core/eperson/models/group.model.ts
+++ b/src/app/core/eperson/models/group.model.ts
@@ -3,8 +3,10 @@ import { Observable } from 'rxjs';
import { DSpaceObject } from '../../shared/dspace-object.model';
import { PaginatedList } from '../../data/paginated-list';
import { RemoteData } from '../../data/remote-data';
+import { ResourceType } from '../../shared/resource-type';
export class Group extends DSpaceObject {
+ static type = new ResourceType('group');
/**
* List of Groups that this Group belong to
diff --git a/src/app/core/eperson/models/normalized-eperson.model.ts b/src/app/core/eperson/models/normalized-eperson.model.ts
index e9d6f9fccd..489bf259c6 100644
--- a/src/app/core/eperson/models/normalized-eperson.model.ts
+++ b/src/app/core/eperson/models/normalized-eperson.model.ts
@@ -4,7 +4,7 @@ import { CacheableObject } from '../../cache/object-cache.reducer';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
import { EPerson } from './eperson.model';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
+import { Group } from './group.model';
@mapsTo(EPerson)
@inheritSerialization(NormalizedDSpaceObject)
@@ -20,7 +20,7 @@ export class NormalizedEPerson extends NormalizedDSpaceObject implement
* List of Groups that this EPerson belong to
*/
@deserialize
- @relationship(ResourceType.Group, true)
+ @relationship(Group, true)
groups: string[];
/**
diff --git a/src/app/core/eperson/models/normalized-group.model.ts b/src/app/core/eperson/models/normalized-group.model.ts
index 5435bbf1de..1d75905b14 100644
--- a/src/app/core/eperson/models/normalized-group.model.ts
+++ b/src/app/core/eperson/models/normalized-group.model.ts
@@ -4,7 +4,6 @@ import { CacheableObject } from '../../cache/object-cache.reducer';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
import { Group } from './group.model';
-import { ResourceType } from '../../shared/resource-type';
@mapsTo(Group)
@inheritSerialization(NormalizedDSpaceObject)
@@ -14,7 +13,7 @@ export class NormalizedGroup extends NormalizedDSpaceObject implements Ca
* List of Groups that this Group belong to
*/
@deserialize
- @relationship(ResourceType.Group, true)
+ @relationship(Group, true)
groups: string[];
/**
diff --git a/src/app/core/integration/integration-object-factory.ts b/src/app/core/integration/integration-object-factory.ts
deleted file mode 100644
index f66a070fdf..0000000000
--- a/src/app/core/integration/integration-object-factory.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { GenericConstructor } from '../shared/generic-constructor';
-import { IntegrationType } from './intergration-type';
-import { IntegrationModel } from './models/integration.model';
-import { NormalizedAuthorityValue } from './models/normalized-authority-value.model';
-
-export class IntegrationObjectFactory {
- public static getConstructor(type): GenericConstructor {
- switch (type) {
- case IntegrationType.Authority: {
- return NormalizedAuthorityValue;
- }
- default: {
- return undefined;
- }
- }
- }
-}
diff --git a/src/app/core/integration/integration-response-parsing.service.ts b/src/app/core/integration/integration-response-parsing.service.ts
index 2d3693cf3d..8cc0f8d252 100644
--- a/src/app/core/integration/integration-response-parsing.service.ts
+++ b/src/app/core/integration/integration-response-parsing.service.ts
@@ -2,27 +2,20 @@ import { Inject, Injectable } from '@angular/core';
import { RestRequest } from '../data/request.models';
import { ResponseParsingService } from '../data/parsing.service';
import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
-import {
- ErrorResponse,
- IntegrationSuccessResponse,
- RestResponse
-} from '../cache/response.models';
+import { ErrorResponse, IntegrationSuccessResponse, RestResponse } from '../cache/response.models';
import { isNotEmpty } from '../../shared/empty.util';
-import { IntegrationObjectFactory } from './integration-object-factory';
import { BaseResponseParsingService } from '../data/base-response-parsing.service';
import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface';
import { ObjectCacheService } from '../cache/object-cache.service';
import { IntegrationModel } from './models/integration.model';
-import { IntegrationType } from './intergration-type';
import { AuthorityValue } from './models/authority.value';
import { PaginatedList } from '../data/paginated-list';
@Injectable()
export class IntegrationResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- protected objectFactory = IntegrationObjectFactory;
protected toCache = true;
constructor(
@@ -34,7 +27,7 @@ export class IntegrationResponseParsingService extends BaseResponseParsingServic
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
- const dataDefinition = this.process(data.payload, request.uuid);
+ const dataDefinition = this.process(data.payload, request.uuid);
return new IntegrationSuccessResponse(this.processResponse(dataDefinition), data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else {
return new ErrorResponse(
@@ -49,7 +42,7 @@ export class IntegrationResponseParsingService extends BaseResponseParsingServic
protected processResponse(data: PaginatedList): any {
const returnList = Array.of();
data.page.forEach((item, index) => {
- if (item.type === IntegrationType.Authority) {
+ if (item.type === AuthorityValue.type.value) {
data.page[index] = Object.assign(new AuthorityValue(), item);
}
});
diff --git a/src/app/core/integration/intergration-type.ts b/src/app/core/integration/intergration-type.ts
deleted file mode 100644
index 882dc6d8ce..0000000000
--- a/src/app/core/integration/intergration-type.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-
-export enum IntegrationType {
- Authority = 'authority'
-}
diff --git a/src/app/core/integration/models/authority.value.ts b/src/app/core/integration/models/authority.value.ts
index 31cb0a5787..4c6a7c01cb 100644
--- a/src/app/core/integration/models/authority.value.ts
+++ b/src/app/core/integration/models/authority.value.ts
@@ -3,11 +3,13 @@ import { isNotEmpty } from '../../../shared/empty.util';
import { PLACEHOLDER_PARENT_METADATA } from '../../../shared/form/builder/ds-dynamic-form-ui/models/relation-group/dynamic-relation-group.model';
import { OtherInformation } from '../../../shared/form/builder/models/form-field-metadata-value.model';
import { MetadataValueInterface } from '../../shared/metadata.models';
+import { ResourceType } from '../../shared/resource-type';
/**
* Class representing an authority object
*/
export class AuthorityValue extends IntegrationModel implements MetadataValueInterface {
+ static type = new ResourceType('authority');
/**
* The identifier of this authority
diff --git a/src/app/core/metadata/metadata-field.model.ts b/src/app/core/metadata/metadata-field.model.ts
new file mode 100644
index 0000000000..288934e52d
--- /dev/null
+++ b/src/app/core/metadata/metadata-field.model.ts
@@ -0,0 +1,53 @@
+import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
+import { isNotEmpty } from '../../shared/empty.util';
+import { MetadataSchema } from './metadata-schema.model';
+import { ResourceType } from '../shared/resource-type';
+
+/**
+ * Class the represents a metadata field
+ */
+export class MetadataField implements ListableObject {
+ static type = new ResourceType('metadatafield');
+
+ /**
+ * The identifier of this metadata field
+ */
+ id: number;
+
+ /**
+ * The self link of this metadata field
+ */
+ self: string;
+
+ /**
+ * The element of this metadata field
+ */
+ element: string;
+
+ /**
+ * The qualifier of this metadata field
+ */
+ qualifier: string;
+
+ /**
+ * The scope note of this metadata field
+ */
+ scopeNote: string;
+
+ /**
+ * The metadata schema object of this metadata field
+ */
+ schema: MetadataSchema;
+
+ /**
+ * Method to print this metadata field as a string
+ * @param separator The separator between the schema, element and qualifier in the string
+ */
+ toString(separator: string = '.'): string {
+ let key = this.schema.prefix + separator + this.element;
+ if (isNotEmpty(this.qualifier)) {
+ key += separator + this.qualifier;
+ }
+ return key;
+ }
+}
diff --git a/src/app/core/metadata/metadata-schema.model.ts b/src/app/core/metadata/metadata-schema.model.ts
new file mode 100644
index 0000000000..bc05e475cc
--- /dev/null
+++ b/src/app/core/metadata/metadata-schema.model.ts
@@ -0,0 +1,29 @@
+import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
+import { ResourceType } from '../shared/resource-type';
+
+/**
+ * Class that represents a metadata schema
+ */
+export class MetadataSchema implements ListableObject {
+ static type = new ResourceType('metadataschema');
+
+ /**
+ * The unique identifier for this metadata schema
+ */
+ id: number;
+
+ /**
+ * The REST link to itself
+ */
+ self: string;
+
+ /**
+ * A unique prefix that defines this schema
+ */
+ prefix: string;
+
+ /**
+ * The namespace of this metadata schema
+ */
+ namespace: string;
+}
diff --git a/src/app/core/metadata/metadata.service.spec.ts b/src/app/core/metadata/metadata.service.spec.ts
index cfb5a0751d..80ce33b370 100644
--- a/src/app/core/metadata/metadata.service.spec.ts
+++ b/src/app/core/metadata/metadata.service.spec.ts
@@ -38,6 +38,7 @@ import { EmptyError } from 'rxjs/internal-compatibility';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
import { MetadataValue } from '../shared/metadata.models';
+import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils';
/* tslint:disable:max-classes-per-file */
@Component({
@@ -206,13 +207,7 @@ describe('MetadataService', () => {
});
const mockRemoteData = (mockItem: Item): Observable> => {
- return observableOf(new RemoteData
- (
- false,
- false,
- true,
- undefined,
- MockItem
- ));
+ return createSuccessfulRemoteDataObject$(MockItem);
};
const mockType = (mockItem: Item, type: string): Item => {
diff --git a/src/app/core/metadata/metadatafield.model.ts b/src/app/core/metadata/metadatafield.model.ts
deleted file mode 100644
index 81de2e8938..0000000000
--- a/src/app/core/metadata/metadatafield.model.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { MetadataSchema } from './metadataschema.model';
-import { autoserialize } from 'cerialize';
-import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
-import { isNotEmpty } from '../../shared/empty.util';
-
-export class MetadataField extends ListableObject {
- @autoserialize
- id: number;
-
- @autoserialize
- self: string;
-
- @autoserialize
- element: string;
-
- @autoserialize
- qualifier: string;
-
- @autoserialize
- scopeNote: string;
-
- @autoserialize
- schema: MetadataSchema;
-
- toString(separator: string = '.'): string {
- let key = this.schema.prefix + separator + this.element;
- if (isNotEmpty(this.qualifier)) {
- key += separator + this.qualifier;
- }
- return key;
- }
-}
diff --git a/src/app/core/metadata/metadataschema.model.ts b/src/app/core/metadata/metadataschema.model.ts
deleted file mode 100644
index 7e96b5cb27..0000000000
--- a/src/app/core/metadata/metadataschema.model.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { autoserialize } from 'cerialize';
-import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
-import { CacheableObject } from '../cache/object-cache.reducer';
-
-export class MetadataSchema extends ListableObject {
- id: number;
-
- self: string;
-
- prefix: string;
-
- namespace: string;
-}
diff --git a/src/app/core/metadata/normalized-metadata-field.model.ts b/src/app/core/metadata/normalized-metadata-field.model.ts
new file mode 100644
index 0000000000..c6b2ee32f8
--- /dev/null
+++ b/src/app/core/metadata/normalized-metadata-field.model.ts
@@ -0,0 +1,51 @@
+import { autoserialize, deserialize, inheritSerialization } from 'cerialize';
+import { mapsTo, relationship } from '../cache/builders/build-decorators';
+import { MetadataField } from './metadata-field.model';
+import { NormalizedObject } from '../cache/models/normalized-object.model';
+import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
+import { MetadataSchema } from './metadata-schema.model';
+
+/**
+ * Class the represents a normalized metadata field
+ */
+@mapsTo(MetadataField)
+@inheritSerialization(NormalizedObject)
+export class NormalizedMetadataField extends NormalizedObject implements ListableObject {
+
+ /**
+ * The identifier of this normalized metadata field
+ */
+ @autoserialize
+ id: number;
+
+ /**
+ * The self link of this normalized metadata field
+ */
+ @autoserialize
+ self: string;
+
+ /**
+ * The element of this normalized metadata field
+ */
+ @autoserialize
+ element: string;
+
+ /**
+ * The qualifier of this normalized metadata field
+ */
+ @autoserialize
+ qualifier: string;
+
+ /**
+ * The scope note of this normalized metadata field
+ */
+ @autoserialize
+ scopeNote: string;
+
+ /**
+ * The link to the metadata schema of this normalized metadata field
+ */
+ @deserialize
+ @relationship(MetadataSchema)
+ schema: string;
+}
diff --git a/src/app/core/metadata/normalized-metadata-schema.model.ts b/src/app/core/metadata/normalized-metadata-schema.model.ts
index 420a9d4dab..4b534725f4 100644
--- a/src/app/core/metadata/normalized-metadata-schema.model.ts
+++ b/src/app/core/metadata/normalized-metadata-schema.model.ts
@@ -1,12 +1,13 @@
-import { autoserialize } from 'cerialize';
+import { autoserialize, inheritSerialization } from 'cerialize';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { mapsTo } from '../cache/builders/build-decorators';
-import { MetadataSchema } from './metadataschema.model';
+import { MetadataSchema } from './metadata-schema.model';
/**
* Normalized class for a DSpace MetadataSchema
*/
@mapsTo(MetadataSchema)
+@inheritSerialization(NormalizedObject)
export class NormalizedMetadataSchema extends NormalizedObject {
/**
* The unique identifier for this schema
diff --git a/src/app/core/registry/registry-bitstreamformats-response.model.ts b/src/app/core/registry/registry-bitstreamformats-response.model.ts
index 81de379e9e..ddf926f3be 100644
--- a/src/app/core/registry/registry-bitstreamformats-response.model.ts
+++ b/src/app/core/registry/registry-bitstreamformats-response.model.ts
@@ -1,9 +1,11 @@
-import { autoserialize, autoserializeAs } from 'cerialize';
+import { autoserialize, deserialize } from 'cerialize';
import { PageInfo } from '../shared/page-info.model';
import { BitstreamFormat } from '../shared/bitstream-format.model';
+import { relationship } from '../cache/builders/build-decorators';
export class RegistryBitstreamformatsResponse {
- @autoserializeAs(BitstreamFormat)
+ @deserialize
+ @relationship(BitstreamFormat, true)
bitstreamformats: BitstreamFormat[];
@autoserialize
diff --git a/src/app/core/registry/registry-metadatafields-response.model.ts b/src/app/core/registry/registry-metadatafields-response.model.ts
index 19ec537dfb..984603e42e 100644
--- a/src/app/core/registry/registry-metadatafields-response.model.ts
+++ b/src/app/core/registry/registry-metadatafields-response.model.ts
@@ -1,14 +1,31 @@
import { PageInfo } from '../shared/page-info.model';
-import { autoserialize, autoserializeAs } from 'cerialize';
-import { MetadataField } from '../metadata/metadatafield.model';
+import { autoserialize, deserialize } from 'cerialize';
+import { ResourceType } from '../shared/resource-type';
+import { relationship } from '../cache/builders/build-decorators';
+import { NormalizedMetadataField } from '../metadata/normalized-metadata-field.model';
+import { MetadataField } from '../metadata/metadata-field.model';
+/**
+ * Class that represents a response with a registry's metadata fields
+ */
export class RegistryMetadatafieldsResponse {
- @autoserializeAs(MetadataField)
+ static type = new ResourceType('metadatafield');
+ /**
+ * List of metadata fields in the response
+ */
+ @deserialize
+ @relationship(MetadataField, true)
metadatafields: MetadataField[];
+ /**
+ * Page info of this response
+ */
@autoserialize
page: PageInfo;
+ /**
+ * The REST link to this response
+ */
@autoserialize
self: string;
}
diff --git a/src/app/core/registry/registry-metadataschemas-response.model.ts b/src/app/core/registry/registry-metadataschemas-response.model.ts
index 5f4799abd7..fc53b354a5 100644
--- a/src/app/core/registry/registry-metadataschemas-response.model.ts
+++ b/src/app/core/registry/registry-metadataschemas-response.model.ts
@@ -1,9 +1,11 @@
-import { MetadataSchema } from '../metadata/metadataschema.model';
import { PageInfo } from '../shared/page-info.model';
-import { autoserialize, autoserializeAs } from 'cerialize';
+import { autoserialize, deserialize } from 'cerialize';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
+import { relationship } from '../cache/builders/build-decorators';
export class RegistryMetadataschemasResponse {
- @autoserializeAs(MetadataSchema)
+ @deserialize
+ @relationship(MetadataSchema, true)
metadataschemas: MetadataSchema[];
@autoserialize
diff --git a/src/app/core/registry/registry.service.spec.ts b/src/app/core/registry/registry.service.spec.ts
index 8274ceef60..47e306d624 100644
--- a/src/app/core/registry/registry.service.spec.ts
+++ b/src/app/core/registry/registry.service.spec.ts
@@ -39,8 +39,10 @@ import {
MetadataRegistrySelectFieldAction,
MetadataRegistrySelectSchemaAction
} from '../../+admin/admin-registries/metadata-registry/metadata-registry.actions';
-import { MetadataSchema } from '../metadata/metadataschema.model';
-import { MetadataField } from '../metadata/metadatafield.model';
+import { ResourceType } from '../shared/resource-type';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
+import { MetadataField } from '../metadata/metadata-field.model';
+import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils';
@Component({ template: '' })
class DummyComponent {
@@ -59,13 +61,15 @@ describe('RegistryService', () => {
id: 1,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadataschemas/1',
prefix: 'dc',
- namespace: 'http://dublincore.org/documents/dcmi-terms/'
- },
+ namespace: 'http://dublincore.org/documents/dcmi-terms/',
+ type: MetadataSchema.type
+},
{
id: 2,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadataschemas/2',
prefix: 'mock',
- namespace: 'http://dspace.org/mockschema'
+ namespace: 'http://dspace.org/mockschema',
+ type: MetadataSchema.type
}
];
const mockFieldsList = [
@@ -75,7 +79,8 @@ describe('RegistryService', () => {
element: 'contributor',
qualifier: 'advisor',
scopeNote: null,
- schema: mockSchemasList[0]
+ schema: mockSchemasList[0],
+ type: MetadataField.type
},
{
id: 2,
@@ -83,7 +88,8 @@ describe('RegistryService', () => {
element: 'contributor',
qualifier: 'author',
scopeNote: null,
- schema: mockSchemasList[0]
+ schema: mockSchemasList[0],
+ type: MetadataField.type
},
{
id: 3,
@@ -91,7 +97,8 @@ describe('RegistryService', () => {
element: 'contributor',
qualifier: 'editor',
scopeNote: 'test scope note',
- schema: mockSchemasList[1]
+ schema: mockSchemasList[1],
+ type: MetadataField.type
},
{
id: 4,
@@ -99,7 +106,8 @@ describe('RegistryService', () => {
element: 'contributor',
qualifier: 'illustrator',
scopeNote: null,
- schema: mockSchemasList[1]
+ schema: mockSchemasList[1],
+ type: MetadataField.type
}
];
@@ -124,7 +132,7 @@ describe('RegistryService', () => {
);
},
aggregate: (input: Array>>): Observable> => {
- return observableOf(new RemoteData(false, false, true, null, []));
+ return createSuccessfulRemoteDataObject$([]);
}
};
diff --git a/src/app/core/registry/registry.service.ts b/src/app/core/registry/registry.service.ts
index ff0e426bef..650889b8af 100644
--- a/src/app/core/registry/registry.service.ts
+++ b/src/app/core/registry/registry.service.ts
@@ -3,8 +3,6 @@ import { Injectable } from '@angular/core';
import { RemoteData } from '../data/remote-data';
import { PaginatedList } from '../data/paginated-list';
import { PageInfo } from '../shared/page-info.model';
-import { MetadataSchema } from '../metadata/metadataschema.model';
-import { MetadataField } from '../metadata/metadatafield.model';
import { BitstreamFormat } from './mock-bitstream-format.model';
import {
CreateMetadataFieldRequest,
@@ -56,7 +54,6 @@ import {
} from '../../+admin/admin-registries/metadata-registry/metadata-registry.actions';
import { distinctUntilChanged, flatMap, map, switchMap, take, tap } from 'rxjs/operators';
import { DSpaceRESTv2Serializer } from '../dspace-rest-v2/dspace-rest-v2.serializer';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
import { ResourceType } from '../shared/resource-type';
import { NormalizedMetadataSchema } from '../metadata/normalized-metadata-schema.model';
import { NotificationsService } from '../../shared/notifications/notifications.service';
@@ -64,6 +61,9 @@ import { NotificationOptions } from '../../shared/notifications/models/notificat
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
import { HttpHeaders } from '@angular/common/http';
import { TranslateService } from '@ngx-translate/core';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
+import { MetadataField } from '../metadata/metadata-field.model';
+import { getMapsToType } from '../cache/builders/build-decorators';
const metadataRegistryStateSelector = (state: AppState) => state.metadataRegistry;
const editMetadataSchemaSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.editSchema);
@@ -71,6 +71,9 @@ const selectedMetadataSchemasSelector = createSelector(metadataRegistryStateSele
const editMetadataFieldSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.editField);
const selectedMetadataFieldsSelector = createSelector(metadataRegistryStateSelector, (metadataState: MetadataRegistryState) => metadataState.selectedFields);
+/**
+ * Service for registry related CRUD actions such as metadata schema, metadata field and bitstream format
+ */
@Injectable()
export class RegistryService {
@@ -87,6 +90,10 @@ export class RegistryService {
}
+ /**
+ * Retrieves all metadata schemas
+ * @param pagination The pagination info used to retrieve the schemas
+ */
public getMetadataSchemas(pagination: PaginationComponentOptions): Observable>> {
const requestObs = this.getMetadataSchemasRequestObs(pagination);
@@ -117,6 +124,10 @@ export class RegistryService {
return this.rdb.toRemoteDataObservable(requestEntryObs, payloadObs);
}
+ /**
+ * Retrieves a metadata schema by its name
+ * @param schemaName The name of the schema to find
+ */
public getMetadataSchemaByName(schemaName: string): Observable> {
// Temporary pagination to get ALL metadataschemas until there's a rest api endpoint for fetching a specific schema
const pagination: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), {
@@ -142,6 +153,11 @@ export class RegistryService {
return this.rdb.toRemoteDataObservable(requestEntryObs, metadataschemaObs);
}
+ /**
+ * retrieves all metadata fields that belong to a certain metadata schema
+ * @param schema The schema to filter by
+ * @param pagination The pagination info used to retrieve the fields
+ */
public getMetadataFieldsBySchema(schema: MetadataSchema, pagination: PaginationComponentOptions): Observable>> {
const requestObs = this.getMetadataFieldsBySchemaRequestObs(pagination, schema);
@@ -215,6 +231,10 @@ export class RegistryService {
return this.rdb.toRemoteDataObservable(requestEntryObs, payloadObs);
}
+ /**
+ * Retrieves all bitstream formats
+ * @param pagination The pagination info used to retrieve the bitstream formats
+ */
public getBitstreamFormats(pagination: PaginationComponentOptions): Observable>> {
const requestObs = this.getBitstreamFormatsRequestObs(pagination);
@@ -245,7 +265,7 @@ export class RegistryService {
return this.rdb.toRemoteDataObservable(requestEntryObs, payloadObs);
}
- public getMetadataSchemasRequestObs(pagination: PaginationComponentOptions): Observable {
+ private getMetadataSchemasRequestObs(pagination: PaginationComponentOptions): Observable {
return this.halService.getEndpoint(this.metadataSchemasPath).pipe(
map((url: string) => {
const args: string[] = [];
@@ -327,58 +347,101 @@ export class RegistryService {
);
}
+ /**
+ * Method to start editing a metadata schema, dispatches an edit schema action
+ * @param schema The schema that's being edited
+ */
public editMetadataSchema(schema: MetadataSchema) {
this.store.dispatch(new MetadataRegistryEditSchemaAction(schema));
}
+ /**
+ * Method to cancel editing a metadata schema, dispatches a cancel schema action
+ */
public cancelEditMetadataSchema() {
this.store.dispatch(new MetadataRegistryCancelSchemaAction());
}
+ /**
+ * Method to retrieve the metadata schema that are currently being edited
+ */
public getActiveMetadataSchema(): Observable {
return this.store.pipe(select(editMetadataSchemaSelector));
}
+ /**
+ * Method to select a metadata schema, dispatches a select schema action
+ * @param schema The schema that's being selected
+ */
public selectMetadataSchema(schema: MetadataSchema) {
this.store.dispatch(new MetadataRegistrySelectSchemaAction(schema))
}
+ /**
+ * Method to deselect a metadata schema, dispatches a deselect schema action
+ * @param schema The schema that's it being deselected
+ */
public deselectMetadataSchema(schema: MetadataSchema) {
this.store.dispatch(new MetadataRegistryDeselectSchemaAction(schema))
}
+ /**
+ * Method to deselect all currently selected metadata schema, dispatches a deselect all schema action
+ */
public deselectAllMetadataSchema() {
this.store.dispatch(new MetadataRegistryDeselectAllSchemaAction())
}
+ /**
+ * Method to retrieve the metadata schemas that are currently selected
+ */
public getSelectedMetadataSchemas(): Observable {
return this.store.pipe(select(selectedMetadataSchemasSelector));
}
-
+ /**
+ * Method to start editing a metadata field, dispatches an edit field action
+ * @param field The field that's being edited
+ */
public editMetadataField(field: MetadataField) {
this.store.dispatch(new MetadataRegistryEditFieldAction(field));
}
+ /**
+ * Method to cancel editing a metadata field, dispatches a cancel field action
+ */
public cancelEditMetadataField() {
this.store.dispatch(new MetadataRegistryCancelFieldAction());
}
-
+ /**
+ * Method to retrieve the metadata field that are currently being edited
+ */
public getActiveMetadataField(): Observable {
return this.store.pipe(select(editMetadataFieldSelector));
}
-
+ /**
+ * Method to select a metadata field, dispatches a select field action
+ * @param field The field that's being selected
+ */
public selectMetadataField(field: MetadataField) {
this.store.dispatch(new MetadataRegistrySelectFieldAction(field))
}
-
+ /**
+ * Method to deselect a metadata field, dispatches a deselect field action
+ * @param field The field that's it being deselected
+ */
public deselectMetadataField(field: MetadataField) {
this.store.dispatch(new MetadataRegistryDeselectFieldAction(field))
}
-
+ /**
+ * Method to deselect all currently selected metadata fields, dispatches a deselect all field action
+ */
public deselectAllMetadataField() {
this.store.dispatch(new MetadataRegistryDeselectAllFieldAction())
}
+ /**
+ * Method to retrieve the metadata fields that are currently selected
+ */
public getSelectedMetadataFields(): Observable {
return this.store.pipe(select(selectedMetadataFieldsSelector));
}
@@ -400,7 +463,7 @@ export class RegistryService {
distinctUntilChanged()
);
- const serializedSchema = new DSpaceRESTv2Serializer(NormalizedObjectFactory.getConstructor(ResourceType.MetadataSchema)).serialize(schema as any as NormalizedMetadataSchema);
+ const serializedSchema = new DSpaceRESTv2Serializer(getMapsToType(MetadataSchema.type)).serialize(schema as any as NormalizedMetadataSchema);
const request$ = endpoint$.pipe(
take(1),
@@ -444,10 +507,17 @@ export class RegistryService {
);
}
+ /**
+ * Method to delete a metadata schema
+ * @param id The id of the metadata schema to delete
+ */
public deleteMetadataSchema(id: number): Observable {
return this.delete(this.metadataSchemasPath, id);
}
+ /**
+ * Method that clears a cached metadata schema request and returns its REST url
+ */
public clearMetadataSchemaRequests(): Observable {
return this.halService.getEndpoint(this.metadataSchemasPath).pipe(
tap((href: string) => this.requestService.removeByHrefSubstring(href))
@@ -514,10 +584,16 @@ export class RegistryService {
);
}
+ /**
+ * Method to delete a metadata field
+ * @param id The id of the metadata field to delete
+ */
public deleteMetadataField(id: number): Observable {
return this.delete(this.metadataFieldsPath, id);
}
-
+ /**
+ * Method that clears a cached metadata field request and returns its REST url
+ */
public clearMetadataFieldRequests(): Observable {
return this.halService.getEndpoint(this.metadataFieldsPath).pipe(
tap((href: string) => this.requestService.removeByHrefSubstring(href))
diff --git a/src/app/core/shared/bitstream-format.model.ts b/src/app/core/shared/bitstream-format.model.ts
index 9af345e607..bf50cd832f 100644
--- a/src/app/core/shared/bitstream-format.model.ts
+++ b/src/app/core/shared/bitstream-format.model.ts
@@ -1,12 +1,14 @@
-import { CacheableObject } from '../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../cache/object-cache.reducer';
import { ResourceType } from './resource-type';
/**
* Model class for a Bitstream Format
*/
export class BitstreamFormat implements CacheableObject {
+ static type = new ResourceType('bitstreamformat');
+ bitstreamformat
/**
* Short description of this Bitstream Format
*/
@@ -42,11 +44,6 @@ export class BitstreamFormat implements CacheableObject {
*/
self: string;
- /**
- * A ResourceType representing the kind of Object of this BitstreamFormat
- */
- type: ResourceType;
-
/**
* Universally unique identifier for this Bitstream Format
*/
diff --git a/src/app/core/shared/bitstream.model.ts b/src/app/core/shared/bitstream.model.ts
index 794282e867..887f7d0843 100644
--- a/src/app/core/shared/bitstream.model.ts
+++ b/src/app/core/shared/bitstream.model.ts
@@ -3,8 +3,10 @@ import { RemoteData } from '../data/remote-data';
import { Item } from './item.model';
import { BitstreamFormat } from './bitstream-format.model';
import { Observable } from 'rxjs';
+import { ResourceType } from './resource-type';
export class Bitstream extends DSpaceObject {
+ static type = new ResourceType('bitstream');
/**
* The size of this bitstream in bytes
@@ -40,5 +42,4 @@ export class Bitstream extends DSpaceObject {
* The URL to retrieve this Bitstream's file
*/
content: string;
-
}
diff --git a/src/app/core/shared/browse-definition.model.ts b/src/app/core/shared/browse-definition.model.ts
index 05263858c6..9fafe7e321 100644
--- a/src/app/core/shared/browse-definition.model.ts
+++ b/src/app/core/shared/browse-definition.model.ts
@@ -1,7 +1,11 @@
import { autoserialize, autoserializeAs } from 'cerialize';
import { SortOption } from './sort-option.model';
+import { ResourceType } from './resource-type';
+import { TypedObject } from '../cache/object-cache.reducer';
+
+export class BrowseDefinition implements TypedObject {
+ static type = new ResourceType('browse');
-export class BrowseDefinition {
@autoserialize
id: string;
@@ -14,9 +18,6 @@ export class BrowseDefinition {
@autoserializeAs('order')
defaultSortOrder: string;
- @autoserialize
- type: string;
-
@autoserializeAs('metadata')
metadataKeys: string[];
diff --git a/src/app/core/shared/browse-entry.model.ts b/src/app/core/shared/browse-entry.model.ts
index 0a61bbee70..b544413af7 100644
--- a/src/app/core/shared/browse-entry.model.ts
+++ b/src/app/core/shared/browse-entry.model.ts
@@ -1,22 +1,33 @@
-import { autoserialize, autoserializeAs } from 'cerialize';
import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
+import { TypedObject } from '../cache/object-cache.reducer';
+import { ResourceType } from './resource-type';
import { excludeFromEquals } from '../utilities/equals.decorators';
-export class BrowseEntry extends ListableObject {
- @autoserialize
- type: string;
+/**
+ * Class object representing a browse entry
+ * This class is not normalized because browse entries do not have self links
+ */
+export class BrowseEntry extends ListableObject implements TypedObject {
+ static type = new ResourceType('browseEntry');
- @autoserialize
+ /**
+ * The authority string of this browse entry
+ */
authority: string;
- @autoserialize
+ /**
+ * The value of this browse entry
+ */
value: string;
- @autoserializeAs('valueLang')
+ /**
+ * The language of the value of this browse entry
+ */
language: string;
+ /**
+ * The count of this browse entry
+ */
@excludeFromEquals
- @autoserialize
count: number;
-
}
diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts
index 3f5b5df877..9b00f6efa0 100644
--- a/src/app/core/shared/bundle.model.ts
+++ b/src/app/core/shared/bundle.model.ts
@@ -3,8 +3,11 @@ import { Bitstream } from './bitstream.model';
import { Item } from './item.model';
import { RemoteData } from '../data/remote-data';
import { Observable } from 'rxjs';
+import { ResourceType } from './resource-type';
export class Bundle extends DSpaceObject {
+ static type = new ResourceType('bundle');
+
/**
* The primary bitstream of this Bundle
*/
diff --git a/src/app/core/shared/collection.model.ts b/src/app/core/shared/collection.model.ts
index 0471d1fbbb..642fe50736 100644
--- a/src/app/core/shared/collection.model.ts
+++ b/src/app/core/shared/collection.model.ts
@@ -6,8 +6,10 @@ import { Observable } from 'rxjs';
import { License } from './license.model';
import { ResourcePolicy } from './resource-policy.model';
import { PaginatedList } from '../data/paginated-list';
+import { ResourceType } from './resource-type';
export class Collection extends DSpaceObject {
+ static type = new ResourceType('collection');
/**
* A string representing the unique handle of this Collection
@@ -80,5 +82,4 @@ export class Collection extends DSpaceObject {
owner: Observable>;
items: Observable>;
-
}
diff --git a/src/app/core/shared/community.model.ts b/src/app/core/shared/community.model.ts
index c4e703fd7f..b61ddfd7f9 100644
--- a/src/app/core/shared/community.model.ts
+++ b/src/app/core/shared/community.model.ts
@@ -4,8 +4,10 @@ import { Collection } from './collection.model';
import { RemoteData } from '../data/remote-data';
import { Observable } from 'rxjs';
import { PaginatedList } from '../data/paginated-list';
+import { ResourceType } from './resource-type';
export class Community extends DSpaceObject {
+ static type = new ResourceType('community');
/**
* A string representing the unique handle of this Community
diff --git a/src/app/core/shared/dspace-object.model.ts b/src/app/core/shared/dspace-object.model.ts
index 0b3aad25ba..ec42a37db4 100644
--- a/src/app/core/shared/dspace-object.model.ts
+++ b/src/app/core/shared/dspace-object.model.ts
@@ -1,19 +1,27 @@
import { Observable } from 'rxjs';
-import { MetadataMap, MetadataValue, MetadataValueFilter, MetadatumViewModel } from './metadata.models';
+import {
+ MetadataMap,
+ MetadataValue,
+ MetadataValueFilter,
+ MetadatumViewModel
+} from './metadata.models';
import { Metadata } from './metadata.utils';
-import { isUndefined } from '../../shared/empty.util';
+import { hasNoValue, isUndefined } from '../../shared/empty.util';
import { CacheableObject } from '../cache/object-cache.reducer';
import { RemoteData } from '../data/remote-data';
-import { ResourceType } from './resource-type';
import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
-import { hasNoValue } from '../../shared/empty.util';
import { excludeFromEquals } from '../utilities/equals.decorators';
+import { ResourceType } from './resource-type';
/**
* An abstract model class for a DSpaceObject.
*/
export class DSpaceObject extends ListableObject implements CacheableObject {
+ /**
+ * A string representing the kind of DSpaceObject, e.g. community, item, …
+ */
+ static type = new ResourceType('dspaceobject');
@excludeFromEquals
private _name: string;
diff --git a/src/app/core/shared/item-relationships/item-type.model.ts b/src/app/core/shared/item-relationships/item-type.model.ts
index a105c3034c..0fc52b00a5 100644
--- a/src/app/core/shared/item-relationships/item-type.model.ts
+++ b/src/app/core/shared/item-relationships/item-type.model.ts
@@ -5,6 +5,8 @@ import { ResourceType } from '../resource-type';
* Describes a type of Item
*/
export class ItemType implements CacheableObject {
+ static type = new ResourceType('entitytype');
+
/**
* The identifier of this ItemType
*/
@@ -17,11 +19,6 @@ export class ItemType implements CacheableObject {
*/
self: string;
- /**
- * The type of Resource this is
- */
- type: ResourceType;
-
/**
* The universally unique identifier of this ItemType
*/
diff --git a/src/app/core/shared/item-relationships/relationship-type.model.ts b/src/app/core/shared/item-relationships/relationship-type.model.ts
index 404d8cdb4b..98454bc000 100644
--- a/src/app/core/shared/item-relationships/relationship-type.model.ts
+++ b/src/app/core/shared/item-relationships/relationship-type.model.ts
@@ -8,16 +8,13 @@ import { ItemType } from './item-type.model';
* Describes a type of Relationship between multiple possible Items
*/
export class RelationshipType implements CacheableObject {
+ static type = new ResourceType('relationshiptype');
+
/**
* The link to the rest endpoint where this object can be found
*/
self: string;
- /**
- * The type of Resource this is
- */
- type: ResourceType;
-
/**
* The label that describes this RelationshipType
*/
diff --git a/src/app/core/shared/item-relationships/relationship.model.ts b/src/app/core/shared/item-relationships/relationship.model.ts
index 63fe7987ab..9ab9751489 100644
--- a/src/app/core/shared/item-relationships/relationship.model.ts
+++ b/src/app/core/shared/item-relationships/relationship.model.ts
@@ -9,16 +9,13 @@ import { Item } from '../item.model';
* Describes a Relationship between two Items
*/
export class Relationship implements CacheableObject {
+ static type = new ResourceType('relationship');
+
/**
* The link to the rest endpoint where this object can be found
*/
self: string;
- /**
- * The type of Resource this is
- */
- type: ResourceType;
-
/**
* The universally unique identifier of this Relationship
*/
diff --git a/src/app/core/shared/item.model.spec.ts b/src/app/core/shared/item.model.spec.ts
index 2e5388dc4d..f20fb3299a 100644
--- a/src/app/core/shared/item.model.spec.ts
+++ b/src/app/core/shared/item.model.spec.ts
@@ -1,10 +1,10 @@
import { Observable, of as observableOf } from 'rxjs';
import { Item } from './item.model';
-import { RemoteData } from '../data/remote-data';
import { Bitstream } from './bitstream.model';
import { isEmpty } from '../../shared/empty.util';
import { first, map } from 'rxjs/operators';
+import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils';
describe('Item', () => {
@@ -32,12 +32,11 @@ describe('Item', () => {
content: bitstream2Path
}];
- remoteDataThumbnail = createRemoteDataObject(thumbnail);
- remoteDataFiles = createRemoteDataObject(bitstreams);
- remoteDataAll = createRemoteDataObject([...bitstreams, thumbnail]);
+ remoteDataThumbnail = createSuccessfulRemoteDataObject$(thumbnail);
+ remoteDataFiles = createSuccessfulRemoteDataObject$(bitstreams);
+ remoteDataAll = createSuccessfulRemoteDataObject$([...bitstreams, thumbnail]);
// Create Bundles
-
const bundles =
[
{
@@ -51,7 +50,6 @@ describe('Item', () => {
}];
item = Object.assign(new Item(), { bitstreams: remoteDataAll });
-
});
it('should return the bitstreams related to this item with the specified bundle name', () => {
@@ -99,16 +97,4 @@ describe('Item', () => {
});
});
-
});
-
-function createRemoteDataObject(object: any) {
- return observableOf(new RemoteData(
- false,
- false,
- true,
- undefined,
- object
- ));
-
-}
diff --git a/src/app/core/shared/item.model.ts b/src/app/core/shared/item.model.ts
index 7bd69131c6..a3e625c022 100644
--- a/src/app/core/shared/item.model.ts
+++ b/src/app/core/shared/item.model.ts
@@ -8,9 +8,11 @@ import { Bitstream } from './bitstream.model';
import { hasValue, isNotEmpty } from '../../shared/empty.util';
import { PaginatedList } from '../data/paginated-list';
import { Relationship } from './item-relationships/relationship.model';
+import { ResourceType } from './resource-type';
import { getSucceededRemoteData } from './operators';
export class Item extends DSpaceObject {
+ static type = new ResourceType('item');
/**
* A string representing the unique handle of this Item
diff --git a/src/app/core/shared/license.model.ts b/src/app/core/shared/license.model.ts
index a04422242a..fa49e1f430 100644
--- a/src/app/core/shared/license.model.ts
+++ b/src/app/core/shared/license.model.ts
@@ -1,6 +1,8 @@
import { DSpaceObject } from './dspace-object.model';
+import { ResourceType } from './resource-type';
export class License extends DSpaceObject {
+ static type = new ResourceType('license');
/**
* Is the license custom?
diff --git a/src/app/core/shared/normalized-browse-entry.model.ts b/src/app/core/shared/normalized-browse-entry.model.ts
new file mode 100644
index 0000000000..949758cb67
--- /dev/null
+++ b/src/app/core/shared/normalized-browse-entry.model.ts
@@ -0,0 +1,36 @@
+import { autoserialize, autoserializeAs, inheritSerialization } from 'cerialize';
+import { BrowseEntry } from './browse-entry.model';
+import { NormalizedObject } from '../cache/models/normalized-object.model';
+import { mapsTo } from '../cache/builders/build-decorators';
+
+/**
+ * Class object representing a browse entry
+ * This class is not normalized because browse entries do not have self links
+ */
+@mapsTo(BrowseEntry)
+@inheritSerialization(NormalizedObject)
+export class NormalizedBrowseEntry extends NormalizedObject {
+ /**
+ * The authority string of this browse entry
+ */
+ @autoserialize
+ authority: string;
+
+ /**
+ * The value of this browse entry
+ */
+ @autoserialize
+ value: string;
+
+ /**
+ * The language of the value of this browse entry
+ */
+ @autoserializeAs('valueLang')
+ language: string;
+
+ /**
+ * The count of this browse entry
+ */
+ @autoserialize
+ count: number;
+}
diff --git a/src/app/core/shared/operators.spec.ts b/src/app/core/shared/operators.spec.ts
index 564b0ff319..56b5d5db7e 100644
--- a/src/app/core/shared/operators.spec.ts
+++ b/src/app/core/shared/operators.spec.ts
@@ -18,6 +18,10 @@ import {
import { RemoteData } from '../data/remote-data';
import { RemoteDataError } from '../data/remote-data-error';
import { of as observableOf } from 'rxjs';
+import {
+ createFailedRemoteDataObject,
+ createSuccessfulRemoteDataObject
+} from '../../shared/testing/utils';
describe('Core Module - RxJS Operators', () => {
let scheduler: TestScheduler;
@@ -180,17 +184,17 @@ describe('Core Module - RxJS Operators', () => {
describe('getSucceededRemoteData', () => {
it('should return the first() hasSucceeded RemoteData Observable', () => {
const testRD = {
- a: new RemoteData(false, false, true, null, undefined),
- b: new RemoteData(false, false, false, null, 'b'),
+ a: createSuccessfulRemoteDataObject(undefined),
+ b: createFailedRemoteDataObject( 'b'),
c: new RemoteData(false, false, undefined, null, 'c'),
- d: new RemoteData(false, false, true, null, 'd'),
- e: new RemoteData(false, false, true, null, 'e'),
+ d: createSuccessfulRemoteDataObject('d'),
+ e: createSuccessfulRemoteDataObject('e'),
};
const source = hot('abcde', testRD);
const result = source.pipe(getSucceededRemoteData());
result.subscribe((value) => expect(value)
- .toEqual(new RemoteData(false, false, true, null, 'd')));
+ .toEqual(createSuccessfulRemoteDataObject('d')));
});
});
@@ -202,21 +206,21 @@ describe('Core Module - RxJS Operators', () => {
});
it('should call navigateByUrl to a 404 page, when the remote data contains a 404 error', () => {
- const testRD = new RemoteData(false, false, false, new RemoteDataError(404, 'Not Found', 'Object was not found'), undefined);
+ const testRD = createFailedRemoteDataObject(undefined, new RemoteDataError(404, 'Not Found', 'Object was not found'));
observableOf(testRD).pipe(redirectToPageNotFoundOn404(router)).subscribe();
expect(router.navigateByUrl).toHaveBeenCalledWith('/404', { skipLocationChange: true });
});
it('should not call navigateByUrl to a 404 page, when the remote data contains another error than a 404', () => {
- const testRD = new RemoteData(false, false, false, new RemoteDataError(500, 'Server Error', 'Something went wrong'), undefined);
+ const testRD = createFailedRemoteDataObject(undefined, new RemoteDataError(500, 'Server Error', 'Something went wrong'));
observableOf(testRD).pipe(redirectToPageNotFoundOn404(router)).subscribe();
expect(router.navigateByUrl).not.toHaveBeenCalled();
});
it('should not call navigateByUrl to a 404 page, when the remote data contains no error', () => {
- const testRD = new RemoteData(false, false, true, null, undefined);
+ const testRD = createSuccessfulRemoteDataObject(undefined);
observableOf(testRD).pipe(redirectToPageNotFoundOn404(router)).subscribe();
expect(router.navigateByUrl).not.toHaveBeenCalled();
@@ -242,11 +246,11 @@ describe('Core Module - RxJS Operators', () => {
describe('getAllSucceededRemoteData', () => {
it('should return all hasSucceeded RemoteData Observables', () => {
const testRD = {
- a: new RemoteData(false, false, true, null, undefined),
- b: new RemoteData(false, false, false, null, 'b'),
+ a: createSuccessfulRemoteDataObject(undefined),
+ b: createFailedRemoteDataObject('b'),
c: new RemoteData(false, false, undefined, null, 'c'),
- d: new RemoteData(false, false, true, null, 'd'),
- e: new RemoteData(false, false, true, null, 'e'),
+ d: createSuccessfulRemoteDataObject('d'),
+ e: createSuccessfulRemoteDataObject('e'),
};
const source = hot('abcde', testRD);
const result = source.pipe(getAllSucceededRemoteData());
diff --git a/src/app/core/shared/resource-policy.model.ts b/src/app/core/shared/resource-policy.model.ts
index ee3d5293f5..a80446a369 100644
--- a/src/app/core/shared/resource-policy.model.ts
+++ b/src/app/core/shared/resource-policy.model.ts
@@ -1,12 +1,13 @@
import { CacheableObject } from '../cache/object-cache.reducer';
import { ResourceType } from './resource-type';
-import { Group } from '../eperson/models/group.model';
import { ActionType } from '../cache/models/action-type.model';
/**
* Model class for a Resource Policy
*/
export class ResourcePolicy implements CacheableObject {
+ static type = new ResourceType('resourcePolicy');
+
/**
* The action that is allowed by this Resource Policy
*/
@@ -27,11 +28,6 @@ export class ResourcePolicy implements CacheableObject {
*/
self: string;
- /**
- * A ResourceType representing the kind of Object of this ResourcePolicy
- */
- type: ResourceType;
-
/**
* The universally unique identifier for this Resource Policy
*/
diff --git a/src/app/core/shared/resource-type.ts b/src/app/core/shared/resource-type.ts
index bdcc3a52f6..657837fbec 100644
--- a/src/app/core/shared/resource-type.ts
+++ b/src/app/core/shared/resource-type.ts
@@ -1,28 +1,7 @@
-export enum ResourceType {
- DSpaceObject = 'dspaceobject',
- Bundle = 'bundle',
- Bitstream = 'bitstream',
- BitstreamFormat = 'bitstreamformat',
- Item = 'item',
- Collection = 'collection',
- Community = 'community',
- EPerson = 'eperson',
- Group = 'group',
- ResourcePolicy = 'resourcePolicy',
- MetadataSchema = 'metadataschema',
- MetadataField = 'metadatafield',
- Relationship = 'relationship',
- RelationshipType = 'relationshiptype',
- ItemType = 'entitytype',
- License = 'license',
- Workflowitem = 'workflowitem',
- Workspaceitem = 'workspaceitem',
- SubmissionDefinitions = 'submissiondefinitions',
- SubmissionDefinition = 'submissiondefinition',
- SubmissionForm = 'submissionform',
- SubmissionForms = 'submissionforms',
- SubmissionSections = 'submissionsections',
- SubmissionSection = 'submissionsection',
- ClaimedTask = 'claimedtask',
- PoolTask = 'pooltask'
+/**
+ * Class that represents the type of an object as returned by the REST server
+ */
+export class ResourceType {
+ constructor(public value: string) {
+ }
}
diff --git a/src/app/core/shared/search/search-configuration.service.ts b/src/app/core/shared/search/search-configuration.service.ts
index dd04fc50f9..ce75cb63c4 100644
--- a/src/app/core/shared/search/search-configuration.service.ts
+++ b/src/app/core/shared/search/search-configuration.service.ts
@@ -1,25 +1,19 @@
-import {Injectable, OnDestroy} from '@angular/core';
-import {ActivatedRoute, Params} from '@angular/router';
+import { Injectable, OnDestroy } from '@angular/core';
+import { ActivatedRoute, Params } from '@angular/router';
-import {
- BehaviorSubject,
- combineLatest as observableCombineLatest,
- merge as observableMerge,
- Observable,
- of as observableOf,
- Subscription
-} from 'rxjs';
-import {filter, map, startWith, tap} from 'rxjs/operators';
-import {PaginationComponentOptions} from '../../../shared/pagination/pagination-component-options.model';
-import {SearchOptions} from '../../../shared/search/search-options.model';
-import {PaginatedSearchOptions} from '../../../shared/search/paginated-search-options.model';
-import {RouteService} from '../../../shared/services/route.service';
-import {hasNoValue, hasValue, isNotEmpty, isNotEmptyOperator} from '../../../shared/empty.util';
-import {SearchFilter} from '../../../shared/search/search-filter.model';
-import {RemoteData} from '../../data/remote-data';
-import {getSucceededRemoteData} from '../operators';
-import {DSpaceObjectType} from '../dspace-object-type.model';
-import {SortDirection, SortOptions} from '../../cache/models/sort-options.model';
+import { BehaviorSubject, combineLatest as observableCombineLatest, merge as observableMerge, Observable, Subscription } from 'rxjs';
+import { filter, map, startWith } from 'rxjs/operators';
+import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
+import { SearchOptions } from '../../../shared/search/search-options.model';
+import { PaginatedSearchOptions } from '../../../shared/search/paginated-search-options.model';
+import { RouteService } from '../../../shared/services/route.service';
+import { hasNoValue, hasValue, isNotEmpty, isNotEmptyOperator } from '../../../shared/empty.util';
+import { SearchFilter } from '../../../shared/search/search-filter.model';
+import { RemoteData } from '../../data/remote-data';
+import { getSucceededRemoteData } from '../operators';
+import { DSpaceObjectType } from '../dspace-object-type.model';
+import { SortDirection, SortOptions } from '../../cache/models/sort-options.model';
+import { createSuccessfulRemoteDataObject$ } from '../../../shared/testing/utils';
/**
* Service that performs all actions that have to do with the current search configuration
@@ -270,7 +264,7 @@ export class SearchConfigurationService implements OnDestroy {
scope: this.defaultScope,
query: this.defaultQuery
});
- this._defaults = observableOf(new RemoteData(false, false, true, null, options));
+ this._defaults = createSuccessfulRemoteDataObject$(options);
}
return this._defaults;
}
diff --git a/src/app/core/shared/search/search.service.spec.ts b/src/app/core/shared/search/search.service.spec.ts
index ba25aef935..98a8e630b6 100644
--- a/src/app/core/shared/search/search.service.spec.ts
+++ b/src/app/core/shared/search/search.service.spec.ts
@@ -28,6 +28,7 @@ import { DSpaceObjectDataService } from '../../data/dspace-object-data.service';
import { map } from 'rxjs/operators';
import { RouteService } from '../../../shared/services/route.service';
import { routeServiceStub } from '../../../shared/testing/route-service-stub';
+import { createSuccessfulRemoteDataObject$ } from '../../../shared/testing/utils';
@Component({ template: '' })
class DummyComponent {
@@ -91,7 +92,7 @@ describe('SearchService', () => {
);
},
aggregate: (input: Array>>): Observable> => {
- return observableOf(new RemoteData(false, false, true, null, []));
+ return createSuccessfulRemoteDataObject$([]);
}
};
diff --git a/src/app/core/shared/search/search.service.ts b/src/app/core/shared/search/search.service.ts
index bf9a2fa353..8058e1f6ca 100644
--- a/src/app/core/shared/search/search.service.ts
+++ b/src/app/core/shared/search/search.service.ts
@@ -1,6 +1,6 @@
import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs';
import { Injectable, OnDestroy } from '@angular/core';
-import { NavigationExtras, PRIMARY_OUTLET, Router, UrlSegmentGroup } from '@angular/router';
+import { NavigationExtras, Router } from '@angular/router';
import { first, map, switchMap } from 'rxjs/operators';
import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service';
import {
@@ -40,7 +40,6 @@ import { PaginatedSearchOptions } from '../../../shared/search/paginated-search-
import { Community } from '../community.model';
import { CommunityDataService } from '../../data/community-data.service';
import { ViewMode } from '../view-mode.model';
-import { ResourceType } from '../resource-type';
import { DSpaceObjectDataService } from '../../data/dspace-object-data.service';
import { RouteService } from '../../../shared/services/route.service';
@@ -296,7 +295,7 @@ export class SearchService implements OnDestroy {
const scopeObject: Observable> = this.dspaceObjectService.findById(scopeId).pipe(getSucceededRemoteData());
const scopeList: Observable = scopeObject.pipe(
switchMap((dsoRD: RemoteData) => {
- if (dsoRD.payload.type === ResourceType.Community) {
+ if ((dsoRD.payload as any).type === Community.type.value) {
const community: Community = dsoRD.payload as Community;
return observableCombineLatest(community.subcommunities, community.collections).pipe(
map(([subCommunities, collections]) => {
diff --git a/src/app/core/submission/models/normalized-workflowitem.model.ts b/src/app/core/submission/models/normalized-workflowitem.model.ts
index a3fa8992a2..e96024b4ae 100644
--- a/src/app/core/submission/models/normalized-workflowitem.model.ts
+++ b/src/app/core/submission/models/normalized-workflowitem.model.ts
@@ -1,43 +1,46 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
-import { Workflowitem } from './workflowitem.model';
+import { WorkflowItem } from './workflowitem.model';
import { NormalizedSubmissionObject } from './normalized-submission-object.model';
-import { ResourceType } from '../../shared/resource-type';
+import { Collection } from '../../shared/collection.model';
+import { Item } from '../../shared/item.model';
+import { SubmissionDefinitionsModel } from '../../config/models/config-submission-definitions.model';
+import { EPerson } from '../../eperson/models/eperson.model';
/**
* An model class for a NormalizedWorkflowItem.
*/
-@mapsTo(Workflowitem)
+@mapsTo(WorkflowItem)
@inheritSerialization(NormalizedSubmissionObject)
-export class NormalizedWorkflowItem extends NormalizedSubmissionObject {
+export class NormalizedWorkflowItem extends NormalizedSubmissionObject {
/**
* The collection this workflowitem belonging to
*/
@autoserialize
- @relationship(ResourceType.Collection, false)
+ @relationship(Collection, false)
collection: string;
/**
* The item created with this workflowitem
*/
@autoserialize
- @relationship(ResourceType.Item, false)
+ @relationship(Item, false)
item: string;
/**
* The configuration object that define this workflowitem
*/
@autoserialize
- @relationship(ResourceType.SubmissionDefinition, false)
+ @relationship(SubmissionDefinitionsModel, false)
submissionDefinition: string;
/**
* The EPerson who submit this workflowitem
*/
@autoserialize
- @relationship(ResourceType.EPerson, false)
+ @relationship(EPerson, false)
submitter: string;
}
diff --git a/src/app/core/submission/models/normalized-workspaceitem.model.ts b/src/app/core/submission/models/normalized-workspaceitem.model.ts
index 7c15925c98..4275420191 100644
--- a/src/app/core/submission/models/normalized-workspaceitem.model.ts
+++ b/src/app/core/submission/models/normalized-workspaceitem.model.ts
@@ -1,45 +1,47 @@
import { autoserialize, inheritSerialization } from 'cerialize';
-import { Workspaceitem } from './workspaceitem.model';
+import { WorkspaceItem } from './workspaceitem.model';
import { NormalizedSubmissionObject } from './normalized-submission-object.model';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
-import { ResourceType } from '../../shared/resource-type';
-import { Workflowitem } from './workflowitem.model';
+import { Item } from '../../shared/item.model';
+import { Collection } from '../../shared/collection.model';
+import { SubmissionDefinitionModel } from '../../config/models/config-submission-definition.model';
+import { EPerson } from '../../eperson/models/eperson.model';
/**
* An model class for a NormalizedWorkspaceItem.
*/
-@mapsTo(Workspaceitem)
+@mapsTo(WorkspaceItem)
@inheritSerialization(NormalizedDSpaceObject)
@inheritSerialization(NormalizedSubmissionObject)
-export class NormalizedWorkspaceItem extends NormalizedSubmissionObject {
+export class NormalizedWorkspaceItem extends NormalizedSubmissionObject {
/**
* The collection this workspaceitem belonging to
*/
@autoserialize
- @relationship(ResourceType.Collection, false)
+ @relationship(Collection, false)
collection: string;
/**
* The item created with this workspaceitem
*/
@autoserialize
- @relationship(ResourceType.Item, false)
+ @relationship(Item, false)
item: string;
/**
* The configuration object that define this workspaceitem
*/
@autoserialize
- @relationship(ResourceType.SubmissionDefinition, false)
+ @relationship(SubmissionDefinitionModel, false)
submissionDefinition: string;
/**
* The EPerson who submit this workspaceitem
*/
@autoserialize
- @relationship(ResourceType.EPerson, false)
+ @relationship(EPerson, false)
submitter: string;
}
diff --git a/src/app/core/submission/models/workflowitem.model.ts b/src/app/core/submission/models/workflowitem.model.ts
index f1a0467f43..4cfc4d7fa1 100644
--- a/src/app/core/submission/models/workflowitem.model.ts
+++ b/src/app/core/submission/models/workflowitem.model.ts
@@ -1,7 +1,9 @@
-import { Workspaceitem } from './workspaceitem.model';
+import { WorkspaceItem } from './workspaceitem.model';
+import { ResourceType } from '../../shared/resource-type';
/**
- * A model class for a Workflowitem.
+ * A model class for a WorkflowItem.
*/
-export class Workflowitem extends Workspaceitem {
+export class WorkflowItem extends WorkspaceItem {
+ static type = new ResourceType('workflowitem');
}
diff --git a/src/app/core/submission/models/workspaceitem.model.ts b/src/app/core/submission/models/workspaceitem.model.ts
index 6548191ba2..c4bb5b7520 100644
--- a/src/app/core/submission/models/workspaceitem.model.ts
+++ b/src/app/core/submission/models/workspaceitem.model.ts
@@ -1,8 +1,10 @@
import { SubmissionObject } from './submission-object.model';
+import { ResourceType } from '../../shared/resource-type';
/**
- * A model class for a Workspaceitem.
+ * A model class for a WorkspaceItem.
*/
-export class Workspaceitem extends SubmissionObject {
+export class WorkspaceItem extends SubmissionObject {
+ static type = new ResourceType('workspaceitem');
}
diff --git a/src/app/core/submission/submission-resource-type.ts b/src/app/core/submission/submission-resource-type.ts
deleted file mode 100644
index f5b8e2c423..0000000000
--- a/src/app/core/submission/submission-resource-type.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-export enum SubmissionResourceType {
- Bundle = 'bundle',
- Bitstream = 'bitstream',
- BitstreamFormat = 'bitstreamformat',
- Item = 'item',
- Collection = 'collection',
- Community = 'community',
- ResourcePolicy = 'resourcePolicy',
- License = 'license',
- EPerson = 'eperson',
- Group = 'group',
- WorkspaceItem = 'workspaceitem',
- WorkflowItem = 'workflowitem',
- SubmissionDefinitions = 'submissiondefinitions',
- SubmissionDefinition = 'submissiondefinition',
- SubmissionForm = 'submissionform',
- SubmissionForms = 'submissionforms',
- SubmissionSections = 'submissionsections',
- SubmissionSection = 'submissionsection',
- Authority = 'authority'
-}
diff --git a/src/app/core/submission/submission-response-parsing.service.ts b/src/app/core/submission/submission-response-parsing.service.ts
index 21135be463..a0811c8f2d 100644
--- a/src/app/core/submission/submission-response-parsing.service.ts
+++ b/src/app/core/submission/submission-response-parsing.service.ts
@@ -10,12 +10,10 @@ import { BaseResponseParsingService } from '../data/base-response-parsing.servic
import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface';
import { ObjectCacheService } from '../cache/object-cache.service';
-import { SubmissionResourceType } from './submission-resource-type';
import { NormalizedWorkspaceItem } from './models/normalized-workspaceitem.model';
import { NormalizedWorkflowItem } from './models/normalized-workflowitem.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 a function to check if object has same properties of FormFieldMetadataValueObject
@@ -75,7 +73,6 @@ export function normalizeSectionData(obj: any, objIndex?: number) {
@Injectable()
export class SubmissionResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- protected objectFactory = NormalizedObjectFactory;
protected toCache = false;
constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
@@ -94,7 +91,7 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
if (isNotEmpty(data.payload)
&& isNotEmpty(data.payload._links)
&& this.isSuccessStatus(data.statusCode)) {
- const dataDefinition = this.processResponse(data.payload, request.href);
+ const dataDefinition = this.processResponse(data.payload, request.href);
return new SubmissionSuccessResponse(dataDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload));
} else if (isEmpty(data.payload) && this.isSuccessStatus(data.statusCode)) {
return new SubmissionSuccessResponse(null, data.statusCode, data.statusText);
@@ -115,8 +112,8 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
* @param {string} requestHref
* @returns {any[]}
*/
- protected processResponse(data: any, requestHref: string): any[] {
- const dataDefinition = this.process(data, requestHref);
+ protected processResponse(data: any, requestHref: string): any[] {
+ const dataDefinition = this.process(data, requestHref);
const normalizedDefinition = Array.of();
const processedList = Array.isArray(dataDefinition) ? dataDefinition : Array.of(dataDefinition);
diff --git a/src/app/core/submission/workflowitem-data.service.ts b/src/app/core/submission/workflowitem-data.service.ts
index e739a62e81..fd769745da 100644
--- a/src/app/core/submission/workflowitem-data.service.ts
+++ b/src/app/core/submission/workflowitem-data.service.ts
@@ -6,7 +6,7 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv
import { CoreState } from '../core.reducers';
import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service';
-import { Workflowitem } from './models/workflowitem.model';
+import { WorkflowItem } from './models/workflowitem.model';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { FindAllOptions } from '../data/request.models';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
@@ -18,12 +18,12 @@ import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
* A service that provides methods to make REST requests with workflowitems endpoint.
*/
@Injectable()
-export class WorkflowitemDataService extends DataService {
+export class WorkflowItemDataService extends DataService {
protected linkPath = 'workflowitems';
protected forceBypassCache = true;
constructor(
- protected comparator: DSOChangeAnalyzer,
+ protected comparator: DSOChangeAnalyzer,
protected dataBuildService: NormalizedObjectBuildService,
protected halService: HALEndpointService,
protected http: HttpClient,
diff --git a/src/app/core/submission/workspaceitem-data.service.ts b/src/app/core/submission/workspaceitem-data.service.ts
index 3bb3eb1ee8..de671d57c7 100644
--- a/src/app/core/submission/workspaceitem-data.service.ts
+++ b/src/app/core/submission/workspaceitem-data.service.ts
@@ -6,24 +6,24 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv
import { CoreState } from '../core.reducers';
import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service';
-import { Workspaceitem } from './models/workspaceitem.model';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { FindAllOptions } from '../data/request.models';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { ObjectCacheService } from '../cache/object-cache.service';
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
+import { WorkspaceItem } from './models/workspaceitem.model';
/**
* A service that provides methods to make REST requests with workspaceitems endpoint.
*/
@Injectable()
-export class WorkspaceitemDataService extends DataService {
+export class WorkspaceitemDataService extends DataService {
protected linkPath = 'workspaceitems';
protected forceBypassCache = true;
constructor(
- protected comparator: DSOChangeAnalyzer,
+ protected comparator: DSOChangeAnalyzer,
protected dataBuildService: NormalizedObjectBuildService,
protected halService: HALEndpointService,
protected http: HttpClient,
diff --git a/src/app/core/tasks/models/claimed-task-object.model.ts b/src/app/core/tasks/models/claimed-task-object.model.ts
index 212e75ed95..2f427f586f 100644
--- a/src/app/core/tasks/models/claimed-task-object.model.ts
+++ b/src/app/core/tasks/models/claimed-task-object.model.ts
@@ -1,8 +1,9 @@
import { TaskObject } from './task-object.model';
+import { ResourceType } from '../../shared/resource-type';
/**
* A model class for a ClaimedTask.
*/
export class ClaimedTask extends TaskObject {
-
+ static type = new ResourceType('claimedtask');
}
diff --git a/src/app/core/tasks/models/normalized-claimed-task-object.model.ts b/src/app/core/tasks/models/normalized-claimed-task-object.model.ts
index c2c3f12bc4..d43a277f02 100644
--- a/src/app/core/tasks/models/normalized-claimed-task-object.model.ts
+++ b/src/app/core/tasks/models/normalized-claimed-task-object.model.ts
@@ -2,7 +2,9 @@ import { NormalizedTaskObject } from './normalized-task-object.model';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
import { autoserialize, inheritSerialization } from 'cerialize';
import { ClaimedTask } from './claimed-task-object.model';
-import { ResourceType } from '../../shared/resource-type';
+import { EPerson } from '../../eperson/models/eperson.model';
+import { Group } from '../../eperson/models/group.model';
+import { WorkflowItem } from '../../submission/models/workflowitem.model';
/**
* A normalized model class for a ClaimedTask.
@@ -10,7 +12,6 @@ import { ResourceType } from '../../shared/resource-type';
@mapsTo(ClaimedTask)
@inheritSerialization(NormalizedTaskObject)
export class NormalizedClaimedTask extends NormalizedTaskObject {
-
/**
* The task identifier
*/
@@ -29,11 +30,25 @@ export class NormalizedClaimedTask extends NormalizedTaskObject {
@autoserialize
action: string;
+ /**
+ * The eperson object for this task
+ */
+ @autoserialize
+ @relationship(EPerson, false)
+ eperson: string;
+
+ /**
+ * The group object for this task
+ */
+ @autoserialize
+ @relationship(Group, false)
+ group: string;
+
/**
* The workflowitem object whom this task is related
*/
@autoserialize
- @relationship(ResourceType.Workflowitem, false)
+ @relationship(WorkflowItem, false)
workflowitem: string;
}
diff --git a/src/app/core/tasks/models/normalized-pool-task-object.model.ts b/src/app/core/tasks/models/normalized-pool-task-object.model.ts
index 22cda6ff9c..bfc782f182 100644
--- a/src/app/core/tasks/models/normalized-pool-task-object.model.ts
+++ b/src/app/core/tasks/models/normalized-pool-task-object.model.ts
@@ -2,7 +2,8 @@ import { NormalizedTaskObject } from './normalized-task-object.model';
import { PoolTask } from './pool-task-object.model';
import { autoserialize, inheritSerialization } from 'cerialize';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
+import { Group } from '../../eperson/models/group.model';
+import { WorkflowItem } from '../../submission/models/workflowitem.model';
/**
* A normalized model class for a PoolTask.
@@ -10,7 +11,6 @@ import { ResourceType } from '../../shared/resource-type';
@mapsTo(PoolTask)
@inheritSerialization(NormalizedTaskObject)
export class NormalizedPoolTask extends NormalizedTaskObject {
-
/**
* The task identifier
*/
@@ -29,10 +29,17 @@ export class NormalizedPoolTask extends NormalizedTaskObject {
@autoserialize
action: string;
+ /**
+ * The group object for this task
+ */
+ @autoserialize
+ @relationship(Group, false)
+ group: string;
+
/**
* The workflowitem object whom this task is related
*/
@autoserialize
- @relationship(ResourceType.Workflowitem, false)
+ @relationship(WorkflowItem, false)
workflowitem: string;
}
diff --git a/src/app/core/tasks/models/normalized-task-object.model.ts b/src/app/core/tasks/models/normalized-task-object.model.ts
index 52c274e3a8..2c96b95393 100644
--- a/src/app/core/tasks/models/normalized-task-object.model.ts
+++ b/src/app/core/tasks/models/normalized-task-object.model.ts
@@ -1,16 +1,18 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { mapsTo, relationship } from '../../cache/builders/build-decorators';
-import { ResourceType } from '../../shared/resource-type';
import { NormalizedDSpaceObject } from '../../cache/models/normalized-dspace-object.model';
import { TaskObject } from './task-object.model';
import { DSpaceObject } from '../../shared/dspace-object.model';
+import { Group } from '../../eperson/models/group.model';
+import { EPerson } from '../../eperson/models/eperson.model';
+import { WorkflowItem } from '../../submission/models/workflowitem.model';
/**
* An abstract normalized model class for a TaskObject.
*/
@mapsTo(TaskObject)
@inheritSerialization(NormalizedDSpaceObject)
-export abstract class NormalizedTaskObject extends NormalizedDSpaceObject {
+export class NormalizedTaskObject extends NormalizedDSpaceObject {
/**
* The task identifier
@@ -30,10 +32,24 @@ export abstract class NormalizedTaskObject extends Norma
@autoserialize
action: string;
+ /**
+ * The eperson object for this task
+ */
+ @autoserialize
+ @relationship(EPerson, false)
+ eperson: string;
+
+ /**
+ * The group object for this task
+ */
+ @autoserialize
+ @relationship(Group, false)
+ group: string;
+
/**
* The workflowitem object whom this task is related
*/
@autoserialize
- @relationship(ResourceType.Workflowitem, false)
+ @relationship(WorkflowItem, false)
workflowitem: string;
}
diff --git a/src/app/core/tasks/models/pool-task-object.model.ts b/src/app/core/tasks/models/pool-task-object.model.ts
index 8d98d3e1a5..876b62373d 100644
--- a/src/app/core/tasks/models/pool-task-object.model.ts
+++ b/src/app/core/tasks/models/pool-task-object.model.ts
@@ -1,8 +1,9 @@
import { TaskObject } from './task-object.model';
+import { ResourceType } from '../../shared/resource-type';
/**
* A model class for a PoolTask.
*/
export class PoolTask extends TaskObject {
-
+ static type = new ResourceType('pooltask');
}
diff --git a/src/app/core/tasks/models/task-object.model.ts b/src/app/core/tasks/models/task-object.model.ts
index cc48a73514..1f37548b04 100644
--- a/src/app/core/tasks/models/task-object.model.ts
+++ b/src/app/core/tasks/models/task-object.model.ts
@@ -3,12 +3,16 @@ import { Observable } from 'rxjs';
import { CacheableObject } from '../../cache/object-cache.reducer';
import { DSpaceObject } from '../../shared/dspace-object.model';
import { RemoteData } from '../../data/remote-data';
-import { Workflowitem } from '../../submission/models/workflowitem.model';
+import { WorkflowItem } from '../../submission/models/workflowitem.model';
+import { ResourceType } from '../../shared/resource-type';
+import { EPerson } from '../../eperson/models/eperson.model';
+import { Group } from '../../eperson/models/group.model';
/**
* An abstract model class for a TaskObject.
*/
export class TaskObject extends DSpaceObject implements CacheableObject {
+ static type = new ResourceType('taskobject');
/**
* The task identifier
@@ -25,8 +29,18 @@ export class TaskObject extends DSpaceObject implements CacheableObject {
*/
action: string;
+ /**
+ * The group of this task
+ */
+ eperson: Observable>;
+
+ /**
+ * The group of this task
+ */
+ group: Observable>;
+
/**
* The workflowitem object whom this task is related
*/
- workflowitem: Observable> | Workflowitem;
+ workflowitem: Observable> | WorkflowItem;
}
diff --git a/src/app/core/tasks/task-response-parsing.service.ts b/src/app/core/tasks/task-response-parsing.service.ts
index 7445f9d267..090b67ccbb 100644
--- a/src/app/core/tasks/task-response-parsing.service.ts
+++ b/src/app/core/tasks/task-response-parsing.service.ts
@@ -8,7 +8,6 @@ import { BaseResponseParsingService } from '../data/base-response-parsing.servic
import { GLOBAL_CONFIG } from '../../../config';
import { GlobalConfig } from '../../../config/global-config.interface';
import { ObjectCacheService } from '../cache/object-cache.service';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
import { ErrorResponse, RestResponse, TaskResponse } from '../cache/response.models';
/**
@@ -17,7 +16,6 @@ import { ErrorResponse, RestResponse, TaskResponse } from '../cache/response.mod
@Injectable()
export class TaskResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
- protected objectFactory = NormalizedObjectFactory;
protected toCache = false;
/**
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts
index 7c4f4349c3..00403473a7 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts
@@ -8,9 +8,10 @@ import {
createRelationshipsObservable,
getItemPageFieldsTest
} from '../../../../+item-page/simple/item-types/shared/item.component.spec';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
'publicationissue.issueNumber': [
{
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts
index e5da5675f4..d2b3420b2a 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts
@@ -8,9 +8,10 @@ import {
createRelationshipsObservable,
getItemPageFieldsTest
} from '../../../../+item-page/simple/item-types/shared/item.component.spec';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
'publicationvolume.volumeNumber': [
{
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
index 9690c74966..c66c3a2462 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
@@ -15,12 +15,13 @@ import { isNotEmpty } from '../../../../shared/empty.util';
import { JournalComponent } from './journal.component';
import { of as observableOf } from 'rxjs';
import { GenericItemPageFieldComponent } from '../../../../+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
let comp: JournalComponent;
let fixture: ComponentFixture;
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
'creativeworkseries.issn': [
{
diff --git a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts
index b415879df3..a49105b2e3 100644
--- a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts
@@ -8,9 +8,10 @@ import {
createRelationshipsObservable,
getItemPageFieldsTest
} from '../../../../+item-page/simple/item-types/shared/item.component.spec';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
'organization.foundingDate': [
{
diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts
index 73f61983fc..4c523b81cb 100644
--- a/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts
@@ -8,9 +8,10 @@ import {
createRelationshipsObservable,
getItemPageFieldsTest
} from '../../../../+item-page/simple/item-types/shared/item.component.spec';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
'person.email': [
{
diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts
index ad4b70e2aa..5185857494 100644
--- a/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts
@@ -8,9 +8,10 @@ import {
createRelationshipsObservable,
getItemPageFieldsTest
} from '../../../../+item-page/simple/item-types/shared/item.component.spec';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
const mockItem: Item = Object.assign(new Item(), {
- bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
+ bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
metadata: {
// 'project.identifier.status': [
// {
diff --git a/src/app/shared/browse-by/browse-by.component.spec.ts b/src/app/shared/browse-by/browse-by.component.spec.ts
index bae345d009..5592b88c86 100644
--- a/src/app/shared/browse-by/browse-by.component.spec.ts
+++ b/src/app/shared/browse-by/browse-by.component.spec.ts
@@ -17,6 +17,7 @@ import { RouterTestingModule } from '@angular/router/testing';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model';
+import { createSuccessfulRemoteDataObject$ } from '../testing/utils';
describe('BrowseByComponent', () => {
let comp: BrowseByComponent;
@@ -42,7 +43,7 @@ describe('BrowseByComponent', () => {
]
})
];
- const mockItemsRD$ = observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), mockItems)));
+ const mockItemsRD$ = createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), mockItems));
beforeEach(async(() => {
TestBed.configureTestingModule({
diff --git a/src/app/shared/comcol-forms/comcol-form/comcol-form.component.spec.ts b/src/app/shared/comcol-forms/comcol-form/comcol-form.component.spec.ts
index 3f52f0e46a..1b44970402 100644
--- a/src/app/shared/comcol-forms/comcol-form/comcol-form.component.spec.ts
+++ b/src/app/shared/comcol-forms/comcol-form/comcol-form.component.spec.ts
@@ -103,7 +103,7 @@ describe('ComColFormComponent', () => {
...randomMD,
...abstractMD
},
- type: ResourceType.Community
+ type: Community.type
},
)
);
diff --git a/src/app/shared/comcol-forms/comcol-form/comcol-form.component.ts b/src/app/shared/comcol-forms/comcol-form/comcol-form.component.ts
index e24676a646..6a96892b06 100644
--- a/src/app/shared/comcol-forms/comcol-form/comcol-form.component.ts
+++ b/src/app/shared/comcol-forms/comcol-form/comcol-form.component.ts
@@ -10,7 +10,7 @@ import { TranslateService } from '@ngx-translate/core';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { MetadataMap, MetadataValue } from '../../../core/shared/metadata.models';
import { isNotEmpty } from '../../empty.util';
-import { ResourceType } from '../../../core/shared/resource-type';
+import { Community } from '../../../core/shared/community.model';
/**
* A form for creating and editing Communities or Collections
@@ -99,7 +99,7 @@ export class ComColFormComponent implements OnInit {
...this.dso.metadata,
...formMetadata
},
- type: ResourceType.Community
+ type: Community.type
});
this.submitForm.emit(updatedDSO);
}
diff --git a/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.spec.ts b/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.spec.ts
index 4dad4a703f..08f15ad052 100644
--- a/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.spec.ts
+++ b/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.spec.ts
@@ -4,7 +4,6 @@ import { RouteService } from '../../services/route.service';
import { Router } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { of as observableOf } from 'rxjs';
-import { RemoteData } from '../../../core/data/remote-data';
import { Community } from '../../../core/shared/community.model';
import { SharedModule } from '../../shared.module';
import { CommonModule } from '@angular/common';
@@ -13,6 +12,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { CreateComColPageComponent } from './create-comcol-page.component';
import { DataService } from '../../../core/data/data.service';
+import {
+ createFailedRemoteDataObject$,
+ createSuccessfulRemoteDataObject$
+} from '../../testing/utils';
describe('CreateComColPageComponent', () => {
let comp: CreateComColPageComponent;
@@ -46,14 +49,14 @@ describe('CreateComColPageComponent', () => {
});
communityDataServiceStub = {
- findById: (uuid) => observableOf(new RemoteData(false, false, true, null, Object.assign(new Community(), {
+ findById: (uuid) => createSuccessfulRemoteDataObject$(Object.assign(new Community(), {
uuid: uuid,
metadata: [{
key: 'dc.title',
value: community.name
}]
- }))),
- create: (com, uuid?) => observableOf(new RemoteData(false, false, true, undefined, newCommunity))
+ })),
+ create: (com, uuid?) => createSuccessfulRemoteDataObject$(newCommunity)
};
@@ -109,7 +112,7 @@ describe('CreateComColPageComponent', () => {
it('should not navigate on failure', () => {
spyOn(router, 'navigate');
- spyOn(dsoDataService, 'create').and.returnValue(observableOf(new RemoteData(true, true, false, undefined, newCommunity)));
+ spyOn(dsoDataService, 'create').and.returnValue(createFailedRemoteDataObject$(newCommunity));
comp.onSubmit(data);
fixture.detectChanges();
expect(router.navigate).not.toHaveBeenCalled();
diff --git a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts
index e2e73bae14..57c860e04f 100644
--- a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts
+++ b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts
@@ -47,10 +47,10 @@ export class DeleteComColPageComponent implements
.pipe(first())
.subscribe((success: boolean) => {
if (success) {
- const successMessage = this.translate.instant(dso.type + '.delete.notification.success');
+ const successMessage = this.translate.instant((dso as any).type + '.delete.notification.success');
this.notifications.success(successMessage)
} else {
- const errorMessage = this.translate.instant(dso.type + '.delete.notification.fail');
+ const errorMessage = this.translate.instant((dso as any).type + '.delete.notification.fail');
this.notifications.error(errorMessage)
}
this.router.navigate(['/']);
diff --git a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts
index 75b7fe40e7..03f751599f 100644
--- a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts
+++ b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts
@@ -3,7 +3,6 @@ import { CommunityDataService } from '../../../core/data/community-data.service'
import { ActivatedRoute, Router } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { of as observableOf } from 'rxjs';
-import { RemoteData } from '../../../core/data/remote-data';
import { Community } from '../../../core/shared/community.model';
import { SharedModule } from '../../shared.module';
import { CommonModule } from '@angular/common';
@@ -12,6 +11,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { EditComColPageComponent } from './edit-comcol-page.component';
import { DataService } from '../../../core/data/data.service';
+import {
+ createFailedRemoteDataObject$,
+ createSuccessfulRemoteDataObject$
+} from '../../testing/utils';
describe('EditComColPageComponent', () => {
let comp: EditComColPageComponent;
@@ -43,7 +46,7 @@ describe('EditComColPageComponent', () => {
});
communityDataServiceStub = {
- update: (com, uuid?) => observableOf(new RemoteData(false, false, true, undefined, newCommunity))
+ update: (com, uuid?) => createSuccessfulRemoteDataObject$(newCommunity)
};
@@ -97,7 +100,7 @@ describe('EditComColPageComponent', () => {
it('should not navigate on failure', () => {
spyOn(router, 'navigate');
- spyOn(dsoDataService, 'update').and.returnValue(observableOf(new RemoteData(true, true, false, undefined, newCommunity)));
+ spyOn(dsoDataService, 'update').and.returnValue(createFailedRemoteDataObject$(newCommunity));
comp.onSubmit(data);
fixture.detectChanges();
expect(router.navigate).not.toHaveBeenCalled();
diff --git a/src/app/shared/dso-selector/dso-selector/dso-selector.component.spec.ts b/src/app/shared/dso-selector/dso-selector/dso-selector.component.spec.ts
index 4203d43021..2de59d614b 100644
--- a/src/app/shared/dso-selector/dso-selector/dso-selector.component.spec.ts
+++ b/src/app/shared/dso-selector/dso-selector/dso-selector.component.spec.ts
@@ -4,13 +4,12 @@ import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import { DSOSelectorComponent } from './dso-selector.component';
import { SearchService } from '../../../core/shared/search/search.service';
import { DSpaceObjectType } from '../../../core/shared/dspace-object-type.model';
-import { PaginatedSearchOptions } from '../../search/paginated-search-options.model';
-import { RemoteData } from '../../../core/data/remote-data';
import { ItemSearchResult } from '../../object-collection/shared/item-search-result.model';
import { Item } from '../../../core/shared/item.model';
-import { of as observableOf } from 'rxjs';
import { PaginatedList } from '../../../core/data/paginated-list';
import { MetadataValue } from '../../../core/shared/metadata.models';
+import { createSuccessfulRemoteDataObject$ } from '../../testing/utils';
+import { PaginatedSearchOptions } from '../../search/paginated-search-options.model';
describe('DSOSelectorComponent', () => {
let component: DSOSelectorComponent;
@@ -30,7 +29,7 @@ describe('DSOSelectorComponent', () => {
searchResult.indexableObject = item;
searchResult.hitHighlights = {};
const searchService = jasmine.createSpyObj('searchService', {
- search: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(undefined, [searchResult])))
+ search: createSuccessfulRemoteDataObject$(new PaginatedList(undefined, [searchResult]))
});
beforeEach(async(() => {
@@ -68,6 +67,4 @@ describe('DSOSelectorComponent', () => {
expect(searchService.search).toHaveBeenCalledWith(searchOptions);
});
-
-})
-;
+});
diff --git a/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.spec.ts b/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.spec.ts
index 9efeddeeab..97957d5250 100644
--- a/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.spec.ts
+++ b/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.spec.ts
@@ -10,6 +10,7 @@ import * as collectionRouter from '../../../../+collection-page/collection-page-
import { Community } from '../../../../core/shared/community.model';
import { CreateCollectionParentSelectorComponent } from './create-collection-parent-selector.component';
import { MetadataValue } from '../../../../core/shared/metadata.models';
+import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
describe('CreateCollectionParentSelectorComponent', () => {
let component: CreateCollectionParentSelectorComponent;
@@ -26,7 +27,7 @@ describe('CreateCollectionParentSelectorComponent', () => {
})]
};
const router = new RouterStub();
- const communityRD = new RemoteData(false, false, true, undefined, community);
+ const communityRD = createSuccessfulRemoteDataObject(community);
const modalStub = jasmine.createSpyObj('modalStub', ['close']);
const createPath = 'testCreatePath';
diff --git a/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.spec.ts b/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.spec.ts
index e1bb9c7997..4871d74b98 100644
--- a/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.spec.ts
+++ b/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.spec.ts
@@ -10,6 +10,7 @@ import * as communityRouter from '../../../../+community-page/community-page-rou
import { Community } from '../../../../core/shared/community.model';
import { CreateCommunityParentSelectorComponent } from './create-community-parent-selector.component';
import { MetadataValue } from '../../../../core/shared/metadata.models';
+import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
describe('CreateCommunityParentSelectorComponent', () => {
let component: CreateCommunityParentSelectorComponent;
@@ -20,7 +21,7 @@ describe('CreateCommunityParentSelectorComponent', () => {
community.uuid = '1234-1234-1234-1234';
community.metadata = { 'dc.title': [Object.assign(new MetadataValue(), { value: 'Community title', language: undefined })] };
const router = new RouterStub();
- const communityRD = new RemoteData(false, false, true, undefined, community);
+ const communityRD = createSuccessfulRemoteDataObject(community);
const modalStub = jasmine.createSpyObj('modalStub', ['close']);
const createPath = 'testCreatePath';
diff --git a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.spec.ts b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.spec.ts
index 19bb58eb5a..2c9b2499ab 100644
--- a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.spec.ts
+++ b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.spec.ts
@@ -9,6 +9,7 @@ import { RouterStub } from '../../../testing/router-stub';
import { Collection } from '../../../../core/shared/collection.model';
import { CreateItemParentSelectorComponent } from './create-item-parent-selector.component';
import { MetadataValue } from '../../../../core/shared/metadata.models';
+import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
describe('CreateItemParentSelectorComponent', () => {
let component: CreateItemParentSelectorComponent;
@@ -19,7 +20,7 @@ describe('CreateItemParentSelectorComponent', () => {
collection.uuid = '1234-1234-1234-1234';
collection.metadata = { 'dc.title': [Object.assign(new MetadataValue(), { value: 'Collection title', language: undefined })] };
const router = new RouterStub();
- const collectionRD = new RemoteData(false, false, true, undefined, collection);
+ const collectionRD = createSuccessfulRemoteDataObject(collection);
const modalStub = jasmine.createSpyObj('modalStub', ['close']);
const createPath = 'testCreatePath';
diff --git a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html
index 88f4a6f917..1181e097eb 100644
--- a/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html
+++ b/src/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html
@@ -5,6 +5,6 @@