diff --git a/src/app/bitstream-page/bitstream-page-authorizations.guard.ts b/src/app/bitstream-page/bitstream-page-authorizations.guard.ts new file mode 100644 index 0000000000..9a14f12033 --- /dev/null +++ b/src/app/bitstream-page/bitstream-page-authorizations.guard.ts @@ -0,0 +1,21 @@ +import { inject } from '@angular/core'; +import { CanActivateFn, ResolveFn } from '@angular/router'; +import { Observable, of as observableOf } from 'rxjs'; +import { BitstreamPageResolver } from './bitstream-page.resolver'; +import { Bitstream } from '../core/shared/bitstream.model'; +import { dsoPageSingleFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; +import { FeatureID } from '../core/data/feature-authorization/feature-id'; +import { RemoteData } from '../core/data/remote-data'; + +/** + * Guard for preventing unauthorized access to certain {@link Bitstream} pages requiring specific authorizations. + * Checks authorization rights for managing policies. + */ +export const bitstreamPageAuthorizationsGuard: CanActivateFn = + dsoPageSingleFeatureGuard( + () => { + const bitstreamPageResolver = inject(BitstreamPageResolver); + return bitstreamPageResolver.resolve as ResolveFn>>; + }, + () => observableOf(FeatureID.CanManagePolicies) + ); diff --git a/src/app/bitstream-page/bitstream-page-routing.module.ts b/src/app/bitstream-page/bitstream-page-routing.module.ts index 3960ccb743..124c0d94db 100644 --- a/src/app/bitstream-page/bitstream-page-routing.module.ts +++ b/src/app/bitstream-page/bitstream-page-routing.module.ts @@ -13,6 +13,7 @@ import { BitstreamBreadcrumbResolver } from '../core/breadcrumbs/bitstream-bread import { BitstreamBreadcrumbsService } from '../core/breadcrumbs/bitstream-breadcrumbs.service'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { ThemedEditBitstreamPageComponent } from './edit-bitstream-page/themed-edit-bitstream-page.component'; +import { bitstreamPageAuthorizationsGuard } from './bitstream-page-authorizations.guard'; const EDIT_BITSTREAM_PATH = ':id/edit'; const EDIT_BITSTREAM_AUTHORIZATIONS_PATH = ':id/authorizations'; @@ -58,7 +59,7 @@ const EDIT_BITSTREAM_AUTHORIZATIONS_PATH = ':id/authorizations'; }, { path: EDIT_BITSTREAM_AUTHORIZATIONS_PATH, - + canActivate: [bitstreamPageAuthorizationsGuard], children: [ { path: 'create', diff --git a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts index 6713c17663..da1ee39170 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.routing.module.ts @@ -42,6 +42,10 @@ import { itemPageWithdrawGuard } from './item-page-withdraw.guard'; import { itemPageReinstateGuard } from './item-page-reinstate.guard'; import { itemPageRegisterDoiGuard } from './item-page-register-doi.guard'; import { itemPageVersionHistoryGuard } from './item-page-version-history.guard'; +import { itemPagePrivateGuard } from './item-page-private.guard'; +import { itemPageMoveGuard } from './item-page-move.guard'; +import { itemPageDeleteGuard } from './item-page-delete.guard'; +import { itemPageEditAuthorizationsGuard } from './item-page-edit-authorizations.guard'; /** * Routing module that handles the routing for the Edit Item page administrator functionality @@ -142,6 +146,7 @@ import { itemPageVersionHistoryGuard } from './item-page-version-history.guard'; { path: ITEM_EDIT_PRIVATE_PATH, component: ItemPrivateComponent, + canActivate: [itemPagePrivateGuard] }, { path: ITEM_EDIT_PUBLIC_PATH, @@ -150,11 +155,13 @@ import { itemPageVersionHistoryGuard } from './item-page-version-history.guard'; { path: ITEM_EDIT_DELETE_PATH, component: ItemDeleteComponent, + canActivate: [itemPageDeleteGuard] }, { path: ITEM_EDIT_MOVE_PATH, component: ItemMoveComponent, data: { title: 'item.edit.move.title' }, + canActivate: [itemPageMoveGuard] }, { path: ITEM_EDIT_REGISTER_DOI_PATH, @@ -179,7 +186,8 @@ import { itemPageVersionHistoryGuard } from './item-page-version-history.guard'; resourcePolicy: ResourcePolicyResolver }, component: ResourcePolicyEditComponent, - data: { title: 'resource-policies.edit.page.title' } + data: { title: 'resource-policies.edit.page.title' }, + canActivate: [itemPageEditAuthorizationsGuard] }, { path: '', diff --git a/src/app/item-page/edit-item-page/item-page-delete.guard.ts b/src/app/item-page/edit-item-page/item-page-delete.guard.ts new file mode 100644 index 0000000000..37cb4d781d --- /dev/null +++ b/src/app/item-page/edit-item-page/item-page-delete.guard.ts @@ -0,0 +1,23 @@ +import { inject } from '@angular/core'; +import { + dsoPageSingleFeatureGuard +} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; +import { Item } from '../../core/shared/item.model'; +import { ItemPageResolver } from '../item-page.resolver'; +import { CanActivateFn, ResolveFn } from '@angular/router'; +import { Observable, of as observableOf } from 'rxjs'; +import { FeatureID } from '../../core/data/feature-authorization/feature-id'; +import { RemoteData } from '../../core/data/remote-data'; + +/** + * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. + * Checks authorization rights for deleting items. + */ +export const itemPageDeleteGuard: CanActivateFn = + dsoPageSingleFeatureGuard( + () => { + const itemPageResolver = inject(ItemPageResolver); + return itemPageResolver.resolve as ResolveFn>>; + }, + () => observableOf(FeatureID.CanDelete) + ); diff --git a/src/app/item-page/edit-item-page/item-page-edit-authorizations.guard.ts b/src/app/item-page/edit-item-page/item-page-edit-authorizations.guard.ts new file mode 100644 index 0000000000..042967dbfb --- /dev/null +++ b/src/app/item-page/edit-item-page/item-page-edit-authorizations.guard.ts @@ -0,0 +1,23 @@ +import { inject } from '@angular/core'; +import { + dsoPageSingleFeatureGuard +} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; +import { Item } from '../../core/shared/item.model'; +import { ItemPageResolver } from '../item-page.resolver'; +import { CanActivateFn, ResolveFn } from '@angular/router'; +import { Observable, of as observableOf } from 'rxjs'; +import { FeatureID } from '../../core/data/feature-authorization/feature-id'; +import { RemoteData } from '../../core/data/remote-data'; + +/** + * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. + * Checks authorization rights for managing policies. + */ +export const itemPageEditAuthorizationsGuard: CanActivateFn = + dsoPageSingleFeatureGuard( + () => { + const itemPageResolver = inject(ItemPageResolver); + return itemPageResolver.resolve as ResolveFn>>; + }, + () => observableOf(FeatureID.CanManagePolicies) + ); diff --git a/src/app/item-page/edit-item-page/item-page-move.guard.ts b/src/app/item-page/edit-item-page/item-page-move.guard.ts new file mode 100644 index 0000000000..06c71738b7 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-page-move.guard.ts @@ -0,0 +1,23 @@ +import { inject } from '@angular/core'; +import { + dsoPageSingleFeatureGuard +} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; +import { Item } from '../../core/shared/item.model'; +import { ItemPageResolver } from '../item-page.resolver'; +import { CanActivateFn, ResolveFn } from '@angular/router'; +import { Observable, of as observableOf } from 'rxjs'; +import { FeatureID } from '../../core/data/feature-authorization/feature-id'; +import { RemoteData } from '../../core/data/remote-data'; + +/** + * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. + * Checks authorization rights for moving items. + */ +export const itemPageMoveGuard: CanActivateFn = + dsoPageSingleFeatureGuard( + () => { + const itemPageResolver = inject(ItemPageResolver); + return itemPageResolver.resolve as ResolveFn>>; + }, + () => observableOf(FeatureID.CanMove) + ); diff --git a/src/app/item-page/edit-item-page/item-page-private.guard.ts b/src/app/item-page/edit-item-page/item-page-private.guard.ts new file mode 100644 index 0000000000..eacfa1f874 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-page-private.guard.ts @@ -0,0 +1,23 @@ +import { inject } from '@angular/core'; +import { + dsoPageSingleFeatureGuard +} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; +import { Item } from '../../core/shared/item.model'; +import { ItemPageResolver } from '../item-page.resolver'; +import { CanActivateFn, ResolveFn } from '@angular/router'; +import { Observable, of as observableOf } from 'rxjs'; +import { FeatureID } from '../../core/data/feature-authorization/feature-id'; +import { RemoteData } from '../../core/data/remote-data'; + +/** + * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. + * Checks authorization rights for making items private. + */ +export const itemPagePrivateGuard: CanActivateFn = + dsoPageSingleFeatureGuard( + () => { + const itemPageResolver = inject(ItemPageResolver); + return itemPageResolver.resolve as ResolveFn>>; + }, + () => observableOf(FeatureID.CanMakePrivate) + );