2020-10-23 17:40:17 +02:00
|
|
|
package eu.eudat.logic.managers;
|
|
|
|
|
|
|
|
import eu.eudat.data.entities.Credential;
|
|
|
|
import eu.eudat.data.entities.EmailConfirmation;
|
|
|
|
import eu.eudat.data.entities.UserDMP;
|
|
|
|
import eu.eudat.data.entities.UserInfo;
|
|
|
|
import eu.eudat.data.entities.UserToken;
|
|
|
|
import eu.eudat.exceptions.emailconfirmation.HasConfirmedEmailException;
|
|
|
|
import eu.eudat.exceptions.emailconfirmation.TokenExpiredException;
|
|
|
|
import eu.eudat.logic.services.ApiContext;
|
|
|
|
import eu.eudat.logic.services.operations.DatabaseRepository;
|
|
|
|
import eu.eudat.models.data.security.Principal;
|
|
|
|
import eu.eudat.queryable.QueryableList;
|
|
|
|
import eu.eudat.queryable.jpa.predicates.OrderByPredicate;
|
|
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.core.JsonParseException;
|
|
|
|
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
2020-10-27 17:06:58 +01:00
|
|
|
import javax.transaction.Transactional;
|
2020-10-23 17:40:17 +02:00
|
|
|
import java.io.IOException;
|
2020-10-27 17:06:58 +01:00
|
|
|
import java.util.*;
|
2020-10-23 17:40:17 +02:00
|
|
|
|
|
|
|
@Component
|
|
|
|
public class MergeEmailConfirmationManager {
|
|
|
|
private static Logger logger = LoggerFactory.getLogger(MergeEmailConfirmationManager.class);
|
|
|
|
private ApiContext apiContext;
|
|
|
|
private DatabaseRepository databaseRepository;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
public MergeEmailConfirmationManager(ApiContext apiContext) {
|
|
|
|
this.apiContext = apiContext;
|
|
|
|
this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository();
|
|
|
|
}
|
|
|
|
|
2020-10-27 17:06:58 +01:00
|
|
|
@Transactional
|
2020-10-23 17:40:17 +02:00
|
|
|
public void confirmEmail(String token) throws TokenExpiredException, HasConfirmedEmailException {
|
|
|
|
EmailConfirmation loginConfirmationEmail = apiContext.getOperationsContext()
|
|
|
|
.getDatabaseRepository().getLoginConfirmationEmailDao().asQueryable()
|
|
|
|
.where((builder, root) -> builder.equal(root.get("token"), UUID.fromString(token))).getSingle();
|
|
|
|
|
|
|
|
if (loginConfirmationEmail.getExpiresAt().compareTo(new Date()) < 0)
|
|
|
|
throw new TokenExpiredException("Token has expired.");
|
|
|
|
|
|
|
|
UserInfo userToBeMerged = databaseRepository.getUserInfoDao().asQueryable()
|
|
|
|
.where((builder, root) -> builder.equal(root.get("id"), loginConfirmationEmail.getUserId())).getSingle();
|
|
|
|
|
|
|
|
try {
|
2020-10-27 17:06:58 +01:00
|
|
|
Map<String, Object> map = new ObjectMapper().readValue(loginConfirmationEmail.getData(), HashMap.class);
|
|
|
|
UUID otherUserId = UUID.fromString((String) map.get("userId"));
|
2020-10-23 17:40:17 +02:00
|
|
|
UserInfo user = databaseRepository.getUserInfoDao().asQueryable()
|
2020-10-27 17:06:58 +01:00
|
|
|
.where((builder, root) -> builder.equal(root.get("id"), otherUserId)).getSingle();
|
2020-10-23 17:40:17 +02:00
|
|
|
|
|
|
|
// Checks if mail is used by another user. If it is, merges the new the old.
|
2020-10-27 17:06:58 +01:00
|
|
|
mergeNewUserToOld(user, userToBeMerged, Integer.valueOf((String) map.get("provider")));
|
|
|
|
expireUserToken(userToBeMerged);
|
2020-10-23 17:40:17 +02:00
|
|
|
loginConfirmationEmail.setIsConfirmed(true);
|
|
|
|
databaseRepository.getLoginConfirmationEmailDao().createOrUpdate(loginConfirmationEmail);
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-27 17:06:58 +01:00
|
|
|
public void sendConfirmationEmail(String email, Principal principal, UUID userId, Integer provider) throws HasConfirmedEmailException {
|
2020-10-23 17:40:17 +02:00
|
|
|
UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId());
|
|
|
|
|
2020-11-10 16:39:43 +01:00
|
|
|
if (user.getEmail() != null && !user.getEmail().equals(email)) {
|
|
|
|
apiContext.getUtilitiesService().getConfirmationEmailService().createMergeConfirmationEmail(
|
|
|
|
databaseRepository.getLoginConfirmationEmailDao(),
|
|
|
|
apiContext.getUtilitiesService().getMailService(),
|
|
|
|
email,
|
|
|
|
userId,
|
|
|
|
principal,
|
|
|
|
provider
|
|
|
|
);
|
|
|
|
}
|
2020-10-23 17:40:17 +02:00
|
|
|
}
|
|
|
|
|
2020-10-27 17:06:58 +01:00
|
|
|
@Transactional
|
|
|
|
private void mergeNewUserToOld(UserInfo newUser, UserInfo oldUser, Integer provider) {
|
|
|
|
Credential credential = databaseRepository.getCredentialDao().asQueryable().where((builder, root) -> builder.and(builder.equal(root.get("userInfo"), oldUser), builder.equal(root.get("provider"), provider))).getSingle();
|
2020-10-23 17:40:17 +02:00
|
|
|
credential.setUserInfo(newUser);
|
|
|
|
databaseRepository.getCredentialDao().createOrUpdate(credential);
|
|
|
|
List<UserDMP> userDmps = databaseRepository.getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("user"), oldUser)).toList();
|
|
|
|
userDmps.forEach(userDmp -> {
|
|
|
|
userDmp.setUser(newUser);
|
|
|
|
databaseRepository.getUserDmpDao().createOrUpdate(userDmp);
|
|
|
|
});
|
2020-10-27 17:06:58 +01:00
|
|
|
oldUser.setUserStatus((short)1);
|
2020-10-29 10:54:15 +01:00
|
|
|
oldUser.setEmail(null);
|
2020-10-29 11:08:09 +01:00
|
|
|
List<Credential> credentials = databaseRepository.getCredentialDao().asQueryable().where((builder, root) -> builder.equal(root.get("userInfo"), oldUser)).toList();
|
|
|
|
credentials.forEach(cred -> {
|
|
|
|
if (cred.getId() != credential.getId()) {
|
|
|
|
databaseRepository.getCredentialDao().delete(cred);
|
|
|
|
}
|
|
|
|
});
|
2020-10-27 17:06:58 +01:00
|
|
|
databaseRepository.getUserInfoDao().createOrUpdate(oldUser);
|
2020-10-23 17:40:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private void expireUserToken(UserInfo user) {
|
|
|
|
UserToken userToken = databaseRepository.getUserTokenDao().asQueryable()
|
|
|
|
.where((builder, root) -> builder.equal(root.get("user"), user))
|
|
|
|
.orderBy((builder, root) -> builder.desc(root.get("issuedAt")))
|
2020-10-27 17:06:58 +01:00
|
|
|
.take(1).toList().get(0);
|
2020-10-23 17:40:17 +02:00
|
|
|
userToken.setExpiresAt(new Date());
|
|
|
|
databaseRepository.getUserTokenDao().createOrUpdate(userToken);
|
|
|
|
}
|
|
|
|
}
|