Skip to content

Commit fdeceaf

Browse files
committed
[DSC-1504] Adjust services, comps, tests for CRIS9
Refs: DURACOM-317, DSC-1504
1 parent 0b9d184 commit fdeceaf

5 files changed

Lines changed: 166 additions & 58 deletions

File tree

src/app/audit-page/object-audit-overview/object-audit-logs.component.spec.ts

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,24 @@ import { provideMockStore } from '@ngrx/store/testing';
1717
import { TranslateModule } from '@ngx-translate/core';
1818
import { of } from 'rxjs';
1919

20+
import { APP_DATA_SERVICES_MAP } from '../../../config/app-config.interface';
2021
import { Audit } from '../../core/audit/model/audit.model';
22+
import { AuthService } from '../../core/auth/auth.service';
23+
import { AuthRequestService } from '../../core/auth/auth-request.service';
24+
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
2125
import { AuditDataService } from '../../core/data/audit-data.service';
2226
import { CollectionDataService } from '../../core/data/collection-data.service';
2327
import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service';
24-
//import { APP_DATA_SERVICES_MAP } from '../../core/data-services-map-type';
28+
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
29+
import { ItemDataService } from '../../core/data/item-data.service';
2530
import { PaginationService } from '../../core/pagination/pagination.service';
2631
import { Item } from '../../core/shared/item.model';
2732
import { MockActivatedRoute } from '../../shared/mocks/active-router.mock';
2833
import { RouterMock } from '../../shared/mocks/router.mock';
29-
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
34+
import {
35+
createSuccessfulRemoteDataObject,
36+
createSuccessfulRemoteDataObject$,
37+
} from '../../shared/remote-data.utils';
3038
import { AuditMock } from '../../shared/testing/audit.mock';
3139
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
3240
import { createPaginatedList } from '../../shared/testing/utils.test';
@@ -38,8 +46,13 @@ describe('ObjectAuditLogsComponent', () => {
3846
let fixture: ComponentFixture<ObjectAuditLogsComponent>;
3947

4048
let auditService: AuditDataService;
49+
let authRequestService: AuthRequestService;
4150
let audits: Audit[];
4251
let dSpaceObjectDataService: DSpaceObjectDataService;
52+
let itemDataService: ItemDataService;
53+
let authorizationService: AuthorizationDataService;
54+
let dsoNameService: DSONameService;
55+
let authService: AuthService;
4356
let collectionService;
4457
let activatedRoute;
4558
let locationStub: Location;
@@ -56,16 +69,31 @@ describe('ObjectAuditLogsComponent', () => {
5669
getOtherObject: of(new Audit()),
5770
});
5871
dSpaceObjectDataService = jasmine.createSpyObj('DSpaceObjectDataService', { findById: createSuccessfulRemoteDataObject$(mockItem) });
72+
itemDataService = jasmine.createSpyObj('ItemDataService', {
73+
findById: createSuccessfulRemoteDataObject$(mockItem),
74+
});
5975
collectionService = jasmine.createSpyObj('CollectionDataService',
6076
{ findOwningCollectionFor: createSuccessfulRemoteDataObject$(createPaginatedList([{ id : 'collectionId' }])) },
6177
);
6278
activatedRoute = new MockActivatedRoute({ objectId: mockItemId });
6379
activatedRoute.paramMap = of({
6480
get: () => mockItemId,
6581
});
82+
activatedRoute.data = of({
83+
dso: createSuccessfulRemoteDataObject(mockItem),
84+
});
6685
locationStub = jasmine.createSpyObj('location', {
6786
back: jasmine.createSpy('back'),
6887
});
88+
authorizationService = jasmine.createSpyObj('AuthorizationDataService', {
89+
isAuthorized: of(true),
90+
});
91+
dsoNameService = jasmine.createSpyObj('DSONameService', {
92+
getName: 'Test Item',
93+
});
94+
authService = jasmine.createSpyObj('AuthService', {
95+
isAuthenticated: of(true),
96+
});
6997
}
7098

7199
beforeEach(waitForAsync(() => {
@@ -80,13 +108,18 @@ describe('ObjectAuditLogsComponent', () => {
80108
],
81109
providers: [
82110
{ provide: AuditDataService, useValue: auditService },
111+
{ provide: AuthRequestService, useValue: authRequestService },
83112
{ provide: PaginationService, useValue: new PaginationServiceStub() },
84113
{ provide: DSpaceObjectDataService, useValue: dSpaceObjectDataService },
114+
{ provide: ItemDataService, useValue: itemDataService },
85115
{ provide: ActivatedRoute, useValue: activatedRoute },
86116
{ provide: Router, useValue: new RouterMock() },
87117
{ provide: CollectionDataService, useValue: collectionService },
88-
//{ provide: APP_DATA_SERVICES_MAP, useValue: new Map() },
118+
{ provide: APP_DATA_SERVICES_MAP, useValue: new Map() },
89119
{ provide: Location, useValue: locationStub },
120+
{ provide: AuthorizationDataService, useValue: authorizationService },
121+
{ provide: DSONameService, useValue: dsoNameService },
122+
{ provide: AuthService, useValue: authService },
90123
provideMockStore({}),
91124
],
92125
schemas: [NO_ERRORS_SCHEMA],
@@ -113,12 +146,16 @@ describe('ObjectAuditLogsComponent', () => {
113146
expect(component.setAudits).toHaveBeenCalled();
114147
}));
115148

116-
it('should set object id', (done) => {
149+
it('should set object id', fakeAsync(() => {
150+
tick();
151+
fixture.detectChanges();
152+
117153
component.objectId$.subscribe((id) => {
118154
expect(id).toEqual(mockItemId);
119155
expect(component.objectId).toEqual(id);
120-
done();
121156
});
122-
});
157+
158+
tick();
159+
}));
123160
});
124161
});

src/app/audit-page/object-audit-overview/object-audit-logs.component.ts

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,40 +8,50 @@ import {
88
} from '@angular/core';
99
import {
1010
ActivatedRoute,
11-
ParamMap,
11+
Data,
1212
Router,
1313
RouterLink,
1414
} from '@angular/router';
1515
import { TranslateModule } from '@ngx-translate/core';
1616
import {
17+
combineLatest,
1718
forkJoin,
1819
Observable,
20+
of,
1921
} from 'rxjs';
2022
import {
2123
filter,
2224
map,
2325
mergeMap,
2426
switchMap,
27+
take,
2528
tap,
2629
} from 'rxjs/operators';
2730

2831
import { getDSORoute } from '../../app-routing-paths';
32+
import { COLLECTION_PAGE_LINKS_TO_FOLLOW } from '../../collection-page/collection-page.resolver';
2933
import { Audit } from '../../core/audit/model/audit.model';
34+
import { AuthService } from '../../core/auth/auth.service';
3035
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
3136
import { SortDirection } from '../../core/cache/models/sort-options.model';
3237
import { AuditDataService } from '../../core/data/audit-data.service';
3338
import { CollectionDataService } from '../../core/data/collection-data.service';
3439
import { 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';
3542
import { FindListOptions } from '../../core/data/find-list-options.model';
43+
import { ItemDataService } from '../../core/data/item-data.service';
3644
import { PaginatedList } from '../../core/data/paginated-list.model';
3745
import { RemoteData } from '../../core/data/remote-data';
3846
import { 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';
4049
import {
4150
getFirstCompletedRemoteData,
4251
getFirstSucceededRemoteDataPayload,
4352
} from '../../core/shared/operators';
4453
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
54+
import { createFailedRemoteDataObject } from '../../shared/remote-data.utils';
4555
import { 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
}

src/app/core/data/audit-data.service.spec.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ import {
1111
TranslateModule,
1212
} from '@ngx-translate/core';
1313

14-
import { RequestParam } from '../cache/models/request-param.model';
15-
import { CoreState } from '../core-state.model';
16-
import { followLink } from '../shared/follow-link-config.model';
17-
import { AuditMock } from '../testing/audit.mock';
18-
import { HALEndpointServiceStub } from '../testing/hal-endpoint-service.stub';
19-
import { getMockRequestService } from '../testing/request.service.mock';
20-
import { TranslateLoaderMock } from '../testing/translate-loader.mock';
14+
import { getMockRequestService } from '../../shared/mocks/request.service.mock';
15+
import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock';
16+
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
17+
import { AuditMock } from '../../shared/testing/audit.mock';
18+
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub';
2119
import {
2220
createPaginatedList,
2321
createRequestEntry$,
24-
} from '../testing/utils.test';
25-
import { createSuccessfulRemoteDataObject$ } from '../utilities/remote-data.utils';
22+
} from '../../shared/testing/utils.test';
23+
import { followLink } from '../../shared/utils/follow-link-config.model';
24+
import { RequestParam } from '../cache/models/request-param.model';
25+
import { CoreState } from '../core-state.model';
26+
import { FindListOptions } from '../data/find-list-options.model';
27+
import { RequestService } from '../data/request.service';
2628
import {
2729
AUDIT_FIND_BY_OBJECT_SEARCH_METHOD,
2830
AuditDataService,
2931
} from './audit-data.service';
30-
import { FindListOptions } from './find-list-options.model';
31-
import { RequestService } from './request.service';
3232

3333
describe('AuditDataService', () => {
3434
let service: AuditDataService;

0 commit comments

Comments
 (0)