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.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.mongo.document.ComponentDocument;
import com.iqser.red.storage.commons.exception.StorageException;
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
import com.iqser.red.storage.commons.service.StorageService;
@ -76,8 +75,15 @@ public class StorageToMongoCopyService {
}
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);
Optional<EntityLog> entityLogFromStorage = getEntityLogFromStorageForMigration(dossierFile.dossierId, dossierFile.fileId);
if (entityLogFromStorage.isPresent()) {
@ -139,6 +145,9 @@ public class StorageToMongoCopyService {
if (optionalComponentsOverrides.isEmpty()) {
return;
}
if(!componentLogService.getOverrides(file.dossierId(), file.fileId()).isEmpty()) {
return;
}
ComponentsOverrides oldComponentsOverrides = optionalComponentsOverrides.get();
oldComponentsOverrides.getComponentOverrides()
.forEach((componentName, componentValue) -> {

View File

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

View File

@ -162,7 +162,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
var componentDefinitionAddRequest = buildComponentDefinitionAddRequest(dossierTemplate);
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()));
@ -176,7 +176,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
componentDefinitionAddRequest.setDescription(changedDescription);
int count = componentDefinitionPersistenceService.maxRankByDossierTemplateId(dossierTemplate.getId());
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).getRank(), count + 1);
}