@@ -8,40 +8,50 @@ import {
88} from '@angular/core' ;
99import {
1010 ActivatedRoute ,
11- ParamMap ,
11+ Data ,
1212 Router ,
1313 RouterLink ,
1414} from '@angular/router' ;
1515import { TranslateModule } from '@ngx-translate/core' ;
1616import {
17+ combineLatest ,
1718 forkJoin ,
1819 Observable ,
20+ of ,
1921} from 'rxjs' ;
2022import {
2123 filter ,
2224 map ,
2325 mergeMap ,
2426 switchMap ,
27+ take ,
2528 tap ,
2629} from 'rxjs/operators' ;
2730
2831import { getDSORoute } from '../../app-routing-paths' ;
32+ import { COLLECTION_PAGE_LINKS_TO_FOLLOW } from '../../collection-page/collection-page.resolver' ;
2933import { Audit } from '../../core/audit/model/audit.model' ;
34+ import { AuthService } from '../../core/auth/auth.service' ;
3035import { DSONameService } from '../../core/breadcrumbs/dso-name.service' ;
3136import { SortDirection } from '../../core/cache/models/sort-options.model' ;
3237import { AuditDataService } from '../../core/data/audit-data.service' ;
3338import { CollectionDataService } from '../../core/data/collection-data.service' ;
3439import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service' ;
40+ import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service' ;
41+ import { FeatureID } from '../../core/data/feature-authorization/feature-id' ;
3542import { FindListOptions } from '../../core/data/find-list-options.model' ;
43+ import { ItemDataService } from '../../core/data/item-data.service' ;
3644import { PaginatedList } from '../../core/data/paginated-list.model' ;
3745import { RemoteData } from '../../core/data/remote-data' ;
3846import { PaginationService } from '../../core/pagination/pagination.service' ;
39- import { DSpaceObject } from '../../core/shared/dspace-object.model' ;
47+ import { Collection } from '../../core/shared/collection.model' ;
48+ import { Item } from '../../core/shared/item.model' ;
4049import {
4150 getFirstCompletedRemoteData ,
4251 getFirstSucceededRemoteDataPayload ,
4352} from '../../core/shared/operators' ;
4453import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model' ;
54+ import { createFailedRemoteDataObject } from '../../shared/remote-data.utils' ;
4555import { AuditTableComponent } from '../audit-table/audit-table.component' ;
4656/**
4757 * Component displaying a list of all audit about a object in a paginated table
@@ -61,7 +71,7 @@ export class ObjectAuditLogsComponent implements OnInit {
6171 /**
6272 * The object extracted from the route.
6373 */
64- object : DSpaceObject ;
74+ object : Item ;
6575
6676 /**
6777 * List of all audits
@@ -100,25 +110,43 @@ export class ObjectAuditLogsComponent implements OnInit {
100110
101111 objectRoute : string ;
102112
113+ owningCollection$ : Observable < Collection > ;
114+
103115 constructor ( protected route : ActivatedRoute ,
104116 protected router : Router ,
105117 protected auditService : AuditDataService ,
106118 protected paginationService : PaginationService ,
107119 protected collectionDataService : CollectionDataService ,
108120 protected dsoNameService : DSONameService ,
109121 protected dSpaceObjectDataService : DSpaceObjectDataService ,
122+ protected itemService : ItemDataService ,
110123 protected location : Location ,
124+ protected authorizationService : AuthorizationDataService ,
125+ protected authService : AuthService ,
111126 ) { }
112127
128+
113129 ngOnInit ( ) : void {
114- this . objectId$ = this . route . paramMap . pipe (
115- map ( ( paramMap : ParamMap ) => paramMap . get ( 'id' ) ) ,
116- switchMap ( ( id : string ) => this . dSpaceObjectDataService . findById ( id , true , true ) ) ,
130+ this . objectId$ = this . route . data . pipe (
131+ switchMap ( ( data : Data ) => {
132+ const d = this . itemService . findById ( data . dso . payload . id , true , true ) ;
133+ return d ;
134+ } ) ,
117135 getFirstSucceededRemoteDataPayload ( ) ,
118136 tap ( ( object ) => {
137+ this . object = object ;
119138 this . objectRoute = getDSORoute ( object ) ;
120139 this . objectId = object . id ;
121140 this . objectName = this . dsoNameService . getName ( object ) ;
141+ this . owningCollection$ = this . collectionDataService . findOwningCollectionFor (
142+ object ,
143+ true ,
144+ false ,
145+ ...COLLECTION_PAGE_LINKS_TO_FOLLOW ,
146+ ) . pipe (
147+ getFirstCompletedRemoteData ( ) ,
148+ map ( data => data ?. payload ) ,
149+ ) ;
122150 this . setAudits ( ) ;
123151 } ) ,
124152 map ( dso => dso . id ) ,
@@ -130,19 +158,29 @@ export class ObjectAuditLogsComponent implements OnInit {
130158 */
131159 setAudits ( ) {
132160 const config$ = this . paginationService . getFindListOptions ( this . pageConfig . id , this . config ) ;
161+ const isAdmin$ = this . isCurrentUserAdmin ( ) ;
162+ const parentCommunity$ = this . owningCollection$ . pipe (
163+ switchMap ( collection => collection . parentCommunity ) ,
164+ getFirstCompletedRemoteData ( ) ,
165+ map ( data => data ?. payload ) ,
166+ ) ;
133167
134- this . auditsRD$ = config$ . pipe (
135- switchMap ( ( config ) =>
136- this . auditService . findByObject ( this . objectId , config , false ) . pipe (
137- getFirstCompletedRemoteData ( ) ,
138- ) ,
139- ) ,
140- filter ( data => data && data ?. payload ?. page ?. length > 0 ) ,
168+ this . auditsRD$ = combineLatest ( [ isAdmin$ , config$ , this . owningCollection$ , parentCommunity$ ] ) . pipe (
169+ mergeMap ( ( [ isAdmin , config , owningCollection , parentCommunity ] ) => {
170+ if ( isAdmin ) {
171+ return this . auditService . findByObject ( this . objectId , config , owningCollection . id , parentCommunity . id , true )
172+ . pipe (
173+ getFirstCompletedRemoteData ( ) ,
174+ ) ;
175+ } else {
176+ return of ( createFailedRemoteDataObject < PaginatedList < Audit > > ( 'You do not have permission' ) ) ;
177+ }
178+ } ) ,
179+ filter ( data => data !== null ) ,
141180 map ( ( audits ) => {
142181 audits . payload ?. page . forEach ( ( audit ) => {
143182 audit . hasDetails = this . auditService . auditHasDetails ( audit ) ;
144183 } ) ;
145-
146184 return audits ;
147185 } ) ,
148186 mergeMap ( auditsRD => {
@@ -174,4 +212,18 @@ export class ObjectAuditLogsComponent implements OnInit {
174212 goBack ( ) : void {
175213 this . location . back ( ) ;
176214 }
215+
216+ isCurrentUserAdmin ( ) : Observable < boolean > {
217+ return combineLatest ( [
218+ this . authorizationService . isAuthorized ( FeatureID . IsCollectionAdmin ) ,
219+ this . authorizationService . isAuthorized ( FeatureID . IsCommunityAdmin ) ,
220+ this . authorizationService . isAuthorized ( FeatureID . AdministratorOf ) ,
221+ ] ) . pipe (
222+ map ( ( [ isCollectionAdmin , isCommunityAdmin , isSiteAdmin ] ) => {
223+ return isCollectionAdmin || isCommunityAdmin || isSiteAdmin ;
224+ } ) ,
225+ take ( 1 ) ,
226+ ) ;
227+ }
228+
177229}
0 commit comments