From 58d0e7f513a4459bca8cc33c00115c5c4b9171bd Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Thu, 6 Mar 2025 19:03:55 +0100 Subject: [PATCH] Request-a-copy: Using a resolver to grab the RequestItem --- src/app/core/auth/access-token.resolver.ts | 46 ++++++++++++++++++++++ src/app/item-page/item-page-routes.ts | 7 +++- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/app/core/auth/access-token.resolver.ts diff --git a/src/app/core/auth/access-token.resolver.ts b/src/app/core/auth/access-token.resolver.ts new file mode 100644 index 0000000000..f29b047cfd --- /dev/null +++ b/src/app/core/auth/access-token.resolver.ts @@ -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 = ( + route, + state, + router: Router = inject(Router), + authService: AuthService = inject(AuthService), + itemRequestDataService: ItemRequestDataService = inject(ItemRequestDataService), +): Observable => { + 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; + }), + ); +}; diff --git a/src/app/item-page/item-page-routes.ts b/src/app/item-page/item-page-routes.ts index e6d9979786..12ddcba701 100644 --- a/src/app/item-page/item-page-routes.ts +++ b/src/app/item-page/item-page-routes.ts @@ -6,7 +6,6 @@ import { itemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.reso import { dsoEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.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 { UploadBitstreamComponent } from './bitstreams/upload/upload-bitstream.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 { versionResolver } from './version-page/version.resolver'; import { VersionPageComponent } from './version-page/version-page/version-page.component'; +import { accessTokenResolver } from '../core/auth/access-token.resolver'; export const ROUTES: Route[] = [ { @@ -68,7 +68,10 @@ export const ROUTES: Route[] = [ }, { path: ITEM_ACCESS_BY_TOKEN_PATH, - component: ItemAccessByTokenPageComponent, + component: ThemedFullItemPageComponent, + resolve: { + menu: accessTokenResolver, + }, }, ], data: {