From bb76015aa12886337fb65154630d7fd925b8d7f7 Mon Sep 17 00:00:00 2001
From: lotte <lotte_hofstede@hotmail.com>
Date: Tue, 18 Jun 2019 08:58:35 +0200
Subject: [PATCH] Solved issue with non-existing search pages

---
 .../create-collection-page.component.spec.ts  |  2 +-
 .../create-collection-page.component.ts       |  2 +-
 .../create-community-page.component.spec.ts   |  2 +-
 .../create-community-page.component.ts        |  2 +-
 .../delete-community-page.component.spec.ts   |  2 +-
 .../my-dspace-configuration.service.ts        |  2 +-
 .../my-dspace-page.component.spec.ts          |  2 +-
 .../filtered-search-page.component.ts         |  7 +++-
 .../filtered-search-page.guard.ts             | 37 +++++++++++++++++--
 .../search-filter/search-filter.service.ts    |  2 +-
 .../search-fixed-filter.service.spec.ts       |  2 +-
 .../search-fixed-filter.service.ts            |  4 +-
 .../search-range-filter.component.spec.ts     |  2 +-
 .../search-range-filter.component.ts          |  2 +-
 .../search-page-routing.module.ts             |  9 ++++-
 .../search-page.component.spec.ts             |  2 +-
 src/app/+search-page/search-page.component.ts | 10 ++---
 .../search-configuration.service.ts           |  2 +-
 .../search-service/search.service.spec.ts     |  2 +-
 .../search-service/search.service.ts          |  2 +-
 src/app/app.component.spec.ts                 |  4 +-
 src/app/app.component.ts                      |  4 +-
 src/app/core/auth/auth.service.spec.ts        |  6 +--
 src/app/core/auth/auth.service.ts             |  4 +-
 src/app/core/core.effects.ts                  |  2 +-
 src/app/core/core.module.ts                   |  8 ++--
 src/app/core/core.reducers.ts                 |  2 +-
 .../{shared => core}/services/api.service.ts  |  0
 .../services/client-cookie.service.ts         |  0
 .../services/cookie.service.spec.ts           |  0
 .../services/cookie.service.ts                |  0
 .../services/route.actions.ts                 |  0
 .../services/route.effects.ts                 |  0
 .../services/route.reducer.ts                 |  0
 .../services/route.service.spec.ts            |  4 +-
 .../services/route.service.ts                 | 10 ++---
 .../services/server-cookie.service.ts         |  0
 .../services/server-response.service.ts       |  0
 .../services/window.service.ts                |  0
 .../pagenotfound/pagenotfound.component.ts    |  2 +-
 .../create-comcol-page.component.spec.ts      |  2 +-
 .../create-comcol-page.component.ts           |  2 +-
 src/app/submission/submission.module.ts       |  2 +-
 src/app/submission/submission.service.spec.ts |  2 +-
 src/app/submission/submission.service.ts      |  2 +-
 src/modules/app/browser-app.module.ts         |  4 +-
 src/modules/app/server-app.module.ts          |  4 +-
 47 files changed, 99 insertions(+), 62 deletions(-)
 rename src/app/{shared => core}/services/api.service.ts (100%)
 rename src/app/{shared => core}/services/client-cookie.service.ts (100%)
 rename src/app/{shared => core}/services/cookie.service.spec.ts (100%)
 rename src/app/{shared => core}/services/cookie.service.ts (100%)
 rename src/app/{shared => core}/services/route.actions.ts (100%)
 rename src/app/{shared => core}/services/route.effects.ts (100%)
 rename src/app/{shared => core}/services/route.reducer.ts (100%)
 rename src/app/{shared => core}/services/route.service.spec.ts (97%)
 rename src/app/{shared => core}/services/route.service.ts (95%)
 rename src/app/{shared => core}/services/server-cookie.service.ts (100%)
 rename src/app/{shared => core}/services/server-response.service.ts (100%)
 rename src/app/{shared => core}/services/window.service.ts (100%)

diff --git a/src/app/+collection-page/create-collection-page/create-collection-page.component.spec.ts b/src/app/+collection-page/create-collection-page/create-collection-page.component.spec.ts
index 29350a83e0..e223b11c65 100644
--- a/src/app/+collection-page/create-collection-page/create-collection-page.component.spec.ts
+++ b/src/app/+collection-page/create-collection-page/create-collection-page.component.spec.ts
@@ -4,7 +4,7 @@ import { TranslateModule } from '@ngx-translate/core';
 import { CommonModule } from '@angular/common';
 import { RouterTestingModule } from '@angular/router/testing';
 import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { SharedModule } from '../../shared/shared.module';
 import { CollectionDataService } from '../../core/data/collection-data.service';
 import { of as observableOf } from 'rxjs';
diff --git a/src/app/+collection-page/create-collection-page/create-collection-page.component.ts b/src/app/+collection-page/create-collection-page/create-collection-page.component.ts
index 94229b4932..2cab36d285 100644
--- a/src/app/+collection-page/create-collection-page/create-collection-page.component.ts
+++ b/src/app/+collection-page/create-collection-page/create-collection-page.component.ts
@@ -1,6 +1,6 @@
 import { Component } from '@angular/core';
 import { CommunityDataService } from '../../core/data/community-data.service';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { Router } from '@angular/router';
 import { CreateComColPageComponent } from '../../shared/comcol-forms/create-comcol-page/create-comcol-page.component';
 import { Collection } from '../../core/shared/collection.model';
diff --git a/src/app/+community-page/create-community-page/create-community-page.component.spec.ts b/src/app/+community-page/create-community-page/create-community-page.component.spec.ts
index dba15dbe88..dead5a5c3b 100644
--- a/src/app/+community-page/create-community-page/create-community-page.component.spec.ts
+++ b/src/app/+community-page/create-community-page/create-community-page.component.spec.ts
@@ -4,7 +4,7 @@ import { TranslateModule } from '@ngx-translate/core';
 import { CommonModule } from '@angular/common';
 import { RouterTestingModule } from '@angular/router/testing';
 import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { SharedModule } from '../../shared/shared.module';
 import { CollectionDataService } from '../../core/data/collection-data.service';
 import { of as observableOf } from 'rxjs';
diff --git a/src/app/+community-page/create-community-page/create-community-page.component.ts b/src/app/+community-page/create-community-page/create-community-page.component.ts
index 828d8338af..fd5f18442a 100644
--- a/src/app/+community-page/create-community-page/create-community-page.component.ts
+++ b/src/app/+community-page/create-community-page/create-community-page.component.ts
@@ -1,7 +1,7 @@
 import { Component } from '@angular/core';
 import { Community } from '../../core/shared/community.model';
 import { CommunityDataService } from '../../core/data/community-data.service';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { Router } from '@angular/router';
 import { CreateComColPageComponent } from '../../shared/comcol-forms/create-comcol-page/create-comcol-page.component';
 
diff --git a/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts b/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts
index f18c4fb1f1..c23df93976 100644
--- a/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts
+++ b/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts
@@ -4,7 +4,7 @@ import { TranslateModule } from '@ngx-translate/core';
 import { CommonModule } from '@angular/common';
 import { RouterTestingModule } from '@angular/router/testing';
 import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { SharedModule } from '../../shared/shared.module';
 import { of as observableOf } from 'rxjs';
 import { NotificationsService } from '../../shared/notifications/notifications.service';
diff --git a/src/app/+my-dspace-page/my-dspace-configuration.service.ts b/src/app/+my-dspace-page/my-dspace-configuration.service.ts
index 705ec897f8..39c7574407 100644
--- a/src/app/+my-dspace-page/my-dspace-configuration.service.ts
+++ b/src/app/+my-dspace-page/my-dspace-configuration.service.ts
@@ -8,7 +8,7 @@ import { MyDSpaceConfigurationValueType } from './my-dspace-configuration-value-
 import { RoleService } from '../core/roles/role.service';
 import { SearchConfigurationOption } from '../+search-page/search-switch-configuration/search-configuration-option.model';
 import { SearchConfigurationService } from '../+search-page/search-service/search-configuration.service';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from '../core/services/route.service';
 import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model';
 import { SortDirection, SortOptions } from '../core/cache/models/sort-options.model';
 import { SearchFixedFilterService } from '../+search-page/search-filters/search-filter/search-fixed-filter.service';
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 9658814a6a..d31d724b9e 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
@@ -17,7 +17,7 @@ import { HostWindowService } from '../shared/host-window.service';
 import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model';
 import { RemoteData } from '../core/data/remote-data';
 import { MyDSpacePageComponent, SEARCH_CONFIG_SERVICE } from './my-dspace-page.component';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from '../core/services/route.service';
 import { routeServiceStub } from '../shared/testing/route-service-stub';
 import { SearchConfigurationServiceStub } from '../shared/testing/search-configuration-service-stub';
 import { SearchService } from '../+search-page/search-service/search.service';
diff --git a/src/app/+search-page/filtered-search-page.component.ts b/src/app/+search-page/filtered-search-page.component.ts
index 66c619b823..85d521ee15 100644
--- a/src/app/+search-page/filtered-search-page.component.ts
+++ b/src/app/+search-page/filtered-search-page.component.ts
@@ -4,12 +4,14 @@ import { SearchSidebarService } from './search-sidebar/search-sidebar.service';
 import { SearchPageComponent } from './search-page.component';
 import { ChangeDetectionStrategy, Component, Inject, Input, OnInit } from '@angular/core';
 import { pushInOut } from '../shared/animations/push';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from '../core/services/route.service';
 import { SearchConfigurationService } from './search-service/search-configuration.service';
 import { Observable } from 'rxjs';
 import { PaginatedSearchOptions } from './paginated-search-options.model';
 import { SEARCH_CONFIG_SERVICE } from '../+my-dspace-page/my-dspace-page.component';
 import { map } from 'rxjs/operators';
+import { isEmpty, isNotEmpty } from '../shared/empty.util';
+import { ActivatedRoute } from '@angular/router';
 
 /**
  * This component renders a simple item page.
@@ -53,6 +55,9 @@ export class FilteredSearchPageComponent extends SearchPageComponent implements
    * If something changes, update the list of scopes for the dropdown
    */
   ngOnInit(): void {
+    if (isEmpty(this.fixedFilter$)) {
+      this.fixedFilter$ = this.routeService.getRouteParameterValue('filter');
+    }
     super.ngOnInit();
   }
 
diff --git a/src/app/+search-page/filtered-search-page.guard.ts b/src/app/+search-page/filtered-search-page.guard.ts
index 6d41d4965d..e28dadec71 100644
--- a/src/app/+search-page/filtered-search-page.guard.ts
+++ b/src/app/+search-page/filtered-search-page.guard.ts
@@ -1,6 +1,16 @@
 import { Injectable } from '@angular/core';
-import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
+import {
+  ActivatedRouteSnapshot,
+  CanActivate,
+  NavigationEnd,
+  Router,
+  RouterStateSnapshot
+} from '@angular/router';
 import { Observable } from 'rxjs';
+import { SearchFixedFilterService } from './search-filters/search-filter/search-fixed-filter.service';
+import { map, take, tap, filter } from 'rxjs/operators';
+import { isEmpty, isNotEmpty } from '../shared/empty.util';
+import { Location } from '@angular/common';
 
 @Injectable()
 /**
@@ -9,14 +19,33 @@ import { Observable } from 'rxjs';
  * - filter: The current filter stored in route.params
  */
 export class FilteredSearchPageGuard implements CanActivate {
+  constructor(private service: SearchFixedFilterService, private router: Router, private location: Location) {
+  }
+
   canActivate(
     route: ActivatedRouteSnapshot,
     state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
-    const filter = route.params.filter;
+    route.params = Object.assign({}, route.params, { filter: route.params.filter.toLowerCase() });
+    const filterName = route.params.filter;
 
-    const newTitle = filter + '.search.title';
+    const newTitle = filterName + '.search.title';
 
     route.data = { title: newTitle };
-    return true;
+
+    return this.service.getQueryByFilterName(filterName).pipe(
+      tap((query) => {
+          if (isEmpty(query)) {
+            this.router.navigateByUrl('/404', { skipLocationChange: true });
+            this.router.events
+              .pipe(
+                filter((event) => event instanceof NavigationEnd),
+                take(1)
+              )
+              .subscribe(() => this.location.replaceState(state.url));
+          }
+        }
+      ),
+      map((query) => isNotEmpty(query))
+    );
   }
 }
diff --git a/src/app/+search-page/search-filters/search-filter/search-filter.service.ts b/src/app/+search-page/search-filters/search-filter/search-filter.service.ts
index 6024ad7249..8482838101 100644
--- a/src/app/+search-page/search-filters/search-filter/search-filter.service.ts
+++ b/src/app/+search-page/search-filters/search-filter/search-filter.service.ts
@@ -14,7 +14,7 @@ import {
 } from './search-filter.actions';
 import { hasValue, isNotEmpty, } from '../../../shared/empty.util';
 import { SearchFilterConfig } from '../../search-service/search-filter-config.model';
-import { RouteService } from '../../../shared/services/route.service';
+import { RouteService } from '../../../core/services/route.service';
 import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model';
 import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
 import { SearchFixedFilterService } from './search-fixed-filter.service';
diff --git a/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.spec.ts b/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.spec.ts
index 3f6c2ef133..a201d37d48 100644
--- a/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.spec.ts
+++ b/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.spec.ts
@@ -1,5 +1,5 @@
 import { SearchFixedFilterService } from './search-fixed-filter.service';
-import { RouteService } from '../../../shared/services/route.service';
+import { RouteService } from '../../../core/services/route.service';
 import { RequestService } from '../../../core/data/request.service';
 import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
 import { of as observableOf } from 'rxjs';
diff --git a/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts b/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts
index 0f17b508c9..85f637ce32 100644
--- a/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts
+++ b/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts
@@ -9,7 +9,6 @@ import { GenericConstructor } from '../../../core/shared/generic-constructor';
 import { FilteredDiscoveryPageResponseParsingService } from '../../../core/data/filtered-discovery-page-response-parsing.service';
 import { hasValue } from '../../../shared/empty.util';
 import { configureRequest, getResponseFromEntry } from '../../../core/shared/operators';
-import { RouteService } from '../../../shared/services/route.service';
 import { FilteredDiscoveryQueryResponse } from '../../../core/cache/response.models';
 
 /**
@@ -19,8 +18,7 @@ import { FilteredDiscoveryQueryResponse } from '../../../core/cache/response.mod
 export class SearchFixedFilterService {
   private queryByFilterPath = 'filtered-discovery-pages';
 
-  constructor(private routeService: RouteService,
-              protected requestService: RequestService,
+  constructor(protected requestService: RequestService,
               private halService: HALEndpointService) {
 
   }
diff --git a/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts b/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts
index 119f3f92a9..2b69fe7f55 100644
--- a/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts
+++ b/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.spec.ts
@@ -16,7 +16,7 @@ import { RouterStub } from '../../../../shared/testing/router-stub';
 import { Router } from '@angular/router';
 import { PageInfo } from '../../../../core/shared/page-info.model';
 import { SearchRangeFilterComponent } from './search-range-filter.component';
-import { RouteService } from '../../../../shared/services/route.service';
+import { RouteService } from '../../../../core/services/route.service';
 import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service';
 import { SEARCH_CONFIG_SERVICE } from '../../../../+my-dspace-page/my-dspace-page.component';
 import { SearchConfigurationServiceStub } from '../../../../shared/testing/search-configuration-service-stub';
diff --git a/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.ts b/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.ts
index 95d7441184..5ac59b65f8 100644
--- a/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.ts
+++ b/src/app/+search-page/search-filters/search-filter/search-range-filter/search-range-filter.component.ts
@@ -14,7 +14,7 @@ import { FILTER_CONFIG, IN_PLACE_SEARCH, SearchFilterService } from '../search-f
 import { SearchService } from '../../../search-service/search.service';
 import { Router } from '@angular/router';
 import * as moment from 'moment';
-import { RouteService } from '../../../../shared/services/route.service';
+import { RouteService } from '../../../../core/services/route.service';
 import { hasValue } from '../../../../shared/empty.util';
 import { SearchConfigurationService } from '../../../search-service/search-configuration.service';
 import { SEARCH_CONFIG_SERVICE } from '../../../../+my-dspace-page/my-dspace-page.component';
diff --git a/src/app/+search-page/search-page-routing.module.ts b/src/app/+search-page/search-page-routing.module.ts
index c3cf4e1343..e3a91c6f69 100644
--- a/src/app/+search-page/search-page-routing.module.ts
+++ b/src/app/+search-page/search-page-routing.module.ts
@@ -9,8 +9,13 @@ import { FilteredSearchPageGuard } from './filtered-search-page.guard';
   imports: [
     RouterModule.forChild([
       { path: '', component: SearchPageComponent, data: { title: 'search.title' } },
-      { path: ':filter', component: FilteredSearchPageComponent, canActivate: [FilteredSearchPageGuard]}
+      {
+        path: ':filter',
+        component: FilteredSearchPageComponent,
+        canActivate: [FilteredSearchPageGuard],
+      }
     ])
   ]
 })
-export class SearchPageRoutingModule { }
+export class SearchPageRoutingModule {
+}
diff --git a/src/app/+search-page/search-page.component.spec.ts b/src/app/+search-page/search-page.component.spec.ts
index 88c7c693d3..2bc3d4071d 100644
--- a/src/app/+search-page/search-page.component.spec.ts
+++ b/src/app/+search-page/search-page.component.spec.ts
@@ -21,7 +21,7 @@ import { SearchFilterService } from './search-filters/search-filter/search-filte
 import { SearchConfigurationService } from './search-service/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 { RouteService } from '../core/services/route.service';
 import { SearchConfigurationServiceStub } from '../shared/testing/search-configuration-service-stub';
 import { PaginatedSearchOptions } from './paginated-search-options.model';
 import { SearchFixedFilterService } from './search-filters/search-filter/search-fixed-filter.service';
diff --git a/src/app/+search-page/search-page.component.ts b/src/app/+search-page/search-page.component.ts
index 5e0a5ab9a2..8fe38eaebb 100644
--- a/src/app/+search-page/search-page.component.ts
+++ b/src/app/+search-page/search-page.component.ts
@@ -13,7 +13,7 @@ import { SearchSidebarService } from './search-sidebar/search-sidebar.service';
 import { hasValue, isNotEmpty } from '../shared/empty.util';
 import { SearchConfigurationService } from './search-service/search-configuration.service';
 import { getSucceededRemoteData } from '../core/shared/operators';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from '../core/services/route.service';
 import { SEARCH_CONFIG_SERVICE } from '../+my-dspace-page/my-dspace-page.component';
 
 export const SEARCH_ROUTE = '/search';
@@ -114,16 +114,16 @@ export class SearchPageComponent implements OnInit {
     this.searchLink = this.getSearchLink();
     this.searchOptions$ = this.getSearchOptions();
     this.sub = this.searchOptions$.pipe(
-      switchMap((options) => this.service.search(options).pipe(getSucceededRemoteData(), startWith(observableOf(undefined)))))
+      switchMap((options) => this.service.search(options).pipe(
+        getSucceededRemoteData(),
+        startWith(undefined)
+      )))
       .subscribe((results) => {
         this.resultsRD$.next(results);
       });
     this.scopeListRD$ = this.searchConfigService.getCurrentScope('').pipe(
       switchMap((scopeId) => this.service.getScopes(scopeId))
     );
-    if (!isNotEmpty(this.fixedFilter$)) {
-      this.fixedFilter$ = this.routeService.getRouteParameterValue('filter');
-    }
   }
 
   /**
diff --git a/src/app/+search-page/search-service/search-configuration.service.ts b/src/app/+search-page/search-service/search-configuration.service.ts
index 14fcdd8d60..fa43b27e66 100644
--- a/src/app/+search-page/search-service/search-configuration.service.ts
+++ b/src/app/+search-page/search-service/search-configuration.service.ts
@@ -14,7 +14,7 @@ import { SortDirection, SortOptions } from '../../core/cache/models/sort-options
 import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
 import { SearchOptions } from '../search-options.model';
 import { PaginatedSearchOptions } from '../paginated-search-options.model';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { hasNoValue, hasValue, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util';
 import { RemoteData } from '../../core/data/remote-data';
 import { getSucceededRemoteData } from '../../core/shared/operators';
diff --git a/src/app/+search-page/search-service/search.service.spec.ts b/src/app/+search-page/search-service/search.service.spec.ts
index 9ec5bc35f2..b505504870 100644
--- a/src/app/+search-page/search-service/search.service.spec.ts
+++ b/src/app/+search-page/search-service/search.service.spec.ts
@@ -26,7 +26,7 @@ import { CommunityDataService } from '../../core/data/community-data.service';
 import { ViewMode } from '../../core/shared/view-mode.model';
 import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service';
 import { map } from 'rxjs/operators';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 import { routeServiceStub } from '../../shared/testing/route-service-stub';
 
 @Component({ template: '' })
diff --git a/src/app/+search-page/search-service/search.service.ts b/src/app/+search-page/search-service/search.service.ts
index 52be0417a8..6685e7b715 100644
--- a/src/app/+search-page/search-service/search.service.ts
+++ b/src/app/+search-page/search-service/search.service.ts
@@ -42,7 +42,7 @@ import { CommunityDataService } from '../../core/data/community-data.service';
 import { ViewMode } from '../../core/shared/view-mode.model';
 import { ResourceType } from '../../core/shared/resource-type';
 import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service';
-import { RouteService } from '../../shared/services/route.service';
+import { RouteService } from '../../core/services/route.service';
 
 /**
  * Service that performs all general actions that have to do with the search page
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
index bd2d832c67..b7b34f9c55 100644
--- a/src/app/app.component.spec.ts
+++ b/src/app/app.component.spec.ts
@@ -26,7 +26,7 @@ import { HostWindowResizeAction } from './shared/host-window.actions';
 import { MetadataService } from './core/metadata/metadata.service';
 
 import { GLOBAL_CONFIG, ENV_CONFIG } from '../config';
-import { NativeWindowRef, NativeWindowService } from './shared/services/window.service';
+import { NativeWindowRef, NativeWindowService } from './core/services/window.service';
 
 import { MockTranslateLoader } from './shared/mocks/mock-translate-loader';
 import { MockMetadataService } from './shared/mocks/mock-metadata-service';
@@ -41,7 +41,7 @@ import { MenuServiceStub } from './shared/testing/menu-service-stub';
 import { HostWindowService } from './shared/host-window.service';
 import { HostWindowServiceStub } from './shared/testing/host-window-service-stub';
 import { ActivatedRoute, Router } from '@angular/router';
-import { RouteService } from './shared/services/route.service';
+import { RouteService } from './core/services/route.service';
 import { MockActivatedRoute } from './shared/mocks/mock-active-router';
 import { MockRouter } from './shared/mocks/mock-router';
 
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 37cc791558..836c20208d 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -19,11 +19,11 @@ import { GLOBAL_CONFIG, GlobalConfig } from '../config';
 import { MetadataService } from './core/metadata/metadata.service';
 import { HostWindowResizeAction } from './shared/host-window.actions';
 import { HostWindowState } from './shared/host-window.reducer';
-import { NativeWindowRef, NativeWindowService } from './shared/services/window.service';
+import { NativeWindowRef, NativeWindowService } from './core/services/window.service';
 import { isAuthenticated } from './core/auth/selectors';
 import { AuthService } from './core/auth/auth.service';
 import { Angulartics2GoogleAnalytics } from 'angulartics2/ga';
-import { RouteService } from './shared/services/route.service';
+import { RouteService } from './core/services/route.service';
 import variables from '../styles/_exposed_variables.scss';
 import { CSSVariableService } from './shared/sass-helper/sass-helper.service';
 import { MenuService } from './shared/menu/menu.service';
diff --git a/src/app/core/auth/auth.service.spec.ts b/src/app/core/auth/auth.service.spec.ts
index e766a45e48..ab2e6fd86b 100644
--- a/src/app/core/auth/auth.service.spec.ts
+++ b/src/app/core/auth/auth.service.spec.ts
@@ -7,12 +7,12 @@ import { REQUEST } from '@nguniversal/express-engine/tokens';
 import { of as observableOf } from 'rxjs';
 
 import { authReducer, AuthState } from './auth.reducer';
-import { NativeWindowRef, NativeWindowService } from '../../shared/services/window.service';
+import { NativeWindowRef, NativeWindowService } from '../services/window.service';
 import { AuthService } from './auth.service';
 import { RouterStub } from '../../shared/testing/router-stub';
 import { ActivatedRouteStub } from '../../shared/testing/active-router-stub';
 
-import { CookieService } from '../../shared/services/cookie.service';
+import { CookieService } from '../services/cookie.service';
 import { AuthRequestServiceStub } from '../../shared/testing/auth-request-service-stub';
 import { AuthRequestService } from './auth-request.service';
 import { AuthStatus } from './models/auth-status.model';
@@ -20,7 +20,7 @@ import { AuthTokenInfo } from './models/auth-token-info.model';
 import { EPerson } from '../eperson/models/eperson.model';
 import { EPersonMock } from '../../shared/testing/eperson-mock';
 import { AppState } from '../../app.reducer';
-import { ClientCookieService } from '../../shared/services/client-cookie.service';
+import { ClientCookieService } from '../services/client-cookie.service';
 import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
 import { getMockRemoteDataBuildService } from '../../shared/mocks/mock-remote-data-build.service';
 
diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts
index a01768e687..08c94b02f2 100644
--- a/src/app/core/auth/auth.service.ts
+++ b/src/app/core/auth/auth.service.ts
@@ -15,11 +15,11 @@ import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
 import { AuthStatus } from './models/auth-status.model';
 import { AuthTokenInfo, TOKENITEM } from './models/auth-token-info.model';
 import { isEmpty, isNotEmpty, isNotNull, isNotUndefined } from '../../shared/empty.util';
-import { CookieService } from '../../shared/services/cookie.service';
+import { CookieService } from '../services/cookie.service';
 import { getAuthenticationToken, getRedirectUrl, isAuthenticated, isTokenRefreshing } from './selectors';
 import { AppState, routerStateSelector } from '../../app.reducer';
 import { ResetAuthenticationMessagesAction, SetRedirectUrlAction } from './auth.actions';
-import { NativeWindowRef, NativeWindowService } from '../../shared/services/window.service';
+import { NativeWindowRef, NativeWindowService } from '../services/window.service';
 import { Base64EncodeUrl } from '../../shared/utils/encode-decode.util';
 import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
 
diff --git a/src/app/core/core.effects.ts b/src/app/core/core.effects.ts
index 9ade23e6c5..f657b5d449 100644
--- a/src/app/core/core.effects.ts
+++ b/src/app/core/core.effects.ts
@@ -6,7 +6,7 @@ import { AuthEffects } from './auth/auth.effects';
 import { JsonPatchOperationsEffects } from './json-patch/json-patch-operations.effects';
 import { ServerSyncBufferEffects } from './cache/server-sync-buffer.effects';
 import { ObjectUpdatesEffects } from './data/object-updates/object-updates.effects';
-import { RouteEffects } from '../shared/services/route.effects';
+import { RouteEffects } from './services/route.effects';
 
 export const coreEffects = [
   RequestEffects,
diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts
index 6550435aa3..31d1da1ede 100644
--- a/src/app/core/core.module.ts
+++ b/src/app/core/core.module.ts
@@ -15,7 +15,7 @@ import { coreReducers } from './core.reducers';
 
 import { isNotEmpty } from '../shared/empty.util';
 
-import { ApiService } from '../shared/services/api.service';
+import { ApiService } from './services/api.service';
 import { BrowseEntriesResponseParsingService } from './data/browse-entries-response-parsing.service';
 import { CollectionDataService } from './data/collection-data.service';
 import { CommunityDataService } from './data/community-data.service';
@@ -35,12 +35,12 @@ import { PaginationComponentOptions } from '../shared/pagination/pagination-comp
 import { RemoteDataBuildService } from './cache/builders/remote-data-build.service';
 import { RequestService } from './data/request.service';
 import { EndpointMapResponseParsingService } from './data/endpoint-map-response-parsing.service';
-import { ServerResponseService } from '../shared/services/server-response.service';
-import { NativeWindowFactory, NativeWindowService } from '../shared/services/window.service';
+import { ServerResponseService } from './services/server-response.service';
+import { NativeWindowFactory, NativeWindowService } from './services/window.service';
 import { BrowseService } from './browse/browse.service';
 import { BrowseResponseParsingService } from './data/browse-response-parsing.service';
 import { ConfigResponseParsingService } from './config/config-response-parsing.service';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from './services/route.service';
 import { SubmissionDefinitionsConfigService } from './config/submission-definitions-config.service';
 import { SubmissionFormsConfigService } from './config/submission-forms-config.service';
 import { SubmissionSectionsConfigService } from './config/submission-sections-config.service';
diff --git a/src/app/core/core.reducers.ts b/src/app/core/core.reducers.ts
index 7aecb91a7a..4fcf36f9cc 100644
--- a/src/app/core/core.reducers.ts
+++ b/src/app/core/core.reducers.ts
@@ -13,7 +13,7 @@ import {
   objectUpdatesReducer,
   ObjectUpdatesState
 } from './data/object-updates/object-updates.reducer';
-import { routeReducer, RouteState } from '../shared/services/route.reducer';
+import { routeReducer, RouteState } from './services/route.reducer';
 
 export interface CoreState {
   'cache/object': ObjectCacheState,
diff --git a/src/app/shared/services/api.service.ts b/src/app/core/services/api.service.ts
similarity index 100%
rename from src/app/shared/services/api.service.ts
rename to src/app/core/services/api.service.ts
diff --git a/src/app/shared/services/client-cookie.service.ts b/src/app/core/services/client-cookie.service.ts
similarity index 100%
rename from src/app/shared/services/client-cookie.service.ts
rename to src/app/core/services/client-cookie.service.ts
diff --git a/src/app/shared/services/cookie.service.spec.ts b/src/app/core/services/cookie.service.spec.ts
similarity index 100%
rename from src/app/shared/services/cookie.service.spec.ts
rename to src/app/core/services/cookie.service.spec.ts
diff --git a/src/app/shared/services/cookie.service.ts b/src/app/core/services/cookie.service.ts
similarity index 100%
rename from src/app/shared/services/cookie.service.ts
rename to src/app/core/services/cookie.service.ts
diff --git a/src/app/shared/services/route.actions.ts b/src/app/core/services/route.actions.ts
similarity index 100%
rename from src/app/shared/services/route.actions.ts
rename to src/app/core/services/route.actions.ts
diff --git a/src/app/shared/services/route.effects.ts b/src/app/core/services/route.effects.ts
similarity index 100%
rename from src/app/shared/services/route.effects.ts
rename to src/app/core/services/route.effects.ts
diff --git a/src/app/shared/services/route.reducer.ts b/src/app/core/services/route.reducer.ts
similarity index 100%
rename from src/app/shared/services/route.reducer.ts
rename to src/app/core/services/route.reducer.ts
diff --git a/src/app/shared/services/route.service.spec.ts b/src/app/core/services/route.service.spec.ts
similarity index 97%
rename from src/app/shared/services/route.service.spec.ts
rename to src/app/core/services/route.service.spec.ts
index c6003521a7..ae31f28384 100644
--- a/src/app/shared/services/route.service.spec.ts
+++ b/src/app/core/services/route.service.spec.ts
@@ -6,9 +6,9 @@ import { Store } from '@ngrx/store';
 import { getTestScheduler, hot } from 'jasmine-marbles';
 
 import { RouteService } from './route.service';
-import { MockRouter } from '../mocks/mock-router';
+import { MockRouter } from '../../shared/mocks/mock-router';
 import { TestScheduler } from 'rxjs/testing';
-import { AddUrlToHistoryAction } from '../history/history.actions';
+import { AddUrlToHistoryAction } from '../../shared/history/history.actions';
 
 describe('RouteService', () => {
   let scheduler: TestScheduler;
diff --git a/src/app/shared/services/route.service.ts b/src/app/core/services/route.service.ts
similarity index 95%
rename from src/app/shared/services/route.service.ts
rename to src/app/core/services/route.service.ts
index dc626484c1..65aa858945 100644
--- a/src/app/shared/services/route.service.ts
+++ b/src/app/core/services/route.service.ts
@@ -12,12 +12,12 @@ import { combineLatest, Observable } from 'rxjs';
 import { createSelector, MemoizedSelector, select, Store } from '@ngrx/store';
 import { isEqual } from 'lodash';
 
-import { AddUrlToHistoryAction } from '../history/history.actions';
-import { historySelector } from '../history/selectors';
+import { AddUrlToHistoryAction } from '../../shared/history/history.actions';
+import { historySelector } from '../../shared/history/selectors';
 import { SetParametersAction, SetQueryParametersAction } from './route.actions';
-import { CoreState } from '../../core/core.reducers';
-import { hasValue } from '../empty.util';
-import { coreSelector } from '../../core/core.selectors';
+import { CoreState } from '../core.reducers';
+import { hasValue } from '../../shared/empty.util';
+import { coreSelector } from '../core.selectors';
 
 /**
  * Selector to select all route parameters from the store
diff --git a/src/app/shared/services/server-cookie.service.ts b/src/app/core/services/server-cookie.service.ts
similarity index 100%
rename from src/app/shared/services/server-cookie.service.ts
rename to src/app/core/services/server-cookie.service.ts
diff --git a/src/app/shared/services/server-response.service.ts b/src/app/core/services/server-response.service.ts
similarity index 100%
rename from src/app/shared/services/server-response.service.ts
rename to src/app/core/services/server-response.service.ts
diff --git a/src/app/shared/services/window.service.ts b/src/app/core/services/window.service.ts
similarity index 100%
rename from src/app/shared/services/window.service.ts
rename to src/app/core/services/window.service.ts
diff --git a/src/app/pagenotfound/pagenotfound.component.ts b/src/app/pagenotfound/pagenotfound.component.ts
index 6e173b4139..b11de58269 100644
--- a/src/app/pagenotfound/pagenotfound.component.ts
+++ b/src/app/pagenotfound/pagenotfound.component.ts
@@ -1,4 +1,4 @@
-import { ServerResponseService } from '../shared/services/server-response.service';
+import { ServerResponseService } from '../core/services/server-response.service';
 import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core';
 import { AuthService } from '../core/auth/auth.service';
 
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..c53c45fbe9 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
@@ -1,6 +1,6 @@
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 import { CommunityDataService } from '../../../core/data/community-data.service';
-import { RouteService } from '../../services/route.service';
+import { RouteService } from '../../../core/services/route.service';
 import { Router } from '@angular/router';
 import { TranslateModule } from '@ngx-translate/core';
 import { of as observableOf } from 'rxjs';
diff --git a/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts b/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts
index c9fcfecb97..e07f2a5a0a 100644
--- a/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts
+++ b/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts
@@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core';
 import { Community } from '../../../core/shared/community.model';
 import { CommunityDataService } from '../../../core/data/community-data.service';
 import { Observable } from 'rxjs';
-import { RouteService } from '../../services/route.service';
+import { RouteService } from '../../../core/services/route.service';
 import { Router } from '@angular/router';
 import { RemoteData } from '../../../core/data/remote-data';
 import { isNotEmpty, isNotUndefined } from '../../empty.util';
diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts
index e6c24226e2..82f57ea970 100644
--- a/src/app/submission/submission.module.ts
+++ b/src/app/submission/submission.module.ts
@@ -31,7 +31,7 @@ import { SubmissionSubmitComponent } from './submit/submission-submit.component'
 @NgModule({
   imports: [
     CommonModule,
-    CoreModule,
+    CoreModule.forRoot(),
     SharedModule,
     StoreModule.forFeature('submission', submissionReducers, {}),
     EffectsModule.forFeature(submissionEffects),
diff --git a/src/app/submission/submission.service.spec.ts b/src/app/submission/submission.service.spec.ts
index d764f09538..80ad3b606a 100644
--- a/src/app/submission/submission.service.spec.ts
+++ b/src/app/submission/submission.service.spec.ts
@@ -12,7 +12,7 @@ import { MockRouter } from '../shared/mocks/mock-router';
 import { SubmissionService } from './submission.service';
 import { submissionReducers } from './submission.reducers';
 import { SubmissionRestService } from '../core/submission/submission-rest.service';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from '../core/services/route.service';
 import { SubmissionRestServiceStub } from '../shared/testing/submission-rest-service-stub';
 import { MockActivatedRoute } from '../shared/mocks/mock-active-router';
 import { GLOBAL_CONFIG } from '../../config';
diff --git a/src/app/submission/submission.service.ts b/src/app/submission/submission.service.ts
index 82185a8eae..36aedaaab6 100644
--- a/src/app/submission/submission.service.ts
+++ b/src/app/submission/submission.service.ts
@@ -35,7 +35,7 @@ import { SubmissionRestService } from '../core/submission/submission-rest.servic
 import { SectionDataObject } from './sections/models/section-data.model';
 import { SubmissionScopeType } from '../core/submission/submission-scope-type';
 import { SubmissionObject } from '../core/submission/models/submission-object.model';
-import { RouteService } from '../shared/services/route.service';
+import { RouteService } from '../core/services/route.service';
 import { SectionsType } from './sections/sections-type';
 import { NotificationsService } from '../shared/notifications/notifications.service';
 import { SubmissionDefinitionsModel } from '../core/config/models/config-submission-definitions.model';
diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts
index b20894880b..7ff70457bb 100644
--- a/src/modules/app/browser-app.module.ts
+++ b/src/modules/app/browser-app.module.ts
@@ -15,8 +15,8 @@ import { AppComponent } from '../../app/app.component';
 import { AppModule } from '../../app/app.module';
 import { DSpaceBrowserTransferStateModule } from '../transfer-state/dspace-browser-transfer-state.module';
 import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service';
-import { ClientCookieService } from '../../app/shared/services/client-cookie.service';
-import { CookieService } from '../../app/shared/services/cookie.service';
+import { ClientCookieService } from '../../app/core/services/client-cookie.service';
+import { CookieService } from '../../app/core/services/cookie.service';
 import { AuthService } from '../../app/core/auth/auth.service';
 import { Angulartics2Module } from 'angulartics2';
 import { Angulartics2GoogleAnalytics } from 'angulartics2/ga';
diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts
index d809d3cced..bd3379c8de 100644
--- a/src/modules/app/server-app.module.ts
+++ b/src/modules/app/server-app.module.ts
@@ -13,8 +13,8 @@ import { DSpaceServerTransferStateModule } from '../transfer-state/dspace-server
 import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service';
 
 import { TranslateUniversalLoader } from '../translate-universal-loader';
-import { CookieService } from '../../app/shared/services/cookie.service';
-import { ServerCookieService } from '../../app/shared/services/server-cookie.service';
+import { CookieService } from '../../app/core/services/cookie.service';
+import { ServerCookieService } from '../../app/core/services/server-cookie.service';
 import { AuthService } from '../../app/core/auth/auth.service';
 import { ServerAuthService } from '../../app/core/auth/server-auth.service';
 
-- 
GitLab