2222import javax .persistence .EntityManager ;
2323import javax .transaction .Transactional ;
2424import java .util .List ;
25+ import java .util .stream .Collectors ;
2526
2627@ Component
2728public class ChangeNamespaceService {
@@ -59,7 +60,7 @@ public void changeNamespaceInDatabase(
5960 }
6061
6162 changeExtensionNamespace (extensions , newNamespace );
62- changeMembershipNamespace (oldNamespace , newNamespace );
63+ changeMembershipNamespace (oldNamespace , newNamespace , removeOldNamespace );
6364 updatedResources .forEach (entityManager ::merge );
6465
6566 if (removeOldNamespace ) {
@@ -77,10 +78,18 @@ private void changeExtensionNamespace(Streamable<Extension> extensions, Namespac
7778 }
7879 }
7980
80- private void changeMembershipNamespace (Namespace oldNamespace , Namespace newNamespace ) {
81- var memberships = repositories .findMemberships (oldNamespace );
82- for (var membership : memberships ) {
83- membership .setNamespace (newNamespace );
81+ private void changeMembershipNamespace (Namespace oldNamespace , Namespace newNamespace , boolean removeOldNamespace ) {
82+ var oldMemberships = repositories .findMemberships (oldNamespace ).stream ()
83+ .collect (Collectors .toMap (m -> m .getUser ().getId (), m -> m ));
84+ var newMemberships = repositories .findMemberships (newNamespace ).stream ()
85+ .collect (Collectors .toMap (m -> m .getUser ().getId (), m -> m ));
86+
87+ for (var entry : oldMemberships .entrySet ()) {
88+ if (!newMemberships .containsKey (entry .getKey ())) {
89+ entry .getValue ().setNamespace (newNamespace );
90+ } else if (removeOldNamespace ) {
91+ entityManager .remove (entry .getValue ());
92+ }
8493 }
8594 }
8695}
0 commit comments