package eu.old.eudat.migration; import eu.eudat.commons.enums.ContactInfoType; import eu.eudat.data.UserContactInfoEntity; import eu.old.eudat.data.dao.entities.UserInfoDao; import eu.old.eudat.data.entities.Credential; import eu.old.eudat.data.entities.UserInfo; import eu.old.eudat.logic.services.operations.DatabaseRepository; import gr.cite.tools.logging.LoggerService; import jakarta.persistence.EntityManager; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.UUID; @Service public class UserContactInfoMigrationService { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(UserContactInfoMigrationService.class)); private static final int PageSize = 500; private static final boolean TestMode = false; private final DatabaseRepository databaseRepository; private final EntityManager entityManager; public UserContactInfoMigrationService(DatabaseRepository databaseRepository, EntityManager entityManager) { this.databaseRepository = databaseRepository; this.entityManager = entityManager; } public void migrate(){ UserInfoDao userInfoDao = databaseRepository.getUserInfoDao(); long total = userInfoDao.asQueryable().count(); logger.debug("Migrate Contacts Total : " + total); int page = 0; List items; do { items = userInfoDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("created"))).orderBy((builder, root) -> builder.asc(root.get("id"))).skip(page * PageSize).take(PageSize).toList(); if (items != null && !items.isEmpty()) { logger.debug("Migrate Contacts " + page * PageSize + " of " + total); for (UserInfo item : items) { // entityManager.detach(item); if (!item.getUserStatus().equals((short)0)) continue; List emails = new ArrayList<>(); if (item.getEmail() != null && !item.getEmail().isBlank()) emails.add(item.getEmail().toLowerCase(Locale.ROOT)); for (Credential credential: item.getCredentials()) { if (credential.getStatus().equals(0) || credential.getEmail() == null || credential.getEmail().isBlank()) continue; if (emails.stream().noneMatch(x-> x.equals(credential.getEmail().toLowerCase(Locale.ROOT)))) emails.add(credential.getEmail().toLowerCase(Locale.ROOT)); } int i = 0; for (String email: emails) { UserContactInfoEntity data = new UserContactInfoEntity(); data.setId(UUID.randomUUID()); data.setType(ContactInfoType.Email); data.setValue(email); data.setUserId(item.getId()); data.setCreatedAt(item.getCreated().toInstant()); data.setOrdinal(i); i++; this.entityManager.persist(data); } } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty() && !TestMode); } }