Skip to content

Commit f68f0f2

Browse files
authored
Remove or move email domains on deactivation or deprecation (#7211)
* remove email domains on deactivation * move domains on deprecation * add tests * use read only dao for reading queries * clear record after moving domains
1 parent d8a09f6 commit f68f0f2

File tree

8 files changed

+87
-21
lines changed

8 files changed

+87
-21
lines changed

orcid-core/src/main/java/org/orcid/core/manager/v3/ProfileEmailDomainManager.java

+2
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@
1313
public interface ProfileEmailDomainManager extends ProfileEmailDomainManagerReadOnly {
1414
void updateEmailDomains(String orcid, org.orcid.pojo.ajaxForm.Emails emails);
1515
void processDomain(String orcid, String email);
16+
void removeAllEmailDomains(String orcid);
17+
void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid);
1618
}

orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEmailDomainManagerImpl.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void updateEmailDomains(String orcid, org.orcid.pojo.ajaxForm.Emails newE
4747
if (orcid == null || orcid.isBlank()) {
4848
throw new IllegalArgumentException("ORCID must not be empty");
4949
}
50-
List<ProfileEmailDomainEntity> existingEmailDomains = profileEmailDomainDao.findByOrcid(orcid);
50+
List<ProfileEmailDomainEntity> existingEmailDomains = profileEmailDomainDaoReadOnly.findByOrcid(orcid);
5151

5252
if (existingEmailDomains != null) {
5353
// VISIBILITY UPDATE FOR EXISTING DOMAINS
@@ -98,7 +98,7 @@ public void processDomain(String orcid, String email) {
9898
}
9999
}
100100
if(StringUtils.equalsIgnoreCase(category, EmailDomainEntity.DomainCategory.PROFESSIONAL.name())) {
101-
ProfileEmailDomainEntity existingDomain = profileEmailDomainDao.findByEmailDomain(orcid, domain);
101+
ProfileEmailDomainEntity existingDomain = profileEmailDomainDaoReadOnly.findByEmailDomain(orcid, domain);
102102
// ADD NEW DOMAIN IF ONE DOESN'T EXIST
103103
if (existingDomain == null) {
104104
// Verify the user doesn't have more emails with that domain
@@ -109,4 +109,19 @@ public void processDomain(String orcid, String email) {
109109
}
110110
}
111111
}
112+
113+
public void removeAllEmailDomains(String orcid) {
114+
if (orcid == null || orcid.isBlank()) {
115+
throw new IllegalArgumentException("ORCID must not be empty");
116+
}
117+
profileEmailDomainDao.removeAllEmailDomains(orcid);
118+
}
119+
120+
@Transactional
121+
public void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid) {
122+
ProfileEmailDomainEntity existingEmailDomain = getEmailDomain(primaryOrcid, emailDomain);
123+
if (existingEmailDomain == null) {
124+
profileEmailDomainDao.moveEmailDomainToAnotherAccount(emailDomain, deprecatedOrcid, primaryOrcid);
125+
}
126+
}
112127
}

orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImpl.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,7 @@
4949
import org.orcid.persistence.dao.BackupCodeDao;
5050
import org.orcid.persistence.dao.ProfileLastModifiedDao;
5151
import org.orcid.persistence.dao.UserConnectionDao;
52-
import org.orcid.persistence.jpa.entities.ClientDetailsEntity;
53-
import org.orcid.persistence.jpa.entities.IndexingStatus;
54-
import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail;
55-
import org.orcid.persistence.jpa.entities.ProfileEntity;
52+
import org.orcid.persistence.jpa.entities.*;
5653
import org.orcid.pojo.ApplicationSummary;
5754
import org.orcid.pojo.ajaxForm.Claim;
5855
import org.orcid.pojo.ajaxForm.PojoUtil;
@@ -190,7 +187,6 @@ public Boolean doInTransaction(TransactionStatus status) {
190187
// If it was successfully deprecated
191188
if (wasDeprecated) {
192189
LOGGER.info("Account {} was deprecated to primary account: {}", deprecatedOrcid, primaryOrcid);
193-
clearRecord(deprecatedOrcid, false);
194190
// Move all email's to the primary record
195191
Emails deprecatedAccountEmails = emailManager.getEmails(deprecatedOrcid);
196192
if (deprecatedAccountEmails != null) {
@@ -202,6 +198,13 @@ public Boolean doInTransaction(TransactionStatus status) {
202198
emailManager.moveEmailToOtherAccount(email.getEmail(), deprecatedOrcid, primaryOrcid);
203199
}
204200
}
201+
List<ProfileEmailDomainEntity> deprecatedEmailDomains = profileEmailDomainManager.getEmailDomains(deprecatedOrcid);
202+
if (deprecatedEmailDomains != null && !deprecatedEmailDomains.isEmpty()) {
203+
for (ProfileEmailDomainEntity emailDomain : deprecatedEmailDomains) {
204+
profileEmailDomainManager.moveEmailDomainToAnotherAccount(emailDomain.getEmailDomain(), deprecatedOrcid, primaryOrcid);
205+
}
206+
}
207+
clearRecord(deprecatedOrcid, false);
205208

206209
profileLastModifiedDao.updateLastModifiedDateAndIndexingStatus(deprecatedOrcid, IndexingStatus.REINDEX);
207210
return true;
@@ -640,6 +643,9 @@ private void clearRecord(String orcid, Boolean disableTokens) {
640643
// remove trusted individuals
641644
givenPermissionToManager.removeAllForProfile(orcid);
642645

646+
// remove email domains
647+
profileEmailDomainManager.removeAllEmailDomains(orcid);
648+
643649
// Remove biography
644650
if (biographyManager.exists(orcid)) {
645651
Biography deprecatedBio = new Biography();

orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ProfileEmailDomainManagerReadOnly.java

+1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
*/
1313
public interface ProfileEmailDomainManagerReadOnly {
1414
List<ProfileEmailDomainEntity> getEmailDomains(String orcid);
15+
ProfileEmailDomainEntity getEmailDomain(String orcid, String emailDomain);
1516
List<ProfileEmailDomainEntity> getPublicEmailDomains(String orcid);
1617
}

orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEmailDomainManagerReadOnlyImpl.java

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public List<ProfileEmailDomainEntity> getEmailDomains(String orcid) {
2626
return profileEmailDomainDaoReadOnly.findByOrcid(orcid);
2727
};
2828

29+
public ProfileEmailDomainEntity getEmailDomain(String orcid, String emailDomain) {
30+
return profileEmailDomainDaoReadOnly.findByEmailDomain(orcid, emailDomain);
31+
}
32+
2933
public List<ProfileEmailDomainEntity> getPublicEmailDomains(String orcid) {
3034
return profileEmailDomainDaoReadOnly.findPublicEmailDomains(orcid);
3135
};

orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileEmailDomainManagerTest.java

+26-14
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,20 @@ public void before() {
7373
ped3.setOrcid(ORCID_TWO);
7474
ped3.setVisibility(Visibility.PUBLIC.value());
7575

76-
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN))).thenReturn(ped1);
77-
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_TWO))).thenReturn(ped2);
78-
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID_TWO), eq(EMAIL_DOMAIN))).thenReturn(ped3);
79-
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_THREE))).thenReturn(null);
76+
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN))).thenReturn(ped1);
77+
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_TWO))).thenReturn(ped2);
78+
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID_TWO), eq(EMAIL_DOMAIN))).thenReturn(ped3);
79+
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_THREE))).thenReturn(null);
8080

81-
when(profileEmailDomainDaoMock.findByOrcid(eq(ORCID))).thenReturn(List.of(ped1, ped2));
82-
when(profileEmailDomainDaoMock.findByOrcid(eq(ORCID_TWO))).thenReturn(List.of(ped3));
81+
when(profileEmailDomainDaoReadOnlyMock.findByOrcid(eq(ORCID))).thenReturn(List.of(ped1, ped2));
82+
when(profileEmailDomainDaoReadOnlyMock.findByOrcid(eq(ORCID_TWO))).thenReturn(List.of(ped3));
8383

84-
when(profileEmailDomainDaoMock.findPublicEmailDomains(eq(ORCID))).thenReturn(List.of(ped1));
85-
when(profileEmailDomainDaoMock.findPublicEmailDomains(eq(ORCID_TWO))).thenReturn(List.of(ped2));
84+
when(profileEmailDomainDaoReadOnlyMock.findPublicEmailDomains(eq(ORCID))).thenReturn(List.of(ped1));
85+
when(profileEmailDomainDaoReadOnlyMock.findPublicEmailDomains(eq(ORCID_TWO))).thenReturn(List.of(ped2));
8686

87-
when(profileEmailDomainDaoReadOnlyMock.addEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_TWO), eq(Visibility.LIMITED.value()))).thenReturn(ped2);
87+
when(profileEmailDomainDaoMock.addEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_TWO), eq(Visibility.LIMITED.value()))).thenReturn(ped2);
8888

89-
when(profileEmailDomainDaoReadOnlyMock.updateVisibility(eq(ORCID), eq(EMAIL_DOMAIN_TWO), eq(Visibility.LIMITED.value()))).thenReturn(true);
89+
when(profileEmailDomainDaoMock.updateVisibility(eq(ORCID), eq(EMAIL_DOMAIN_TWO), eq(Visibility.LIMITED.value()))).thenReturn(true);
9090

9191
ProfileEntity profile = new ProfileEntity();
9292
profile.setActivitiesVisibilityDefault(Visibility.PUBLIC.value());
@@ -110,15 +110,15 @@ public void processDomain_domainAlreadyAdded() {
110110
professionalEmailDomain.setEmailDomain(EMAIL_DOMAIN);
111111
when(emailDomainDaoMock.findByEmailDomain(eq(EMAIL_DOMAIN))).thenReturn(List.of(professionalEmailDomain));
112112
pedm.processDomain(ORCID, "[email protected]");
113-
verify(profileEmailDomainDaoMock, times(1)).findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN));
113+
verify(profileEmailDomainDaoReadOnlyMock, times(1)).findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN));
114114
verify(profileEmailDomainDaoMock, never()).addEmailDomain(anyString(), anyString(), anyString());
115115
}
116116

117117
@Test
118118
public void processDomain_doNotAddUnknownDomain() {
119119
when(emailDomainDaoMock.findByEmailDomain(eq(EMAIL_DOMAIN))).thenReturn(null);
120120
pedm.processDomain(ORCID, "[email protected]");
121-
verify(profileEmailDomainDaoMock, never()).findByEmailDomain(anyString(), anyString());
121+
verify(profileEmailDomainDaoReadOnlyMock, never()).findByEmailDomain(anyString(), anyString());
122122
verify(profileEmailDomainDaoMock, never()).addEmailDomain(anyString(), anyString(), anyString());
123123
}
124124

@@ -129,7 +129,7 @@ public void processDomain_doNotAddPersonalDomain() {
129129
professionalEmailDomain.setEmailDomain(EMAIL_DOMAIN);
130130
when(emailDomainDaoMock.findByEmailDomain(eq(EMAIL_DOMAIN))).thenReturn(List.of(professionalEmailDomain));
131131
pedm.processDomain(ORCID, "[email protected]");
132-
verify(profileEmailDomainDaoMock, never()).findByEmailDomain(anyString(), anyString());
132+
verify(profileEmailDomainDaoReadOnlyMock, never()).findByEmailDomain(anyString(), anyString());
133133
verify(profileEmailDomainDaoMock, never()).addEmailDomain(anyString(), anyString(), anyString());
134134
}
135135

@@ -140,7 +140,7 @@ public void processDomain_addDomain() {
140140
professionalEmailDomain.setEmailDomain(EMAIL_DOMAIN_THREE);
141141
when(emailDomainDaoMock.findByEmailDomain(eq(EMAIL_DOMAIN_THREE))).thenReturn(List.of(professionalEmailDomain));
142142
pedm.processDomain(ORCID, "[email protected]");
143-
verify(profileEmailDomainDaoMock, times(1)).findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_THREE));
143+
verify(profileEmailDomainDaoReadOnlyMock, times(1)).findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_THREE));
144144
verify(profileEmailDomainDaoMock, times(1)).addEmailDomain(ORCID, EMAIL_DOMAIN_THREE, Visibility.PUBLIC.value());
145145
}
146146

@@ -187,4 +187,16 @@ public void updateEmailDomains_removeDomain() {
187187
verify(profileEmailDomainDaoMock, times(1)).removeEmailDomain(ORCID, EMAIL_DOMAIN);
188188
verify(profileEmailDomainDaoMock, times(1)).removeEmailDomain(ORCID, EMAIL_DOMAIN_TWO);
189189
}
190+
191+
@Test
192+
public void moveEmailDomainToAnotherAccount() {
193+
pedm.moveEmailDomainToAnotherAccount(EMAIL_DOMAIN, ORCID, ORCID_TWO);
194+
verify(profileEmailDomainDaoMock, never()).moveEmailDomainToAnotherAccount(anyString(), anyString(), anyString());
195+
}
196+
197+
@Test
198+
public void moveEmailDomainToAnotherAccount_AlreadyExists() {
199+
pedm.moveEmailDomainToAnotherAccount(EMAIL_DOMAIN_THREE, ORCID_TWO, ORCID);
200+
verify(profileEmailDomainDaoMock, times(1)).moveEmailDomainToAnotherAccount(EMAIL_DOMAIN_THREE, ORCID_TWO, ORCID);
201+
}
190202
}

orcid-persistence/src/main/java/org/orcid/persistence/dao/ProfileEmailDomainDao.java

+4
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,15 @@ public interface ProfileEmailDomainDao extends GenericDao<ProfileEmailDomainEnti
99

1010
void removeEmailDomain(String orcid, String emailDomain);
1111

12+
void removeAllEmailDomains(String orcid);
13+
1214
boolean updateVisibility(String orcid, String emailDomain, String visibility);
1315

1416
List<ProfileEmailDomainEntity> findByOrcid(String orcid);
1517

1618
List<ProfileEmailDomainEntity> findPublicEmailDomains(String orcid);
1719

1820
ProfileEmailDomainEntity findByEmailDomain(String orcid, String emailDomain);
21+
22+
void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid);
1923
}

orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEmailDomainDaoImpl.java

+22
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ public void removeEmailDomain(String orcid, String emailDomain) {
4545
query.executeUpdate();
4646
}
4747

48+
@Override
49+
@Transactional
50+
@UpdateProfileLastModifiedAndIndexingStatus
51+
public void removeAllEmailDomains(String orcid) {
52+
String deleteEmail = "delete from profile_email_domain where orcid = :orcid";
53+
54+
Query query = entityManager.createNativeQuery(deleteEmail);
55+
query.setParameter("orcid", orcid);
56+
query.executeUpdate();
57+
}
58+
4859
@Override
4960
@Transactional
5061
@UpdateProfileLastModifiedAndIndexingStatus
@@ -87,4 +98,15 @@ public ProfileEmailDomainEntity findByEmailDomain(String orcid, String emailDoma
8798
}
8899
return null;
89100
}
101+
102+
@Override
103+
@Transactional
104+
@UpdateProfileLastModifiedAndIndexingStatus
105+
public void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid) {
106+
Query query = entityManager.createNativeQuery("UPDATE profile_email_domain SET orcid=:primaryOrcid, last_modified = now() WHERE orcid = :deprecatedOrcid and email_domain = :emailDomain");
107+
query.setParameter("primaryOrcid", primaryOrcid);
108+
query.setParameter("emailDomain", emailDomain);
109+
query.setParameter("deprecatedOrcid", deprecatedOrcid);
110+
query.executeUpdate();
111+
}
90112
}

0 commit comments

Comments
 (0)