From 4e10db8a53c45541ec43f407ac4337818f22f783 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Thu, 17 Sep 2020 11:31:16 +0200 Subject: [PATCH] 72541: user-agreement update to patch --- src/app/core/data/data.service.ts | 3 ++- .../end-user-agreement.service.spec.ts | 14 ++++---------- .../end-user-agreement.service.ts | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index 3b4e5f7d42..528889cd83 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -3,7 +3,7 @@ import { Store } from '@ngrx/store'; import { Operation } from 'fast-json-patch'; import { Observable } from 'rxjs'; import { distinctUntilChanged, filter, find, first, map, mergeMap, switchMap, take } from 'rxjs/operators'; -import { hasValue, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util'; +import { hasValue, hasValueOperator, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util'; import { NotificationOptions } from '../../shared/notifications/models/notification-options.model'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; @@ -376,6 +376,7 @@ export abstract class DataService implements UpdateDa ).subscribe(); return this.requestService.getByUUID(requestId).pipe( + hasValueOperator(), find((request: RequestEntry) => request.completed), map((request: RequestEntry) => request.response) ); diff --git a/src/app/core/end-user-agreement/end-user-agreement.service.spec.ts b/src/app/core/end-user-agreement/end-user-agreement.service.spec.ts index 4b0a37a94f..d50c730d28 100644 --- a/src/app/core/end-user-agreement/end-user-agreement.service.spec.ts +++ b/src/app/core/end-user-agreement/end-user-agreement.service.spec.ts @@ -7,6 +7,7 @@ import { CookieServiceMock } from '../../shared/mocks/cookie.service.mock'; import { of as observableOf } from 'rxjs'; import { EPerson } from '../eperson/models/eperson.model'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { RestResponse } from '../cache/response.models'; describe('EndUserAgreementService', () => { let service: EndUserAgreementService; @@ -36,7 +37,8 @@ describe('EndUserAgreementService', () => { getAuthenticatedUserFromStore: observableOf(userWithMetadata) }); ePersonService = jasmine.createSpyObj('ePersonService', { - update: createSuccessfulRemoteDataObject$(userWithMetadata) + update: createSuccessfulRemoteDataObject$(userWithMetadata), + patch: observableOf(new RestResponse(true, 200, 'OK')) }); service = new EndUserAgreementService(cookie, authService, ePersonService); @@ -98,15 +100,7 @@ describe('EndUserAgreementService', () => { it('setUserAcceptedAgreement should update the user with new metadata', (done) => { service.setUserAcceptedAgreement(true).subscribe(() => { - expect(ePersonService.update).toHaveBeenCalledWith(jasmine.objectContaining({ - metadata: jasmine.objectContaining({ - [END_USER_AGREEMENT_METADATA_FIELD]: [ - { - value: 'true' - } - ] - }) - })); + expect(ePersonService.patch).toHaveBeenCalled(); done(); }); }); diff --git a/src/app/core/end-user-agreement/end-user-agreement.service.ts b/src/app/core/end-user-agreement/end-user-agreement.service.ts index 31b606cfb4..23bda89169 100644 --- a/src/app/core/end-user-agreement/end-user-agreement.service.ts +++ b/src/app/core/end-user-agreement/end-user-agreement.service.ts @@ -5,10 +5,7 @@ import { Observable } from 'rxjs/internal/Observable'; import { of as observableOf } from 'rxjs'; import { map, switchMap, take } from 'rxjs/operators'; import { hasValue } from '../../shared/empty.util'; -import { cloneDeep } from 'lodash'; -import { Metadata } from '../shared/metadata.utils'; import { EPersonDataService } from '../eperson/eperson-data.service'; -import { getSucceededRemoteData } from '../shared/operators'; export const END_USER_AGREEMENT_COOKIE = 'hasAgreedEndUser'; export const END_USER_AGREEMENT_METADATA_FIELD = 'dspace.agreements.end-user'; @@ -67,13 +64,18 @@ export class EndUserAgreementService { switchMap((authenticated) => { if (authenticated) { return this.authService.getAuthenticatedUserFromStore().pipe( + take(1), switchMap((user) => { - const updatedUser = cloneDeep(user); - Metadata.setFirstValue(updatedUser.metadata, END_USER_AGREEMENT_METADATA_FIELD, String(accepted)); - return this.ePersonService.update(updatedUser); + const newValue = { value: String(accepted) }; + let operation; + if (user.hasMetadata(END_USER_AGREEMENT_METADATA_FIELD)) { + operation = { op: 'replace', path: `/metadata/${END_USER_AGREEMENT_METADATA_FIELD}/0`, value: newValue }; + } else { + operation = { op: 'add', path: `/metadata/${END_USER_AGREEMENT_METADATA_FIELD}`, value: [ newValue ] }; + } + return this.ePersonService.patch(user, [operation]); }), - getSucceededRemoteData(), - map((rd) => hasValue(rd.payload)) + map((response) => response.isSuccessful) ); } else { this.setCookieAccepted(accepted);