1- import { ActivatedRouteSnapshot , CanActivate , RouterStateSnapshot } from '@angular/router' ;
1+ import { ActivatedRouteSnapshot , CanActivate , Router , RouterStateSnapshot } from '@angular/router' ;
22import { Injectable } from '@angular/core' ;
33import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service' ;
44import { hasNoValue , hasValue } from '../shared/empty.util' ;
55import { map , switchMap } from 'rxjs/operators' ;
6- import { getFirstSucceededRemoteDataPayload } from '../core/shared/operators' ;
6+ import { getFirstCompletedRemoteData , getFirstSucceededRemoteDataPayload } from '../core/shared/operators' ;
77import { TranslateService } from '@ngx-translate/core' ;
88import { Observable , of as observableOf } from 'rxjs' ;
99import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service' ;
1010import { BrowseDefinition } from '../core/shared/browse-definition.model' ;
1111import { DSONameService } from '../core/breadcrumbs/dso-name.service' ;
1212import { DSpaceObject } from '../core/shared/dspace-object.model' ;
13+ import { RemoteData } from '../core/data/remote-data' ;
14+ import { PAGE_NOT_FOUND_PATH } from '../app-routing-paths' ;
1315
1416@Injectable ( )
1517/**
@@ -21,35 +23,44 @@ export class BrowseByGuard implements CanActivate {
2123 protected translate : TranslateService ,
2224 protected browseDefinitionService : BrowseDefinitionDataService ,
2325 protected dsoNameService : DSONameService ,
26+ protected router : Router ,
2427 ) {
2528 }
2629
27- canActivate ( route : ActivatedRouteSnapshot , state : RouterStateSnapshot ) {
30+ canActivate ( route : ActivatedRouteSnapshot , state : RouterStateSnapshot ) : Observable < boolean > {
2831 const title = route . data . title ;
2932 const id = route . params . id || route . queryParams . id || route . data . id ;
30- let browseDefinition$ : Observable < BrowseDefinition > ;
33+ let browseDefinition$ : Observable < BrowseDefinition | undefined > ;
3134 if ( hasNoValue ( route . data . browseDefinition ) && hasValue ( id ) ) {
32- browseDefinition$ = this . browseDefinitionService . findById ( id ) . pipe ( getFirstSucceededRemoteDataPayload ( ) ) ;
35+ browseDefinition$ = this . browseDefinitionService . findById ( id ) . pipe (
36+ getFirstCompletedRemoteData ( ) ,
37+ map ( ( browseDefinitionRD : RemoteData < BrowseDefinition > ) => browseDefinitionRD . payload ) ,
38+ ) ;
3339 } else {
3440 browseDefinition$ = observableOf ( route . data . browseDefinition ) ;
3541 }
3642 const scope = route . queryParams . scope ;
3743 const value = route . queryParams . value ;
3844 const metadataTranslated = this . translate . instant ( `browse.metadata.${ id } ` ) ;
3945 return browseDefinition$ . pipe (
40- switchMap ( ( browseDefinition : BrowseDefinition ) => {
41- if ( hasValue ( scope ) ) {
42- const dso$ : Observable < DSpaceObject > = this . dsoService . findById ( scope ) . pipe ( getFirstSucceededRemoteDataPayload ( ) ) ;
43- return dso$ . pipe (
44- map ( ( dso : DSpaceObject ) => {
45- const name = this . dsoNameService . getName ( dso ) ;
46- route . data = this . createData ( title , id , browseDefinition , name , metadataTranslated , value , route ) ;
47- return true ;
48- } )
49- ) ;
46+ switchMap ( ( browseDefinition : BrowseDefinition | undefined ) => {
47+ if ( hasValue ( browseDefinition ) ) {
48+ if ( hasValue ( scope ) ) {
49+ const dso$ : Observable < DSpaceObject > = this . dsoService . findById ( scope ) . pipe ( getFirstSucceededRemoteDataPayload ( ) ) ;
50+ return dso$ . pipe (
51+ map ( ( dso : DSpaceObject ) => {
52+ const name = this . dsoNameService . getName ( dso ) ;
53+ route . data = this . createData ( title , id , browseDefinition , name , metadataTranslated , value , route ) ;
54+ return true ;
55+ } )
56+ ) ;
57+ } else {
58+ route . data = this . createData ( title , id , browseDefinition , '' , metadataTranslated , value , route ) ;
59+ return observableOf ( true ) ;
60+ }
5061 } else {
51- route . data = this . createData ( title , id , browseDefinition , '' , metadataTranslated , value , route ) ;
52- return observableOf ( true ) ;
62+ void this . router . navigate ( [ PAGE_NOT_FOUND_PATH ] ) ;
63+ return observableOf ( false ) ;
5364 }
5465 } )
5566 ) ;
0 commit comments