@@ -106,17 +106,20 @@ public void deleteAll() {
106106 }
107107
108108 @ Transactional // To have all create in the same transaction (atomic)
109- // TODO Remove transaction when errors will no longer be sent to the front
110109 // This method should be package-private and not used as API of the service as it uses ModificationEntity and
111110 // we want to encapsulate the use of Entity related objects to this service.
112111 // Nevertheless We have to keep it public for transactional annotation.
113112 public List <ModificationEntity > saveModifications (UUID groupUuid , List <ModificationEntity > modifications ) {
114113 return saveModificationsNonTransactional (groupUuid , modifications );
115114 }
116115
117- @ Transactional // To have all create in the same transaction (atomic)
118- // TODO Remove transaction when errors will no longer be sent to the front
116+ @ Transactional
119117 public List <ModificationEntity > saveModificationInfos (UUID groupUuid , List <ModificationInfos > modifications ) {
118+ return saveModificationInfosNonTransactional (groupUuid , modifications );
119+ }
120+
121+ private List <ModificationEntity > saveModificationInfosNonTransactional (UUID groupUuid ,
122+ List <ModificationInfos > modifications ) {
120123 List <ModificationEntity > entities = modifications .stream ().map (ModificationEntity ::fromDTO ).toList ();
121124
122125 return saveModificationsNonTransactional (groupUuid , entities );
@@ -165,8 +168,13 @@ private List<ModificationEntity> saveModificationsNonTransactional(UUID groupUui
165168 }
166169
167170 @ Transactional
168- // TODO Remove transaction when errors will no longer be sent to the front
169171 public List <ModificationEntity > moveModifications (UUID destinationGroupUuid , UUID originGroupUuid , List <UUID > modificationsToMoveUUID , UUID referenceModificationUuid ) {
172+ List <ModificationEntity > movedModifications = moveModificationsNonTransactional (destinationGroupUuid , originGroupUuid , modificationsToMoveUUID , referenceModificationUuid );
173+ loadFullModificationsEntities (movedModifications );
174+ return movedModifications ;
175+ }
176+
177+ private List <ModificationEntity > moveModificationsNonTransactional (UUID destinationGroupUuid , UUID originGroupUuid , List <UUID > modificationsToMoveUUID , UUID referenceModificationUuid ) {
170178 // read origin group and modifications
171179 ModificationGroupEntity originModificationGroupEntity = getModificationGroup (originGroupUuid );
172180 List <ModificationEntity > originModificationEntities = originModificationGroupEntity .getModifications ()
@@ -273,7 +281,7 @@ public List<ModificationInfos> getModifications(UUID groupUuid, boolean onlyMeta
273281
274282 public List <ModificationInfos > getModifications (UUID groupUuid , boolean onlyMetadata , boolean errorOnGroupNotFound , boolean onlyStashed ) {
275283 try {
276- return onlyMetadata ? getModificationsMetadata (groupUuid , onlyStashed ) : getModificationsEntities (List .of (groupUuid ), onlyStashed ). stream (). map ( this :: getModificationInfos ). toList ( );
284+ return onlyMetadata ? getModificationsMetadata (groupUuid , onlyStashed ) : getModificationsInfos (List .of (groupUuid ), onlyStashed );
277285 } catch (NetworkModificationException e ) {
278286 if (e .getType () == MODIFICATION_GROUP_NOT_FOUND && !errorOnGroupNotFound ) {
279287 return List .of ();
@@ -432,7 +440,7 @@ private TabularCreationInfos loadTabularCreation(ModificationEntity modification
432440 .build ();
433441 }
434442
435- public ModificationInfos getModificationInfos (ModificationEntity modificationEntity ) {
443+ private ModificationInfos getModificationInfos (ModificationEntity modificationEntity ) {
436444 if (modificationEntity instanceof TabularModificationEntity ) {
437445 return loadTabularModification (modificationEntity );
438446 } else if (modificationEntity instanceof TabularCreationEntity ) {
@@ -441,7 +449,7 @@ public ModificationInfos getModificationInfos(ModificationEntity modificationEnt
441449 return modificationEntity .toModificationInfos ();
442450 }
443451
444- public List <ModificationEntity > getModificationsEntities (List <UUID > groupUuids , boolean onlyStashed ) {
452+ private List <ModificationEntity > getModificationsEntitiesNonTransactional (List <UUID > groupUuids , boolean onlyStashed ) {
445453 Stream <ModificationEntity > entityStream = groupUuids .stream ().flatMap (this ::getModificationEntityStream );
446454 if (onlyStashed ) {
447455 return entityStream .filter (m -> m .getStashed () == onlyStashed ).toList ();
@@ -450,6 +458,26 @@ public List<ModificationEntity> getModificationsEntities(List<UUID> groupUuids,
450458 }
451459 }
452460
461+ @ Transactional (readOnly = true )
462+ public List <ModificationEntity > getModificationsEntities (List <UUID > groupUuids , boolean onlyStashed ) {
463+ List <ModificationEntity > modificationsEntities = getModificationsEntitiesNonTransactional (groupUuids , onlyStashed );
464+ loadFullModificationsEntities (modificationsEntities );
465+ return modificationsEntities ;
466+ }
467+
468+ private void loadFullModificationsEntities (List <ModificationEntity > modificationsEntities ) {
469+ // Force load subentities/collections, needed later when the transaction is closed
470+ // Necessary for applying network modifications
471+ // to avoid LazyInitialisationException. Maybe better to refactor to return the dto ?
472+ // And refactor to more efficiently load the data (avoid 1+N) ?
473+ modificationsEntities .forEach (this ::getModificationInfos );
474+ }
475+
476+ private List <ModificationInfos > getModificationsInfos (List <UUID > groupUuids , boolean onlyStashed ) {
477+ return getModificationsEntitiesNonTransactional (groupUuids , onlyStashed ).stream ()
478+ .map (this ::getModificationInfos ).toList ();
479+ }
480+
453481 @ Transactional (readOnly = true )
454482 public ModificationInfos getModificationInfo (UUID modificationUuid ) {
455483 return getModificationInfos (getModificationEntity (modificationUuid ));
@@ -523,6 +551,10 @@ public Integer getModificationsCount(@NonNull UUID groupUuid, boolean stashed) {
523551
524552 @ Transactional (readOnly = true )
525553 public List <ModificationInfos > getModificationsInfos (@ NonNull List <UUID > uuids ) {
554+ return getModificationsInfosNonTransactional (uuids );
555+ }
556+
557+ private List <ModificationInfos > getModificationsInfosNonTransactional (List <UUID > uuids ) {
526558 // Spring-data findAllById doc says: the order of elements in the result is not guaranteed
527559 Map <UUID , ModificationEntity > entities = modificationRepository .findAllById (uuids )
528560 .stream ()
@@ -551,6 +583,10 @@ public List<ModificationInfos> getBasicNetworkModificationsFromComposite(@NonNul
551583
552584 @ Transactional (readOnly = true )
553585 public List <ModificationInfos > getCompositeModificationsInfos (@ NonNull List <UUID > uuids ) {
586+ return getCompositeModificationsInfosNonTransactional (uuids );
587+ }
588+
589+ private List <ModificationInfos > getCompositeModificationsInfosNonTransactional (@ NonNull List <UUID > uuids ) {
554590 List <ModificationInfos > entities = new ArrayList <>();
555591 uuids .forEach (uuid -> {
556592 List <UUID > foundEntities = modificationRepository .findModificationIdsByCompositeModificationId (uuid );
@@ -566,6 +602,10 @@ public List<ModificationInfos> getCompositeModificationsInfos(@NonNull List<UUID
566602
567603 @ Transactional (readOnly = true )
568604 public List <ModificationInfos > getActiveModificationsInfos (@ NonNull UUID groupUuid ) {
605+ return getActiveModificationsInfosNonTransactional (groupUuid );
606+ }
607+
608+ private List <ModificationInfos > getActiveModificationsInfosNonTransactional (UUID groupUuid ) {
569609 return getModificationEntityStream (groupUuid ).filter (m -> !m .getStashed ()).map (this ::getModificationInfos ).toList ();
570610 }
571611
@@ -787,4 +827,16 @@ private void deleteTabularModificationSubModifications(TabularModificationEntity
787827 // line function works for any modification case
788828 lineModificationRepository .deleteTabularModificationModifications (modificationId , subModificationsIds );
789829 }
830+
831+ @ Transactional
832+ public List <ModificationEntity > saveDuplicateModifications (@ NonNull UUID targetGroupUuid , UUID originGroupUuid , @ NonNull List <UUID > modificationsUuids ) {
833+ List <ModificationInfos > modificationInfos = originGroupUuid != null ? getActiveModificationsInfosNonTransactional (originGroupUuid ) : getModificationsInfosNonTransactional (modificationsUuids );
834+ return saveModificationInfosNonTransactional (targetGroupUuid , modificationInfos );
835+ }
836+
837+ @ Transactional
838+ public List <ModificationEntity > saveCompositeModifications (@ NonNull UUID targetGroupUuid , @ NonNull List <UUID > modificationsUuids ) {
839+ List <ModificationInfos > modificationInfos = getCompositeModificationsInfosNonTransactional (modificationsUuids );
840+ return saveModificationInfosNonTransactional (targetGroupUuid , modificationInfos );
841+ }
790842}
0 commit comments