Skip to content

Commit b95416a

Browse files
author
George Nash
committed
added update for user member name field when member name is updated in member service
1 parent 3a06912 commit b95416a

File tree

12 files changed

+132
-69
lines changed

12 files changed

+132
-69
lines changed

assertion-service/src/test/java/org/orcid/memberportal/service/assertion/web/rest/AssertionResourceTest.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ class AssertionResourceTest {
8686

8787
@Mock
8888
private RorOrgValidator rorOrgValidator;
89-
89+
9090
@Mock
9191
private MemberService memberService;
92-
92+
9393
@Mock
9494
private NotificationService notificationService;
9595

@@ -101,7 +101,7 @@ class AssertionResourceTest {
101101

102102
@Mock
103103
private GridOrgValidator gridOrgValidator;
104-
104+
105105
@InjectMocks
106106
private AssertionResource assertionResource;
107107

@@ -115,7 +115,7 @@ public void setUp() {
115115
Mockito.when(assertionsUserService.getLoggedInUser()).thenReturn(getUser());
116116
Mockito.when(assertionsUserService.getLoggedInUserSalesforceId()).thenReturn(DEFAULT_SALESFORCE_ID);
117117
}
118-
118+
119119
@Test
120120
void testGetAssertionOfPendingStatus() {
121121
Assertion pendingAssertion = new Assertion();
@@ -126,7 +126,7 @@ void testGetAssertionOfPendingStatus() {
126126
Mockito.verify(assertionService).findById(Mockito.eq("test"));
127127
Mockito.verify(assertionService).populatePermissionLink(Mockito.any(Assertion.class));
128128
}
129-
129+
130130
@Test
131131
void testGetAssertionOfNotificationSentStatus() {
132132
Assertion pendingAssertion = new Assertion();
@@ -137,7 +137,7 @@ void testGetAssertionOfNotificationSentStatus() {
137137
Mockito.verify(assertionService).findById(Mockito.eq("test"));
138138
Mockito.verify(assertionService).populatePermissionLink(Mockito.any(Assertion.class));
139139
}
140-
140+
141141
@Test
142142
void testGetAssertionOfDeniedAccessStatus() {
143143
Assertion pendingAssertion = new Assertion();
@@ -148,7 +148,7 @@ void testGetAssertionOfDeniedAccessStatus() {
148148
Mockito.verify(assertionService).findById(Mockito.eq("test"));
149149
Mockito.verify(assertionService).populatePermissionLink(Mockito.any(Assertion.class));
150150
}
151-
151+
152152
@Test
153153
void testGetAssertionOfRevokedAccessStatus() {
154154
Assertion pendingAssertion = new Assertion();
@@ -159,7 +159,7 @@ void testGetAssertionOfRevokedAccessStatus() {
159159
Mockito.verify(assertionService).findById(Mockito.eq("test"));
160160
Mockito.verify(assertionService).populatePermissionLink(Mockito.any(Assertion.class));
161161
}
162-
162+
163163
@Test
164164
void testGetAssertionOfInOrcidStatus() {
165165
Assertion pendingAssertion = new Assertion();
@@ -169,7 +169,7 @@ void testGetAssertionOfInOrcidStatus() {
169169
Mockito.verify(assertionService).findById(Mockito.eq("test"));
170170
Mockito.verify(assertionService, Mockito.never()).populatePermissionLink(Mockito.any(Assertion.class));
171171
}
172-
172+
173173
@Test
174174
void testSendNotifications() {
175175
Mockito.when(assertionsUserService.getLoggedInUser()).thenReturn(getUser());
@@ -180,23 +180,23 @@ void testSendNotifications() {
180180
Mockito.verify(assertionService).markPendingAssertionsAsNotificationRequested(Mockito.eq(DEFAULT_SALESFORCE_ID));
181181
Mockito.verify(memberService).updateMemberDefaultLanguage(Mockito.eq(DEFAULT_SALESFORCE_ID), Mockito.eq("en"));
182182
}
183-
183+
184184
@Test
185185
void testGetNotificationRequestInProgress_inProgressIsTrue() {
186186
Mockito.when(assertionsUserService.getLoggedInUserSalesforceId()).thenReturn(DEFAULT_SALESFORCE_ID);
187187
Mockito.when(notificationService.requestInProgress(Mockito.eq(DEFAULT_SALESFORCE_ID))).thenReturn(true);
188-
188+
189189
ResponseEntity<NotificationRequestInProgress> response = assertionResource.getNotificationRequestInProgress();
190190
assertTrue(response.getStatusCode().is2xxSuccessful());
191191
assertNotNull(response.getBody());
192192
assertTrue(response.getBody().getInProgress());
193193
}
194-
194+
195195
@Test
196196
void testGetNotificationRequestInProgress_inProgressIsFalse() {
197197
Mockito.when(assertionsUserService.getLoggedInUserSalesforceId()).thenReturn(DEFAULT_SALESFORCE_ID);
198198
Mockito.when(notificationService.requestInProgress(Mockito.eq(DEFAULT_SALESFORCE_ID))).thenReturn(false);
199-
199+
200200
ResponseEntity<NotificationRequestInProgress> response = assertionResource.getNotificationRequestInProgress();
201201
assertTrue(response.getStatusCode().is2xxSuccessful());
202202
assertNotNull(response.getBody());
@@ -390,14 +390,15 @@ void testGetAssertions() throws BadRequestAlertException, org.codehaus.jettison.
390390
ResponseEntity<List<Assertion>> page = assertionResource.getAssertions(Mockito.mock(Pageable.class), new HttpHeaders(), UriComponentsBuilder.newInstance(), "");
391391
assertNotNull(page.getBody());
392392
}
393-
393+
394394
@Test
395395
void testUpdateSalesforceId() {
396396
Mockito.when(assertionService.updateAssertionsSalesforceId(Mockito.eq("salesforce-id"), Mockito.eq("new-salesforce-id"))).thenReturn(true);
397+
Mockito.when(orcidRecordService.updateTokenSalesforceIds(Mockito.eq("salesforce-id"), Mockito.eq("new-salesforce-id"))).thenReturn(true);
397398
ResponseEntity<Void> response = assertionResource.updateSalesforceId("salesforce-id", "new-salesforce-id");
398399
assertTrue(response.getStatusCode().is2xxSuccessful());
399400
}
400-
401+
401402
@Test
402403
void testUpdateSalesforceIdWithError() {
403404
Mockito.when(assertionService.updateAssertionsSalesforceId(Mockito.eq("salesforce-id"), Mockito.eq("new-salesforce-id"))).thenReturn(false);
@@ -477,7 +478,7 @@ private AssertionServiceUser getUser() {
477478
user.setLangKey("en");
478479
return user;
479480
}
480-
481+
481482
private NotificationRequest getNotificationRequest() {
482483
NotificationRequest request = new NotificationRequest();
483484
request.setLanguage("en");

member-service/src/main/java/org/orcid/memberportal/service/member/client/UserServiceClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,7 @@ public interface UserServiceClient {
4242
ResponseEntity<Void> deleteUser(@PathVariable("loginOrId") String loginOrId,
4343
@RequestParam(value = "noMainContactCheck", required = false) boolean noMainContactCheck);
4444

45+
@RequestMapping(method = RequestMethod.PUT, value = "/api/users/memberName/{oldMemberName}/{newMemberName}", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
46+
@HystrixProperty(name = "hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds", value = "50000")
47+
ResponseEntity<String> updateUsersMemberNames(String salesforceId, String oldMemberName, String newMemberName);
4548
}

member-service/src/main/java/org/orcid/memberportal/service/member/services/MemberService.java

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,25 @@ public Member updateMember(Member member) {
134134
existingMember.setAssertionServiceEnabled(member.getAssertionServiceEnabled());
135135
existingMember.setIsConsortiumLead(member.getIsConsortiumLead());
136136

137-
return propagateUpdatesAndSave(member, existingMember);
137+
propagateUpdatesAndSave(member, existingMember);
138+
139+
return memberRepository.save(existingMember);
138140
}
139141

140-
private Member propagateUpdatesAndSave(Member member, Member existingMember) {
141-
String oldSalesforceId = existingMember.getSalesforceId();
142-
String newSalesforceId = member.getSalesforceId();
142+
private void propagateUpdatesAndSave(Member member, Member existingMember) {
143+
if (!existingMember.getSalesforceId().equals(member.getSalesforceId())) {
144+
updateAssertionSalesforceIds(existingMember.getSalesforceId(), member.getSalesforceId());
145+
updateUserSalesforceIds(existingMember.getSalesforceId(), member.getSalesforceId());
146+
existingMember.setSalesforceId(member.getSalesforceId());
147+
}
143148

144-
// Check if salesforceId changed
145-
if (!oldSalesforceId.equals(newSalesforceId)) {
146-
updateAssertionSalesforceIds(oldSalesforceId, newSalesforceId);
147-
updateUserSalesforceIds(oldSalesforceId, newSalesforceId);
148-
return updateMemberSalesforceId(existingMember, newSalesforceId, oldSalesforceId);
149+
if (!member.getClientName().equals(existingMember.getClientName())) {
150+
updateUserMemberNames(existingMember.getSalesforceId(), existingMember.getClientName(), member.getClientName());
149151
}
150-
return memberRepository.save(existingMember);
152+
}
153+
154+
private void updateUserMemberNames(String salesforceId, String oldClientName, String newClientName) {
155+
userService.updateUsersMemberNames(salesforceId, oldClientName, newClientName);
151156
}
152157

153158
private void updateAssertionSalesforceIds(String oldSalesforceId, String newSalesforceId) {
@@ -171,18 +176,6 @@ private void updateUserSalesforceIds(String oldSalesforceId, String newSalesforc
171176
}
172177
}
173178

174-
private Member updateMemberSalesforceId(Member existingMember, String newSalesforceId, String oldSalesforceId) {
175-
existingMember.setSalesforceId(newSalesforceId);
176-
try {
177-
return memberRepository.save(existingMember);
178-
} catch (Exception e) {
179-
LOG.error("Error updating member's salesforce id from {} to {}. Rolling back user and assertion changes", oldSalesforceId, newSalesforceId);
180-
assertionService.updateAssertionsSalesforceId(newSalesforceId, oldSalesforceId);
181-
userService.updateUsersSalesforceId(newSalesforceId, oldSalesforceId);
182-
throw new RuntimeException(e);
183-
}
184-
}
185-
186179
private void validateMemberUpdate(Member member, Optional<Member> existingMember) {
187180
MemberValidation validation = memberValidator.validate(member, userService.getLoggedInUser());
188181
if (!validation.isValid()) {

member-service/src/main/java/org/orcid/memberportal/service/member/services/UserService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,11 @@ public void deleteUserById(String loginOrId, boolean noMainContactCheck) {
8888
}
8989
}
9090

91+
public void updateUsersMemberNames(String salesforceId, String oldClientName, String newClientName) {
92+
ResponseEntity<String> response = userServiceClient.updateUsersMemberNames(salesforceId, oldClientName, newClientName);
93+
if (!response.getStatusCode().is2xxSuccessful()) {
94+
LOG.warn("Error updating user member names {}, sf id {}, response code {}", oldClientName, salesforceId, response.getStatusCodeValue());
95+
throw new RuntimeException("Failed to update users' member names");
96+
}
97+
}
9198
}

member-service/src/test/java/org/orcid/memberportal/service/member/services/MemberServiceTest.java

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -232,34 +232,6 @@ public Member answer(InvocationOnMock invocation) throws Throwable {
232232
Mockito.verify(memberRepository, Mockito.never()).save(Mockito.any(Member.class));
233233
}
234234

235-
@Test
236-
void testUpdateMemberWithSalesforceIdUpdateWithMemberFailure() {
237-
Mockito.when(memberValidator.validate(Mockito.any(Member.class), Mockito.any(MemberServiceUser.class))).thenReturn(getValidValidation());
238-
Mockito.when(memberRepository.findById(Mockito.anyString())).thenReturn(Optional.of(getMember()));
239-
Mockito.when(memberRepository.save(Mockito.any(Member.class))).thenAnswer(new Answer<Member>() {
240-
@Override
241-
public Member answer(InvocationOnMock invocation) throws Throwable {
242-
return (Member) invocation.getArgument(0);
243-
}
244-
});
245-
246-
Mockito.doThrow(new RuntimeException()).when(memberRepository).save(Mockito.any(Member.class));
247-
248-
Member member = getMember();
249-
member.setId("id");
250-
member.setSalesforceId("three");
251-
252-
Assertions.assertThrows(RuntimeException.class, () -> {
253-
memberService.updateMember(member);
254-
});
255-
256-
// check assertion and user changes rolled back
257-
Mockito.verify(assertionService, Mockito.times(1)).updateAssertionsSalesforceId(Mockito.eq("two"), Mockito.eq("three"));
258-
Mockito.verify(assertionService, Mockito.times(1)).updateAssertionsSalesforceId(Mockito.eq("three"), Mockito.eq("two"));
259-
Mockito.verify(userService, Mockito.times(1)).updateUsersSalesforceId(Mockito.eq("two"), Mockito.eq("three"));
260-
Mockito.verify(userService, Mockito.times(1)).updateUsersSalesforceId(Mockito.eq("three"), Mockito.eq("two"));
261-
}
262-
263235
@Test
264236
void testUpdateMemberWithSalesforceIdUpdate() {
265237
Mockito.when(memberValidator.validate(Mockito.any(Member.class), Mockito.any(MemberServiceUser.class))).thenReturn(getValidValidation());
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.orcid.memberportal.service.user.repository;
2+
3+
import org.orcid.memberportal.service.user.domain.User;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
6+
import org.springframework.data.mongodb.repository.MongoRepository;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.time.Instant;
10+
import java.util.List;
11+
import java.util.Optional;
12+
13+
/**
14+
* Spring Data MongoDB repository for the {@link User} entity.
15+
*/
16+
@Repository
17+
public interface CustomUserRepository {
18+
19+
boolean updateMemberNames(String salesforceId, String oldMemberName, String newMemberName);
20+
}

user-service/src/main/java/org/orcid/memberportal/service/user/repository/UserRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* Spring Data MongoDB repository for the {@link User} entity.
1515
*/
1616
@Repository
17-
public interface UserRepository extends MongoRepository<User, String> {
17+
public interface UserRepository extends MongoRepository<User, String>, CustomUserRepository {
1818

1919
Optional<User> findOneByActivationKey(String activationKey);
2020

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.orcid.memberportal.service.user.repository.impl;
2+
3+
import org.orcid.memberportal.service.user.domain.User;
4+
import org.orcid.memberportal.service.user.repository.CustomUserRepository;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.data.mongodb.core.MongoTemplate;
7+
import org.springframework.data.mongodb.core.query.Criteria;
8+
import org.springframework.data.mongodb.core.query.Query;
9+
import org.springframework.data.mongodb.core.query.Update;
10+
import org.springframework.stereotype.Repository;
11+
12+
@Repository
13+
public class CustomUserRepositoryImpl implements CustomUserRepository {
14+
15+
16+
@Autowired
17+
private MongoTemplate mongoTemplate;
18+
19+
public CustomUserRepositoryImpl(MongoTemplate mongoTemplate) {
20+
this.mongoTemplate = mongoTemplate;
21+
}
22+
23+
@Override
24+
public boolean updateMemberNames(String salesforceId, String oldMemberName, String newMemberName) {
25+
mongoTemplate.updateMulti(Query.query(Criteria.where("salesforceId").is(salesforceId).and("memberName").is(oldMemberName)), new Update().set("memberName", newMemberName), User.class);
26+
return true;
27+
}
28+
}

user-service/src/main/java/org/orcid/memberportal/service/user/services/UserService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
import java.util.ArrayList;
1010
import java.util.List;
1111
import java.util.Optional;
12-
import java.util.Set;
1312
import java.util.stream.Collectors;
14-
import java.util.stream.Stream;
1513

1614
import org.apache.commons.lang3.RandomStringUtils;
1715
import org.apache.commons.lang3.StringUtils;
@@ -638,4 +636,7 @@ private boolean validLong(String code) {
638636
}
639637
}
640638

639+
public boolean updateUsersMemberName(String salesforceId, String oldMemberName, String newMemberName) {
640+
return userRepository.updateMemberNames(salesforceId, oldMemberName, newMemberName);
641+
}
641642
}

user-service/src/main/java/org/orcid/memberportal/service/user/web/rest/UserResource.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,27 @@ public ResponseEntity<Void> updateUsersSalesforceId(@PathVariable String salesfo
424424
}
425425
}
426426

427+
/**
428+
* {@code PUT /users/memberName/:oldMemberName/:newMemberName} : Updates memberName
429+
* for existing Users.
430+
*
431+
* @param salesforceId the salesforceId for finding users to update
432+
* @param oldMemberName the old value of the memberName to update
433+
* @param newMemberName the new Value of the memberName to update
434+
* @return the {@link ResponseEntity} with status {@code 200 (OK)}.
435+
*/
436+
@PutMapping("/users/memberName/{oldMemberName}/{newMemberName}")
437+
@PreAuthorize("hasRole(\"" + AuthoritiesConstants.ADMIN + "\")")
438+
public ResponseEntity<Void> updateUsersMemberName(@PathVariable String salesforceId, @PathVariable String oldMemberName, @PathVariable String newMemberName) {
439+
LOG.debug("REST request to update users' member names id from {} to {}", oldMemberName, newMemberName);
440+
boolean success = userService.updateUsersMemberName(salesforceId, oldMemberName, newMemberName);
441+
if (success) {
442+
return ResponseEntity.ok().headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, "user", salesforceId)).build();
443+
} else {
444+
return ResponseEntity.status(500).build();
445+
}
446+
}
447+
427448
/**
428449
* {@code GET /users/:saleforceId}/owner : get the "login" user.
429450
*

0 commit comments

Comments
 (0)