RED-10723: early stopping for migrations as they need to be re-run for DM 1.2.x

This commit is contained in:
Maverick Studer 2025-01-14 15:07:21 +01:00
parent 3574fe6a9b
commit 01c7d1a389
5 changed files with 40 additions and 24 deletions

View File

@ -25,7 +25,6 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument;
import com.iqser.red.storage.commons.exception.StorageException; import com.iqser.red.storage.commons.exception.StorageException;
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
import com.iqser.red.storage.commons.service.StorageService; import com.iqser.red.storage.commons.service.StorageService;
@ -76,8 +75,15 @@ public class StorageToMongoCopyService {
} }
private void copyEntityLogs(DossierFile dossierFile) { private void copyEntityLogs(DossierFile dossierFile) {
if (fileManagementStorageService.entityLogExists(dossierFile.dossierId, dossierFile.fileId)) {
log.info("EntityLog already exists in Mongo for dossierId={}, fileId={}.",
dossierFile.dossierId, dossierFile.fileId);
return;
}
log.info("Reading dossier {} file {} from storage", dossierFile.dossierId, dossierFile.fileId); log.info("Reading dossier {} file {} from storage", dossierFile.dossierId, dossierFile.fileId);
Optional<EntityLog> entityLogFromStorage = getEntityLogFromStorageForMigration(dossierFile.dossierId, dossierFile.fileId); Optional<EntityLog> entityLogFromStorage = getEntityLogFromStorageForMigration(dossierFile.dossierId, dossierFile.fileId);
if (entityLogFromStorage.isPresent()) { if (entityLogFromStorage.isPresent()) {
@ -139,6 +145,9 @@ public class StorageToMongoCopyService {
if (optionalComponentsOverrides.isEmpty()) { if (optionalComponentsOverrides.isEmpty()) {
return; return;
} }
if(!componentLogService.getOverrides(file.dossierId(), file.fileId()).isEmpty()) {
return;
}
ComponentsOverrides oldComponentsOverrides = optionalComponentsOverrides.get(); ComponentsOverrides oldComponentsOverrides = optionalComponentsOverrides.get();
oldComponentsOverrides.getComponentOverrides() oldComponentsOverrides.getComponentOverrides()
.forEach((componentName, componentValue) -> { .forEach((componentName, componentValue) -> {

View File

@ -9,7 +9,9 @@ import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -47,22 +49,28 @@ public class ComponentDefinitionService {
validateDossierTemplateExists(dossierTemplateId); validateDossierTemplateExists(dossierTemplateId);
validateAddRequest(componentDefinitionAddRequests); validateAddRequest(componentDefinitionAddRequests);
List<ComponentDefinitionEntity> componentEntities = new ArrayList<>(); List<ComponentDefinitionEntity> componentEntities = componentDefinitionAddRequests.stream()
componentDefinitionAddRequests.forEach(componentDefinitionAddRequest -> { .map(request -> {
Optional<String> optionalIdOfSoftDeleted = componentDefinitionPersistenceService.findIdByDossierTemplateIdAndTechnicalNameAndIsSoftDeleted(dossierTemplateId, Optional<ComponentDefinitionEntity> optionalComponentDefinition = componentDefinitionPersistenceService.findIdByDossierTemplateIdAndTechnicalName(
componentDefinitionAddRequest.getTechnicalName()); dossierTemplateId,
ComponentDefinitionEntity entity; request.getTechnicalName());
if (optionalIdOfSoftDeleted.isEmpty()) {
entity = componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, dossierTemplateId); return optionalComponentDefinition.map(componentDefinition -> {
} else { if (componentDefinition.getSoftDeleteTime() != null) {
int rank = componentDefinitionPersistenceService.maxRankByDossierTemplateId(dossierTemplateId) + 1; int rank = componentDefinitionPersistenceService.maxRankByDossierTemplateId(dossierTemplateId) + 1;
entity = componentDefinitionPersistenceService.restoreComponent(dossierTemplateId, optionalIdOfSoftDeleted.get()); ComponentDefinitionEntity restored = componentDefinitionPersistenceService.restoreComponent(dossierTemplateId, componentDefinition.getId());
entity.setDescription(componentDefinitionAddRequest.getDescription()); restored.setDescription(request.getDescription());
entity.setRank(rank); restored.setRank(rank);
entity = componentDefinitionPersistenceService.update(entity); return componentDefinitionPersistenceService.update(restored);
} }
componentEntities.add(entity); // return unchanged
}); return componentDefinition;
})
.orElseGet(() -> componentDefinitionPersistenceService.insert(request, dossierTemplateId));
})
.filter(Objects::nonNull)
.toList();
return componentEntities.stream() return componentEntities.stream()
.map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class))
.sorted(Comparator.comparing(ComponentDefinition::getRank)) .sorted(Comparator.comparing(ComponentDefinition::getRank))
@ -72,11 +80,11 @@ public class ComponentDefinitionService {
@Transactional @Transactional
public List<ComponentDefinition> createComponentsInternal(String dossierTemplateId, List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) { public List<ComponentDefinition> createComponentsInternal(String dossierTemplateId, List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) {
return createComponents(dossierTemplateId, componentDefinitionAddRequests); return createComponents(dossierTemplateId, componentDefinitionAddRequests);
} }
private void validateAddRequest(List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) { private void validateAddRequest(List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) {
long nrOfComponentsWithEmptyTechnicalName = componentDefinitionAddRequests.stream() long nrOfComponentsWithEmptyTechnicalName = componentDefinitionAddRequests.stream()

View File

@ -121,9 +121,9 @@ public class ComponentDefinitionPersistenceService {
} }
public Optional<String> findIdByDossierTemplateIdAndTechnicalNameAndIsSoftDeleted(String dossierTemplateId, String technicalName) { public Optional<ComponentDefinitionEntity> findIdByDossierTemplateIdAndTechnicalName(String dossierTemplateId, String technicalName) {
return componentDefinitionRepository.findIdByDossierTemplateIdAndTechnicalNameAndIsSoftDeleted(dossierTemplateId, technicalName); return componentDefinitionRepository.findIdByDossierTemplateIdAndTechnicalName(dossierTemplateId, technicalName);
} }
} }

View File

@ -37,8 +37,7 @@ public interface ComponentDefinitionRepository extends JpaRepository<ComponentDe
@Query("SELECT COALESCE(MAX(c.rank), 0) from ComponentDefinitionEntity c WHERE c.dossierTemplateId = :dossierTemplateId AND c.softDeleteTime IS NULL") @Query("SELECT COALESCE(MAX(c.rank), 0) from ComponentDefinitionEntity c WHERE c.dossierTemplateId = :dossierTemplateId AND c.softDeleteTime IS NULL")
int maxRankByDossierTemplateId(@Param("dossierTemplateId") String dossierTemplateId); int maxRankByDossierTemplateId(@Param("dossierTemplateId") String dossierTemplateId);
@Query("SELECT c.id FROM ComponentDefinitionEntity c WHERE c.dossierTemplateId = :dossierTemplateId AND c.technicalName = :technicalName AND c.softDeleteTime IS NOT NULL") Optional<ComponentDefinitionEntity> findIdByDossierTemplateIdAndTechnicalName(String dossierTemplateId, String technicalName);
Optional<String> findIdByDossierTemplateIdAndTechnicalNameAndIsSoftDeleted(@Param("dossierTemplateId") String dossierTemplateId, @Param("technicalName") String technicalName);
} }

View File

@ -162,7 +162,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
var componentDefinitionAddRequest = buildComponentDefinitionAddRequest(dossierTemplate); var componentDefinitionAddRequest = buildComponentDefinitionAddRequest(dossierTemplate);
var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest)); var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest));
assertEquals(response.size(), 1); assertEquals(1, response.size());
dossierTemplateExternalClient.deleteComponents(dossierTemplate.getId(), List.of(response.get(0).getId())); dossierTemplateExternalClient.deleteComponents(dossierTemplate.getId(), List.of(response.get(0).getId()));
@ -176,7 +176,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
componentDefinitionAddRequest.setDescription(changedDescription); componentDefinitionAddRequest.setDescription(changedDescription);
int count = componentDefinitionPersistenceService.maxRankByDossierTemplateId(dossierTemplate.getId()); int count = componentDefinitionPersistenceService.maxRankByDossierTemplateId(dossierTemplate.getId());
response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest)); response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest));
assertEquals(response.size(), 1); assertEquals(1, response.size());
assertEquals(response.get(0).getDescription(), changedDescription); assertEquals(response.get(0).getDescription(), changedDescription);
assertEquals(response.get(0).getRank(), count + 1); assertEquals(response.get(0).getRank(), count + 1);
} }