Request-a-copy: Using a resolver to grab the RequestItem

This commit is contained in:
Kim Shepherd
2025-03-06 19:03:55 +01:00
parent ce93b847d2
commit 58d0e7f513
2 changed files with 51 additions and 2 deletions

View File

@@ -0,0 +1,46 @@
import { inject } from '@angular/core';
import {
ResolveFn,
Router,
} from '@angular/router';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { getForbiddenRoute } from '../../app-routing-paths';
import { hasValue } from '../../shared/empty.util';
import { ItemRequestDataService } from '../data/item-request-data.service';
import { redirectOn4xx } from '../shared/authorized.operators';
import { ItemRequest } from '../shared/item-request.model';
import {
getFirstCompletedRemoteData,
getFirstSucceededRemoteDataPayload,
} from '../shared/operators';
import { AuthService } from './auth.service';
export const accessTokenResolver: ResolveFn<ItemRequest> = (
route,
state,
router: Router = inject(Router),
authService: AuthService = inject(AuthService),
itemRequestDataService: ItemRequestDataService = inject(ItemRequestDataService),
): Observable<ItemRequest> => {
const accessToken = route.queryParams.accessToken;
if ( !hasValue(accessToken) ) {
return null;
}
// Get
return itemRequestDataService.getSanitizedRequestByAccessToken(accessToken).pipe(
getFirstCompletedRemoteData(),
redirectOn4xx(router, authService),
getFirstSucceededRemoteDataPayload(),
tap(request => {
if (!hasValue(request)) {
console.dir('no request found for access token', accessToken);
router.navigateByUrl(getForbiddenRoute());
}
console.dir('found request: ', request);
console.dir(request);
return request;
}),
);
};

View File

@@ -6,7 +6,6 @@ import { itemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.reso
import { dsoEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver'; import { dsoEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver';
import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model';
import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { MenuItemType } from '../shared/menu/menu-item-type.model';
import { ItemAccessByTokenPageComponent } from './access-by-token/item-access-by-token-page.component';
import { BitstreamRequestACopyPageComponent } from './bitstreams/request-a-copy/bitstream-request-a-copy-page.component'; import { BitstreamRequestACopyPageComponent } from './bitstreams/request-a-copy/bitstream-request-a-copy-page.component';
import { UploadBitstreamComponent } from './bitstreams/upload/upload-bitstream.component'; import { UploadBitstreamComponent } from './bitstreams/upload/upload-bitstream.component';
import { ThemedFullItemPageComponent } from './full/themed-full-item-page.component'; import { ThemedFullItemPageComponent } from './full/themed-full-item-page.component';
@@ -22,6 +21,7 @@ import { orcidPageGuard } from './orcid-page/orcid-page.guard';
import { ThemedItemPageComponent } from './simple/themed-item-page.component'; import { ThemedItemPageComponent } from './simple/themed-item-page.component';
import { versionResolver } from './version-page/version.resolver'; import { versionResolver } from './version-page/version.resolver';
import { VersionPageComponent } from './version-page/version-page/version-page.component'; import { VersionPageComponent } from './version-page/version-page/version-page.component';
import { accessTokenResolver } from '../core/auth/access-token.resolver';
export const ROUTES: Route[] = [ export const ROUTES: Route[] = [
{ {
@@ -68,7 +68,10 @@ export const ROUTES: Route[] = [
}, },
{ {
path: ITEM_ACCESS_BY_TOKEN_PATH, path: ITEM_ACCESS_BY_TOKEN_PATH,
component: ItemAccessByTokenPageComponent, component: ThemedFullItemPageComponent,
resolve: {
menu: accessTokenResolver,
},
}, },
], ],
data: { data: {