From 6b26506d881910b2e18ad4d4e893de340341d3dc Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Thu, 17 Oct 2019 14:55:45 -0700 Subject: [PATCH] Added matcher function to router that supports handle paths (eliminates the need to encode the forward slash). Fixed comment. --- .../lookup-by-id-routing.module.ts | 28 +++++++++++++++++-- src/app/+lookup-by-id/lookup-by-id.module.ts | 4 +-- src/app/+lookup-by-id/lookup-guard.ts | 4 +-- ...c.ts => dso-redirect-data.service.spec.ts} | 8 +++--- ...ervice.ts => dso-redirect-data.service.ts} | 2 +- 5 files changed, 35 insertions(+), 11 deletions(-) rename src/app/core/data/{dso-data-redirect.service.spec.ts => dso-redirect-data.service.spec.ts} (96%) rename src/app/core/data/{dso-data-redirect.service.ts => dso-redirect-data.service.ts} (97%) diff --git a/src/app/+lookup-by-id/lookup-by-id-routing.module.ts b/src/app/+lookup-by-id/lookup-by-id-routing.module.ts index 012345e791..758287bcbc 100644 --- a/src/app/+lookup-by-id/lookup-by-id-routing.module.ts +++ b/src/app/+lookup-by-id/lookup-by-id-routing.module.ts @@ -1,12 +1,36 @@ import { LookupGuard } from './lookup-guard'; import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; +import { RouterModule, UrlSegment } from '@angular/router'; import { ObjectNotFoundComponent } from './objectnotfound/objectnotfound.component'; +import { hasValue } from '../shared/empty.util'; @NgModule({ imports: [ RouterModule.forChild([ - { path: ':idType/:id', canActivate: [LookupGuard], component: ObjectNotFoundComponent } + { + matcher: (url) => { + // The expected path is :idType/:id + const idType = url[0].path; + let id; + // Allow for handles that are delimited with a forward slash. + if (url.length === 3) { + id = url[1].path + '/' + url[2].path; + } else { + id = url[1].path; + } + if (hasValue(idType) && hasValue(id)) { + return { + consumed: url, + posParams: { + idType: new UrlSegment(idType, {}), + id: new UrlSegment(id, {}) + } + }; + } + return null; + }, + canActivate: [LookupGuard], + component: ObjectNotFoundComponent } ]) ], providers: [ diff --git a/src/app/+lookup-by-id/lookup-by-id.module.ts b/src/app/+lookup-by-id/lookup-by-id.module.ts index 4620f57824..1b070c1279 100644 --- a/src/app/+lookup-by-id/lookup-by-id.module.ts +++ b/src/app/+lookup-by-id/lookup-by-id.module.ts @@ -3,7 +3,7 @@ import { CommonModule } from '@angular/common'; import { SharedModule } from '../shared/shared.module'; import { LookupRoutingModule } from './lookup-by-id-routing.module'; import { ObjectNotFoundComponent } from './objectnotfound/objectnotfound.component'; -import { DsoDataRedirectService } from '../core/data/dso-data-redirect.service'; +import { DsoRedirectDataService } from '../core/data/dso-redirect-data.service'; @NgModule({ imports: [ @@ -15,7 +15,7 @@ import { DsoDataRedirectService } from '../core/data/dso-data-redirect.service'; ObjectNotFoundComponent ], providers: [ - DsoDataRedirectService + DsoRedirectDataService ] }) export class LookupIdModule { diff --git a/src/app/+lookup-by-id/lookup-guard.ts b/src/app/+lookup-by-id/lookup-guard.ts index 7f38b6db7a..5cc101f2b0 100644 --- a/src/app/+lookup-by-id/lookup-guard.ts +++ b/src/app/+lookup-by-id/lookup-guard.ts @@ -1,5 +1,5 @@ import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; -import { DsoDataRedirectService } from '../core/data/dso-data-redirect.service'; +import { DsoRedirectDataService } from '../core/data/dso-redirect-data.service'; import { Injectable } from '@angular/core'; import { IdentifierType } from '../core/index/index.reducer'; import { Observable } from 'rxjs'; @@ -14,7 +14,7 @@ interface LookupParams { @Injectable() export class LookupGuard implements CanActivate { - constructor(private dsoService: DsoDataRedirectService) { + constructor(private dsoService: DsoRedirectDataService) { } canActivate(route: ActivatedRouteSnapshot, state:RouterStateSnapshot): Observable { diff --git a/src/app/core/data/dso-data-redirect.service.spec.ts b/src/app/core/data/dso-redirect-data.service.spec.ts similarity index 96% rename from src/app/core/data/dso-data-redirect.service.spec.ts rename to src/app/core/data/dso-redirect-data.service.spec.ts index f2c35727fa..3bc37b872d 100644 --- a/src/app/core/data/dso-data-redirect.service.spec.ts +++ b/src/app/core/data/dso-redirect-data.service.spec.ts @@ -9,13 +9,13 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { HttpClient } from '@angular/common/http'; import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service'; import { IdentifierType } from '../index/index.reducer'; -import { DsoDataRedirectService } from './dso-data-redirect.service'; +import { DsoRedirectDataService } from './dso-redirect-data.service'; import { Store } from '@ngrx/store'; import { CoreState } from '../core.reducers'; -describe('DsoDataRedirectService', () => { +describe('DsoRedirectDataService', () => { let scheduler: TestScheduler; - let service: DsoDataRedirectService; + let service: DsoRedirectDataService; let halService: HALEndpointService; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -66,7 +66,7 @@ describe('DsoDataRedirectService', () => { a: remoteData }) }); - service = new DsoDataRedirectService( + service = new DsoRedirectDataService( requestService, rdbService, dataBuildService, diff --git a/src/app/core/data/dso-data-redirect.service.ts b/src/app/core/data/dso-redirect-data.service.ts similarity index 97% rename from src/app/core/data/dso-data-redirect.service.ts rename to src/app/core/data/dso-redirect-data.service.ts index 1cb3b20f2a..b8d4cf545d 100644 --- a/src/app/core/data/dso-data-redirect.service.ts +++ b/src/app/core/data/dso-redirect-data.service.ts @@ -20,7 +20,7 @@ import { getFinishedRemoteData } from '../shared/operators'; import { Router } from '@angular/router'; @Injectable() -export class DsoDataRedirectService extends DataService { +export class DsoRedirectDataService extends DataService { protected linkPath = 'pid'; protected forceBypassCache = false;