Skip to content

Commit b8d282e

Browse files
Fix proxy timeout error for browse by pages
1 parent ca86437 commit b8d282e

2 files changed

Lines changed: 62 additions & 21 deletions

File tree

src/app/browse-by/browse-by-guard.spec.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import { first } from 'rxjs/operators';
22
import { BrowseByGuard } from './browse-by-guard';
33
import { of as observableOf } from 'rxjs';
4-
import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service';
5-
import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
4+
import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
65
import { BrowseDefinition } from '../core/shared/browse-definition.model';
76
import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator';
7+
import { RouterStub } from '../shared/testing/router.stub';
88

99
describe('BrowseByGuard', () => {
1010
describe('canActivate', () => {
1111
let guard: BrowseByGuard;
1212
let dsoService: any;
1313
let translateService: any;
1414
let browseDefinitionService: any;
15+
let router: any;
1516

1617
const name = 'An interesting DSO';
1718
const title = 'Author';
@@ -34,7 +35,9 @@ describe('BrowseByGuard', () => {
3435
findById: () => createSuccessfulRemoteDataObject$(browseDefinition)
3536
};
3637

37-
guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService);
38+
router = new RouterStub() as any;
39+
40+
guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService, router);
3841
});
3942

4043
it('should return true, and sets up the data correctly, with a scope and value', () => {
@@ -64,6 +67,7 @@ describe('BrowseByGuard', () => {
6467
value: '"' + value + '"'
6568
};
6669
expect(scopedRoute.data).toEqual(result);
70+
expect(router.navigate).not.toHaveBeenCalled();
6771
expect(canActivate).toEqual(true);
6872
}
6973
);
@@ -96,6 +100,7 @@ describe('BrowseByGuard', () => {
96100
value: ''
97101
};
98102
expect(scopedNoValueRoute.data).toEqual(result);
103+
expect(router.navigate).not.toHaveBeenCalled();
99104
expect(canActivate).toEqual(true);
100105
}
101106
);
@@ -127,9 +132,33 @@ describe('BrowseByGuard', () => {
127132
value: '"' + value + '"'
128133
};
129134
expect(route.data).toEqual(result);
135+
expect(router.navigate).not.toHaveBeenCalled();
130136
expect(canActivate).toEqual(true);
131137
}
132138
);
133139
});
140+
141+
it('should return false, and sets up the data correctly, without a scope and with a value', () => {
142+
jasmine.getEnv().allowRespy(true);
143+
spyOn(browseDefinitionService, 'findById').and.returnValue(createFailedRemoteDataObject$());
144+
const scopedRoute = {
145+
data: {
146+
title: field,
147+
},
148+
params: {
149+
id,
150+
},
151+
queryParams: {
152+
scope,
153+
value
154+
}
155+
};
156+
guard.canActivate(scopedRoute as any, undefined)
157+
.pipe(first())
158+
.subscribe((canActivate) => {
159+
expect(router.navigate).toHaveBeenCalled();
160+
expect(canActivate).toEqual(false);
161+
});
162+
});
134163
});
135164
});

src/app/browse-by/browse-by-guard.ts

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
1+
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
22
import { Injectable } from '@angular/core';
33
import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service';
44
import { hasNoValue, hasValue } from '../shared/empty.util';
55
import { map, switchMap } from 'rxjs/operators';
6-
import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../core/shared/operators';
6+
import { getFirstCompletedRemoteData, getFirstSucceededRemoteData, } from '../core/shared/operators';
77
import { TranslateService } from '@ngx-translate/core';
88
import { Observable, of as observableOf } from 'rxjs';
99
import { BrowseDefinitionDataService } from '../core/browse/browse-definition-data.service';
1010
import { BrowseDefinition } from '../core/shared/browse-definition.model';
11+
import { RemoteData } from '../core/data/remote-data';
12+
import { PAGE_NOT_FOUND_PATH } from '../app-routing-paths';
1113

1214
@Injectable()
1315
/**
@@ -17,35 +19,45 @@ export class BrowseByGuard implements CanActivate {
1719

1820
constructor(protected dsoService: DSpaceObjectDataService,
1921
protected translate: TranslateService,
20-
protected browseDefinitionService: BrowseDefinitionDataService) {
22+
protected browseDefinitionService: BrowseDefinitionDataService,
23+
protected router: Router,
24+
) {
2125
}
2226

23-
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
27+
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
2428
const title = route.data.title;
2529
const id = route.params.id || route.queryParams.id || route.data.id;
26-
let browseDefinition$: Observable<BrowseDefinition>;
30+
let browseDefinition$: Observable<BrowseDefinition | undefined>;
2731
if (hasNoValue(route.data.browseDefinition) && hasValue(id)) {
28-
browseDefinition$ = this.browseDefinitionService.findById(id).pipe(getFirstSucceededRemoteDataPayload());
32+
browseDefinition$ = this.browseDefinitionService.findById(id).pipe(
33+
getFirstCompletedRemoteData(),
34+
map((browseDefinitionRD: RemoteData<BrowseDefinition>) => browseDefinitionRD.payload),
35+
);
2936
} else {
3037
browseDefinition$ = observableOf(route.data.browseDefinition);
3138
}
3239
const scope = route.queryParams.scope;
3340
const value = route.queryParams.value;
3441
const metadataTranslated = this.translate.instant('browse.metadata.' + id);
3542
return browseDefinition$.pipe(
36-
switchMap((browseDefinition) => {
37-
if (hasValue(scope)) {
38-
const dsoAndMetadata$ = this.dsoService.findById(scope).pipe(getFirstSucceededRemoteData());
39-
return dsoAndMetadata$.pipe(
40-
map((dsoRD) => {
41-
const name = dsoRD.payload.name;
42-
route.data = this.createData(title, id, browseDefinition, name, metadataTranslated, value, route);
43-
return true;
44-
})
45-
);
43+
switchMap((browseDefinition: BrowseDefinition | undefined) => {
44+
if (hasValue(browseDefinition)) {
45+
if (hasValue(scope)) {
46+
const dsoAndMetadata$ = this.dsoService.findById(scope).pipe(getFirstSucceededRemoteData());
47+
return dsoAndMetadata$.pipe(
48+
map((dsoRD) => {
49+
const name = dsoRD.payload.name;
50+
route.data = this.createData(title, id, browseDefinition, name, metadataTranslated, value, route);
51+
return true;
52+
})
53+
);
54+
} else {
55+
route.data = this.createData(title, id, browseDefinition, '', metadataTranslated, value, route);
56+
return observableOf(true);
57+
}
4658
} else {
47-
route.data = this.createData(title, id, browseDefinition, '', metadataTranslated, value, route);
48-
return observableOf(true);
59+
void this.router.navigate([PAGE_NOT_FOUND_PATH]);
60+
return observableOf(false);
4961
}
5062
})
5163
);

0 commit comments

Comments
 (0)