Skip to content

Commit c70e046

Browse files
authored
Merge pull request DSpace#2299 from alexandrevryghem/fix-browse-by-proxy-timeout_contribute-main
Fix Proxy Timeouts on browse by pages
2 parents 187702d + 91b6357 commit c70e046

2 files changed

Lines changed: 60 additions & 19 deletions

File tree

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { first } from 'rxjs/operators';
22
import { BrowseByGuard } from './browse-by-guard';
33
import { of as observableOf } from 'rxjs';
4-
import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
4+
import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
55
import { BrowseByDataType } from './browse-by-switcher/browse-by-decorator';
66
import { ValueListBrowseDefinition } from '../core/shared/value-list-browse-definition.model';
77
import { DSONameServiceMock } from '../shared/mocks/dso-name.service.mock';
88
import { DSONameService } from '../core/breadcrumbs/dso-name.service';
9+
import { RouterStub } from '../shared/testing/router.stub';
910

1011
describe('BrowseByGuard', () => {
1112
describe('canActivate', () => {
1213
let guard: BrowseByGuard;
1314
let dsoService: any;
1415
let translateService: any;
1516
let browseDefinitionService: any;
17+
let router: any;
1618

1719
const name = 'An interesting DSO';
1820
const title = 'Author';
@@ -35,7 +37,9 @@ describe('BrowseByGuard', () => {
3537
findById: () => createSuccessfulRemoteDataObject$(browseDefinition)
3638
};
3739

38-
guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService, new DSONameServiceMock() as DSONameService);
40+
router = new RouterStub() as any;
41+
42+
guard = new BrowseByGuard(dsoService, translateService, browseDefinitionService, new DSONameServiceMock() as DSONameService, router);
3943
});
4044

4145
it('should return true, and sets up the data correctly, with a scope and value', () => {
@@ -65,6 +69,7 @@ describe('BrowseByGuard', () => {
6569
value: '"' + value + '"'
6670
};
6771
expect(scopedRoute.data).toEqual(result);
72+
expect(router.navigate).not.toHaveBeenCalled();
6873
expect(canActivate).toEqual(true);
6974
}
7075
);
@@ -97,6 +102,7 @@ describe('BrowseByGuard', () => {
97102
value: ''
98103
};
99104
expect(scopedNoValueRoute.data).toEqual(result);
105+
expect(router.navigate).not.toHaveBeenCalled();
100106
expect(canActivate).toEqual(true);
101107
}
102108
);
@@ -128,9 +134,33 @@ describe('BrowseByGuard', () => {
128134
value: '"' + value + '"'
129135
};
130136
expect(route.data).toEqual(result);
137+
expect(router.navigate).not.toHaveBeenCalled();
131138
expect(canActivate).toEqual(true);
132139
}
133140
);
134141
});
142+
143+
it('should return false, and sets up the data correctly, without a scope and with a value', () => {
144+
jasmine.getEnv().allowRespy(true);
145+
spyOn(browseDefinitionService, 'findById').and.returnValue(createFailedRemoteDataObject$());
146+
const scopedRoute = {
147+
data: {
148+
title: field,
149+
},
150+
params: {
151+
id,
152+
},
153+
queryParams: {
154+
scope,
155+
value
156+
}
157+
};
158+
guard.canActivate(scopedRoute as any, undefined)
159+
.pipe(first())
160+
.subscribe((canActivate) => {
161+
expect(router.navigate).toHaveBeenCalled();
162+
expect(canActivate).toEqual(false);
163+
});
164+
});
135165
});
136166
});

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

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
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 { getFirstSucceededRemoteDataPayload } from '../core/shared/operators';
6+
import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } 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';
1111
import { DSONameService } from '../core/breadcrumbs/dso-name.service';
1212
import { 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

Comments
 (0)