Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove or move email domains on deactivation or deprecation #7211

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@
public interface ProfileEmailDomainManager extends ProfileEmailDomainManagerReadOnly {
void updateEmailDomains(String orcid, org.orcid.pojo.ajaxForm.Emails emails);
void processDomain(String orcid, String email);
void removeAllEmailDomains(String orcid);
void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid);
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void updateEmailDomains(String orcid, org.orcid.pojo.ajaxForm.Emails newE
if (orcid == null || orcid.isBlank()) {
throw new IllegalArgumentException("ORCID must not be empty");
}
List<ProfileEmailDomainEntity> existingEmailDomains = profileEmailDomainDao.findByOrcid(orcid);
List<ProfileEmailDomainEntity> existingEmailDomains = profileEmailDomainDaoReadOnly.findByOrcid(orcid);

if (existingEmailDomains != null) {
// VISIBILITY UPDATE FOR EXISTING DOMAINS
Expand Down Expand Up @@ -98,7 +98,7 @@ public void processDomain(String orcid, String email) {
}
}
if(StringUtils.equalsIgnoreCase(category, EmailDomainEntity.DomainCategory.PROFESSIONAL.name())) {
ProfileEmailDomainEntity existingDomain = profileEmailDomainDao.findByEmailDomain(orcid, domain);
ProfileEmailDomainEntity existingDomain = profileEmailDomainDaoReadOnly.findByEmailDomain(orcid, domain);
// ADD NEW DOMAIN IF ONE DOESN'T EXIST
if (existingDomain == null) {
// Verify the user doesn't have more emails with that domain
Expand All @@ -109,4 +109,19 @@ public void processDomain(String orcid, String email) {
}
}
}

public void removeAllEmailDomains(String orcid) {
if (orcid == null || orcid.isBlank()) {
throw new IllegalArgumentException("ORCID must not be empty");
}
profileEmailDomainDao.removeAllEmailDomains(orcid);
}

@Transactional
public void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid) {
ProfileEmailDomainEntity existingEmailDomain = getEmailDomain(primaryOrcid, emailDomain);
if (existingEmailDomain == null) {
profileEmailDomainDao.moveEmailDomainToAnotherAccount(emailDomain, deprecatedOrcid, primaryOrcid);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,7 @@
import org.orcid.persistence.dao.BackupCodeDao;
import org.orcid.persistence.dao.ProfileLastModifiedDao;
import org.orcid.persistence.dao.UserConnectionDao;
import org.orcid.persistence.jpa.entities.ClientDetailsEntity;
import org.orcid.persistence.jpa.entities.IndexingStatus;
import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail;
import org.orcid.persistence.jpa.entities.ProfileEntity;
import org.orcid.persistence.jpa.entities.*;
import org.orcid.pojo.ApplicationSummary;
import org.orcid.pojo.ajaxForm.Claim;
import org.orcid.pojo.ajaxForm.PojoUtil;
Expand Down Expand Up @@ -190,7 +187,6 @@ public Boolean doInTransaction(TransactionStatus status) {
// If it was successfully deprecated
if (wasDeprecated) {
LOGGER.info("Account {} was deprecated to primary account: {}", deprecatedOrcid, primaryOrcid);
clearRecord(deprecatedOrcid, false);
// Move all email's to the primary record
Emails deprecatedAccountEmails = emailManager.getEmails(deprecatedOrcid);
if (deprecatedAccountEmails != null) {
Expand All @@ -202,6 +198,13 @@ public Boolean doInTransaction(TransactionStatus status) {
emailManager.moveEmailToOtherAccount(email.getEmail(), deprecatedOrcid, primaryOrcid);
}
}
List<ProfileEmailDomainEntity> deprecatedEmailDomains = profileEmailDomainManager.getEmailDomains(deprecatedOrcid);
if (deprecatedEmailDomains != null && !deprecatedEmailDomains.isEmpty()) {
for (ProfileEmailDomainEntity emailDomain : deprecatedEmailDomains) {
profileEmailDomainManager.moveEmailDomainToAnotherAccount(emailDomain.getEmailDomain(), deprecatedOrcid, primaryOrcid);
}
}
clearRecord(deprecatedOrcid, false);

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

// remove email domains
profileEmailDomainManager.removeAllEmailDomains(orcid);

// Remove biography
if (biographyManager.exists(orcid)) {
Biography deprecatedBio = new Biography();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
*/
public interface ProfileEmailDomainManagerReadOnly {
List<ProfileEmailDomainEntity> getEmailDomains(String orcid);
ProfileEmailDomainEntity getEmailDomain(String orcid, String emailDomain);
List<ProfileEmailDomainEntity> getPublicEmailDomains(String orcid);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ public List<ProfileEmailDomainEntity> getEmailDomains(String orcid) {
return profileEmailDomainDaoReadOnly.findByOrcid(orcid);
};

public ProfileEmailDomainEntity getEmailDomain(String orcid, String emailDomain) {
return profileEmailDomainDaoReadOnly.findByEmailDomain(orcid, emailDomain);
}

public List<ProfileEmailDomainEntity> getPublicEmailDomains(String orcid) {
return profileEmailDomainDaoReadOnly.findPublicEmailDomains(orcid);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,20 +73,20 @@ public void before() {
ped3.setOrcid(ORCID_TWO);
ped3.setVisibility(Visibility.PUBLIC.value());

when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN))).thenReturn(ped1);
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_TWO))).thenReturn(ped2);
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID_TWO), eq(EMAIL_DOMAIN))).thenReturn(ped3);
when(profileEmailDomainDaoMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_THREE))).thenReturn(null);
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN))).thenReturn(ped1);
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_TWO))).thenReturn(ped2);
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID_TWO), eq(EMAIL_DOMAIN))).thenReturn(ped3);
when(profileEmailDomainDaoReadOnlyMock.findByEmailDomain(eq(ORCID), eq(EMAIL_DOMAIN_THREE))).thenReturn(null);

when(profileEmailDomainDaoMock.findByOrcid(eq(ORCID))).thenReturn(List.of(ped1, ped2));
when(profileEmailDomainDaoMock.findByOrcid(eq(ORCID_TWO))).thenReturn(List.of(ped3));
when(profileEmailDomainDaoReadOnlyMock.findByOrcid(eq(ORCID))).thenReturn(List.of(ped1, ped2));
when(profileEmailDomainDaoReadOnlyMock.findByOrcid(eq(ORCID_TWO))).thenReturn(List.of(ped3));

when(profileEmailDomainDaoMock.findPublicEmailDomains(eq(ORCID))).thenReturn(List.of(ped1));
when(profileEmailDomainDaoMock.findPublicEmailDomains(eq(ORCID_TWO))).thenReturn(List.of(ped2));
when(profileEmailDomainDaoReadOnlyMock.findPublicEmailDomains(eq(ORCID))).thenReturn(List.of(ped1));
when(profileEmailDomainDaoReadOnlyMock.findPublicEmailDomains(eq(ORCID_TWO))).thenReturn(List.of(ped2));

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

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

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

@Test
public void processDomain_doNotAddUnknownDomain() {
when(emailDomainDaoMock.findByEmailDomain(eq(EMAIL_DOMAIN))).thenReturn(null);
pedm.processDomain(ORCID, "[email protected]");
verify(profileEmailDomainDaoMock, never()).findByEmailDomain(anyString(), anyString());
verify(profileEmailDomainDaoReadOnlyMock, never()).findByEmailDomain(anyString(), anyString());
verify(profileEmailDomainDaoMock, never()).addEmailDomain(anyString(), anyString(), anyString());
}

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

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

Expand Down Expand Up @@ -187,4 +187,16 @@ public void updateEmailDomains_removeDomain() {
verify(profileEmailDomainDaoMock, times(1)).removeEmailDomain(ORCID, EMAIL_DOMAIN);
verify(profileEmailDomainDaoMock, times(1)).removeEmailDomain(ORCID, EMAIL_DOMAIN_TWO);
}

@Test
public void moveEmailDomainToAnotherAccount() {
pedm.moveEmailDomainToAnotherAccount(EMAIL_DOMAIN, ORCID, ORCID_TWO);
verify(profileEmailDomainDaoMock, never()).moveEmailDomainToAnotherAccount(anyString(), anyString(), anyString());
}

@Test
public void moveEmailDomainToAnotherAccount_AlreadyExists() {
pedm.moveEmailDomainToAnotherAccount(EMAIL_DOMAIN_THREE, ORCID_TWO, ORCID);
verify(profileEmailDomainDaoMock, times(1)).moveEmailDomainToAnotherAccount(EMAIL_DOMAIN_THREE, ORCID_TWO, ORCID);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@ public interface ProfileEmailDomainDao extends GenericDao<ProfileEmailDomainEnti

void removeEmailDomain(String orcid, String emailDomain);

void removeAllEmailDomains(String orcid);

boolean updateVisibility(String orcid, String emailDomain, String visibility);

List<ProfileEmailDomainEntity> findByOrcid(String orcid);

List<ProfileEmailDomainEntity> findPublicEmailDomains(String orcid);

ProfileEmailDomainEntity findByEmailDomain(String orcid, String emailDomain);

void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid);
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,17 @@ public void removeEmailDomain(String orcid, String emailDomain) {
query.executeUpdate();
}

@Override
@Transactional
@UpdateProfileLastModifiedAndIndexingStatus
public void removeAllEmailDomains(String orcid) {
String deleteEmail = "delete from profile_email_domain where orcid = :orcid";

Query query = entityManager.createNativeQuery(deleteEmail);
query.setParameter("orcid", orcid);
query.executeUpdate();
}

@Override
@Transactional
@UpdateProfileLastModifiedAndIndexingStatus
Expand Down Expand Up @@ -87,4 +98,15 @@ public ProfileEmailDomainEntity findByEmailDomain(String orcid, String emailDoma
}
return null;
}

@Override
@Transactional
@UpdateProfileLastModifiedAndIndexingStatus
public void moveEmailDomainToAnotherAccount(String emailDomain, String deprecatedOrcid, String primaryOrcid) {
Query query = entityManager.createNativeQuery("UPDATE profile_email_domain SET orcid=:primaryOrcid, last_modified = now() WHERE orcid = :deprecatedOrcid and email_domain = :emailDomain");
query.setParameter("primaryOrcid", primaryOrcid);
query.setParameter("emailDomain", emailDomain);
query.setParameter("deprecatedOrcid", deprecatedOrcid);
query.executeUpdate();
}
}