Skip to content

Commit f811fdc

Browse files
Davide Negrettiatarix83
authored andcommitted
Merged in dspacecris7-DSC-280 (pull request #40)
[DSC-280] Allow to turnoff completely the end user agreement (cherry-pick from CST-4803) Approved-by: Giuseppe Digilio
2 parents a28e8d9 + af45685 commit f811fdc

8 files changed

Lines changed: 81 additions & 27 deletions

src/app/core/end-user-agreement/end-user-agreement-cookie.guard.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { EndUserAgreementService } from './end-user-agreement.service';
22
import { Router, UrlTree } from '@angular/router';
33
import { EndUserAgreementCookieGuard } from './end-user-agreement-cookie.guard';
4+
import { of } from 'rxjs';
45

56
describe('EndUserAgreementCookieGuard', () => {
67
let guard: EndUserAgreementCookieGuard;
@@ -10,7 +11,8 @@ describe('EndUserAgreementCookieGuard', () => {
1011

1112
beforeEach(() => {
1213
endUserAgreementService = jasmine.createSpyObj('endUserAgreementService', {
13-
isCookieAccepted: true
14+
isCookieAccepted: true,
15+
isUserAgreementEnabled: of(true),
1416
});
1517
router = jasmine.createSpyObj('router', {
1618
navigateByUrl: {},
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
import { Injectable } from '@angular/core';
22
import { AbstractEndUserAgreementGuard } from './abstract-end-user-agreement.guard';
3-
import { Observable, of as observableOf } from 'rxjs';
3+
import { Observable } from 'rxjs';
44
import { EndUserAgreementService } from './end-user-agreement.service';
55
import { Router } from '@angular/router';
6+
import { map } from 'rxjs/operators';
67

78
/**
89
* A guard redirecting users to the end agreement page when the user agreement cookie hasn't been accepted
910
*/
1011
@Injectable()
1112
export class EndUserAgreementCookieGuard extends AbstractEndUserAgreementGuard {
1213

13-
constructor(protected endUserAgreementService: EndUserAgreementService,
14-
protected router: Router) {
14+
constructor(
15+
protected endUserAgreementService: EndUserAgreementService,
16+
protected router: Router,
17+
) {
1518
super(router);
1619
}
1720

1821
/**
1922
* True when the user agreement cookie has been accepted
2023
*/
2124
hasAccepted(): Observable<boolean> {
22-
return observableOf(this.endUserAgreementService.isCookieAccepted());
25+
return this.endUserAgreementService.isUserAgreementEnabled().pipe(
26+
map((isUserAgreementEnabled) => isUserAgreementEnabled ? this.endUserAgreementService.isCookieAccepted() : true),
27+
);
2328
}
2429

2530
}

src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { EndUserAgreementCurrentUserGuard } from './end-user-agreement-current-user.guard';
22
import { EndUserAgreementService } from './end-user-agreement.service';
33
import { Router, UrlTree } from '@angular/router';
4-
import { of as observableOf } from 'rxjs';
4+
import { of, of as observableOf } from 'rxjs';
55

66
describe('EndUserAgreementGuard', () => {
77
let guard: EndUserAgreementCurrentUserGuard;
@@ -11,7 +11,8 @@ describe('EndUserAgreementGuard', () => {
1111

1212
beforeEach(() => {
1313
endUserAgreementService = jasmine.createSpyObj('endUserAgreementService', {
14-
hasCurrentUserAcceptedAgreement: observableOf(true)
14+
hasCurrentUserAcceptedAgreement: observableOf(true),
15+
isUserAgreementEnabled: of(true),
1516
});
1617
router = jasmine.createSpyObj('router', {
1718
navigateByUrl: {},
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
11
import { Injectable } from '@angular/core';
2-
import { Observable } from 'rxjs';
2+
import { Observable, of } from 'rxjs';
33
import { AbstractEndUserAgreementGuard } from './abstract-end-user-agreement.guard';
44
import { EndUserAgreementService } from './end-user-agreement.service';
55
import { Router } from '@angular/router';
6+
import { switchMap } from 'rxjs/operators';
67

78
/**
89
* A guard redirecting logged in users to the end agreement page when they haven't accepted the latest user agreement
910
*/
1011
@Injectable()
1112
export class EndUserAgreementCurrentUserGuard extends AbstractEndUserAgreementGuard {
1213

13-
constructor(protected endUserAgreementService: EndUserAgreementService,
14-
protected router: Router) {
14+
constructor(
15+
protected endUserAgreementService: EndUserAgreementService,
16+
protected router: Router,
17+
) {
1518
super(router);
1619
}
1720

1821
/**
1922
* True when the currently logged in user has accepted the agreements or when the user is not currently authenticated
2023
*/
2124
hasAccepted(): Observable<boolean> {
22-
return this.endUserAgreementService.hasCurrentUserAcceptedAgreement(true);
25+
return this.endUserAgreementService.isUserAgreementEnabled().pipe(
26+
switchMap((isUserAgreementEnabled) => isUserAgreementEnabled ?
27+
this.endUserAgreementService.hasCurrentUserAcceptedAgreement(true) : of(true)
28+
),
29+
);
2330
}
2431

2532
}

src/app/core/end-user-agreement/end-user-agreement.service.spec.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import {
66
import { CookieServiceMock } from '../../shared/mocks/cookie.service.mock';
77
import { of as observableOf } from 'rxjs';
88
import { EPerson } from '../eperson/models/eperson.model';
9-
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
9+
import {
10+
createNoContentRemoteDataObject,
11+
createSuccessfulRemoteDataObject$
12+
} from '../../shared/remote-data.utils';
13+
import { ConfigurationProperty } from '../shared/configuration-property.model';
1014

1115
describe('EndUserAgreementService', () => {
1216
let service: EndUserAgreementService;
@@ -17,6 +21,7 @@ describe('EndUserAgreementService', () => {
1721
let cookie;
1822
let authService;
1923
let ePersonService;
24+
let configurationDataService;
2025

2126
beforeEach(() => {
2227
userWithMetadata = Object.assign(new EPerson(), {
@@ -29,6 +34,10 @@ describe('EndUserAgreementService', () => {
2934
}
3035
});
3136
userWithoutMetadata = Object.assign(new EPerson());
37+
const configurationPropertyMock = Object.assign(new ConfigurationProperty(), {
38+
values: ['false'],
39+
});
40+
const configurationPropertyMockRD$ = createNoContentRemoteDataObject<ConfigurationProperty>();
3241

3342
cookie = new CookieServiceMock();
3443
authService = jasmine.createSpyObj('authService', {
@@ -39,8 +48,11 @@ describe('EndUserAgreementService', () => {
3948
update: createSuccessfulRemoteDataObject$(userWithMetadata),
4049
patch: createSuccessfulRemoteDataObject$({})
4150
});
51+
configurationDataService = jasmine.createSpyObj('configurationDataService', {
52+
findByPropertyName: configurationPropertyMockRD$,
53+
});
4254

43-
service = new EndUserAgreementService(cookie, authService, ePersonService);
55+
service = new EndUserAgreementService(cookie, authService, ePersonService, configurationDataService);
4456
});
4557

4658
describe('when the cookie is set to true', () => {

src/app/core/end-user-agreement/end-user-agreement.service.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,43 @@ import { map, switchMap, take } from 'rxjs/operators';
66
import { hasValue } from '../../shared/empty.util';
77
import { EPersonDataService } from '../eperson/eperson-data.service';
88
import { getFirstCompletedRemoteData } from '../shared/operators';
9+
import { ConfigurationDataService } from '../data/configuration-data.service';
10+
import { calcPossibleSecurityContexts } from '@angular/compiler/src/template_parser/binding_parser';
911

1012
export const END_USER_AGREEMENT_COOKIE = 'hasAgreedEndUser';
1113
export const END_USER_AGREEMENT_METADATA_FIELD = 'dspace.agreements.end-user';
14+
export const END_USER_AGREEMENT_ENABLED_PROPERTY = 'user-agreement.enabled';
15+
export const END_USER_AGREEMENT_ENABLED_PROPERTY_DEFAULT = true;
1216

1317
/**
1418
* Service for checking and managing the status of the current end user agreement
1519
*/
1620
@Injectable()
1721
export class EndUserAgreementService {
1822

19-
constructor(protected cookie: CookieService,
20-
protected authService: AuthService,
21-
protected ePersonService: EPersonDataService) {
23+
constructor(
24+
protected cookie: CookieService,
25+
protected authService: AuthService,
26+
protected ePersonService: EPersonDataService,
27+
protected configurationDataService: ConfigurationDataService,
28+
) {
29+
}
30+
31+
/**
32+
* Check in remote configuration if user agreements are enabled
33+
*/
34+
isUserAgreementEnabled(): Observable<boolean> {
35+
return this.configurationDataService.findByPropertyName(END_USER_AGREEMENT_ENABLED_PROPERTY).pipe(
36+
getFirstCompletedRemoteData(),
37+
// if property is undefined (or truthy but not 'true') return default value
38+
map((res) => {
39+
switch (res?.payload?.values[0]) {
40+
case 'true': return true;
41+
case 'false': return false;
42+
default: return END_USER_AGREEMENT_ENABLED_PROPERTY_DEFAULT;
43+
}
44+
}),
45+
);
2246
}
2347

2448
/**

src/app/register-page/create-profile/create-profile.component.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Store } from '@ngrx/store';
1010
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
1111
import { EPersonDataService } from '../../core/eperson/eperson-data.service';
1212
import { NotificationsService } from '../../shared/notifications/notifications.service';
13-
import { of as observableOf } from 'rxjs';
13+
import { of, of as observableOf } from 'rxjs';
1414
import { By } from '@angular/platform-browser';
1515
import { CoreState } from '../../core/core.reducers';
1616
import { EPerson } from '../../core/eperson/models/eperson.model';
@@ -120,7 +120,8 @@ describe('CreateProfileComponent', () => {
120120

121121
endUserAgreementService = jasmine.createSpyObj('endUserAgreementService', {
122122
isCookieAccepted: false,
123-
removeCookieAccepted: {}
123+
removeCookieAccepted: {},
124+
isUserAgreementEnabled: of(true),
124125
});
125126

126127
TestBed.configureTestingModule({

src/app/register-page/create-profile/create-profile.component.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,17 @@ export class CreateProfileComponent implements OnInit {
152152
requireCertificate: false
153153
};
154154

155-
// If the End User Agreement is accepted, add end-user agreement metadata to the user
156-
if (this.userAgreementAccept) {
157-
values.metadata[END_USER_AGREEMENT_METADATA_FIELD] = [
158-
{
159-
value: String(true)
160-
}
161-
];
162-
this.endUserAgreementService.removeCookieAccepted();
163-
}
155+
// If the End User Agreement cookie is accepted, add end-user agreement metadata to the user
156+
this.endUserAgreementService.isUserAgreementEnabled().subscribe((isUserAgreementEnabled) => {
157+
if (isUserAgreementEnabled && this.userAgreementAccept) {
158+
values.metadata[END_USER_AGREEMENT_METADATA_FIELD] = [
159+
{
160+
value: String(true)
161+
}
162+
];
163+
this.endUserAgreementService.removeCookieAccepted();
164+
}
165+
});
164166

165167
const eperson = Object.assign(new EPerson(), values);
166168
this.ePersonDataService.createEPersonForToken(eperson, this.token).pipe(

0 commit comments

Comments
 (0)