Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.backend into DEVELOP
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/ContactController.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/ContactController.java
index 6668628..d5df862 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/ContactController.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/ContactController.java
@@ -48,10 +48,9 @@
     @GetMapping
     public Page<VwDetailedContact> findContacts(
             @RequestParam( "searchText" ) Optional<String> searchText,
-            @RequestParam( "moduleName") Optional<String> moduleName,
             @PageableDefault( sort = {"name"}, size = 500, direction = ASC) Pageable pageable) {
 
-        return contactService.findContacts(searchText, moduleName, pageable);
+        return contactService.findContacts(searchText, pageable);
     }
 
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/DistributionGroupMemberRepository.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/DistributionGroupMemberRepository.java
index c5ad8b9..dae2ea1 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/DistributionGroupMemberRepository.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/DistributionGroupMemberRepository.java
@@ -39,4 +39,7 @@
     @Query("select count(*) from TblDistributionGroupMember a where a.tblDistributionGroup.id=:groupId and a.contactId=:contactId and uuid <>:memberUuid")
     Long countByDistributionGroupIdAndContactIdAndIsNotSame( @Param("groupId") Long groupId, @Param("contactId") UUID contactId, @Param("memberUuid") UUID memberUuid);
 
+    @Query("select count(*) from TblDistributionGroupMember a where a.tblDistributionGroup.id=:groupId and a.contactId=:contactId")
+    Long countByDistributionGroupIdAndContactId( @Param("groupId") Long groupId, @Param("contactId") UUID contactId);
+
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ContactService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ContactService.java
index 2ffbc6d..a4c6441 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ContactService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ContactService.java
@@ -17,6 +17,7 @@
 import org.eclipse.openk.gridfailureinformation.api.ContactApi;
 import org.eclipse.openk.gridfailureinformation.api.dto.VwDetailedContact;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -30,14 +31,22 @@
     @Autowired
     private ContactApi contactApi;
 
-    public Page<VwDetailedContact> findContacts(Optional<String> searchText, Optional<String> moduleName, Pageable pageable) {
+    @Value("${services.contacts.useModuleNameForFilter}")
+    private Boolean useModuleName;
+
+    @Value("${services.contacts.moduleName}")
+    private String contactModuleName;
+
+    public Page<VwDetailedContact> findContacts(Optional<String> searchText, Pageable pageable) {
 
         String jwt = (String) SecurityContextHolder.getContext().getAuthentication().getDetails();
 
         String st = searchText.orElse(null);
-        String mn = moduleName.orElse(null);
+        String moduleName = null;
 
-        return contactApi.findContacts(st, mn, pageable, jwt );
+        if (useModuleName && !contactModuleName.isEmpty()) moduleName = contactModuleName;
+
+        return contactApi.findContacts(st, moduleName, pageable, jwt );
     }
 
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupMemberService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupMemberService.java
index 166752a..2955150 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupMemberService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupMemberService.java
@@ -102,11 +102,14 @@
         distributionGroupMemberToSave.setUuid(UUID.randomUUID());
         distributionGroupMemberToSave.setTblDistributionGroup(tblDistributionGroup);
 
+        if ( !checkUniqueContactForGroupMemberForInsert(tblDistributionGroup.getId(), distributionGroupMemberToSave.getContactId())) {
+            throw new OperationDeniedException(OperationType.INSERT, "distribution.group.member.already.existing.for.group");
+        }
+
         TblDistributionGroupMember savedDistributionGroupMember = distributionGroupMemberRepository.save(distributionGroupMemberToSave);
         return distributionGroupMemberMapper.toDistributionGroupMemberDto(savedDistributionGroupMember);
     }
 
-
     @Transactional
     public void deleteDistributionGroupMember(UUID groupUuid, UUID memberUuid) {
         TblDistributionGroup existingDistributionGroup = distributionGroupRepository.findByUuid(groupUuid)
@@ -139,6 +142,11 @@
         return distributionGroupMemberMapper.toDistributionGroupMemberDto(savedMember);
     }
 
+    private boolean checkUniqueContactForGroupMemberForInsert( Long distributionGroupId, UUID contactId){
+       Long result = distributionGroupMemberRepository.countByDistributionGroupIdAndContactId(distributionGroupId, contactId);
+       return result==0;
+    }
+
     private boolean checkUniqueContactForGroupMemberForUpdate( Long distributionGroupId, UUID contactId, UUID memberUuid){
         Long result = distributionGroupMemberRepository.countByDistributionGroupIdAndContactIdAndIsNotSame(distributionGroupId, contactId, memberUuid) ;
         return result==0;
@@ -152,9 +160,9 @@
         if( contact == null ) {
             return groupMemberDto;
         }
-        completeDto.setFirstName(contact.getFirstName());
-        completeDto.setLastName(contact.getLastName());
+        completeDto.setName(contact.getName());
         completeDto.setEmail(contact.getEmail());
+        completeDto.setMainAddress(contact.getMainAddress());
 
         List<CommunicationDto> communicationDtoList = contactApi.getContactCommunications(groupMemberDto.getContactId(), jwt);
         if( communicationDtoList != null ) {
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/DistributionGroupMemberDto.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/DistributionGroupMemberDto.java
index 6ecf426..cf28340 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/DistributionGroupMemberDto.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/DistributionGroupMemberDto.java
@@ -30,10 +30,10 @@
     private String distributionGroup;
 
     private UUID contactId;
-    private String firstName;
-    private String lastName;
+    private String name;
     private String email;
     private String mobileNumber;
+    private String mainAddress;
 
 }
 
diff --git a/gfsBackendService/src/main/resources/application.yml b/gfsBackendService/src/main/resources/application.yml
index 08fcda5..b04cf92 100644
--- a/gfsBackendService/src/main/resources/application.yml
+++ b/gfsBackendService/src/main/resources/application.yml
@@ -46,6 +46,8 @@
     name: contactService
     communicationType:
       mobile: Mobil
+    useModuleNameForFilter: false
+    moduleName: Störungsinformationstool
 
 authNAuthService:
   ribbon:
diff --git a/gfsBackendService/src/main/resources/application_localdev.yml b/gfsBackendService/src/main/resources/application_localdev.yml
index 9a3c583..c12931e 100644
--- a/gfsBackendService/src/main/resources/application_localdev.yml
+++ b/gfsBackendService/src/main/resources/application_localdev.yml
@@ -50,6 +50,8 @@
     name: contactService
     communicationType:
       mobile: Mobil
+    useModuleNameForFilter: false
+    moduleName: Störungsinformationstool DEV
 
 authNAuthService:
   ribbon:
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupServiceMemberTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupServiceMemberTest.java
index b54ff87..09f9571 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupServiceMemberTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/DistributionGroupServiceMemberTest.java
@@ -16,6 +16,7 @@
 
 import org.eclipse.openk.gridfailureinformation.config.TestConfiguration;
 import org.eclipse.openk.gridfailureinformation.exceptions.NotFoundException;
+import org.eclipse.openk.gridfailureinformation.exceptions.OperationDeniedException;
 import org.eclipse.openk.gridfailureinformation.model.TblDistributionGroup;
 import org.eclipse.openk.gridfailureinformation.model.TblDistributionGroupMember;
 import org.eclipse.openk.gridfailureinformation.repository.DistributionGroupMemberRepository;
@@ -39,8 +40,7 @@
 import static org.hibernate.validator.internal.util.Contracts.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.when;
 
@@ -91,7 +91,6 @@
         assertEquals(dto.getUuid(), dto.getUuid());
     }
 
-
     @Test
     public void shouldThrowExceptionWhenFailureNotFound() {
         TblDistributionGroupMember groupMember = MockDataHelper.mockTblDistributionGroupMember();
@@ -117,6 +116,20 @@
     }
 
     @Test
+    public void shouldNotInsertMember_Exception_Member_Exists() {
+        DistributionGroupMemberDto memberDto = MockDataHelper.mockDistributionGroupMemberDto();
+        TblDistributionGroupMember tblDistributionGroupMember = MockDataHelper.mockTblDistributionGroupMember();
+
+        TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
+
+        when(distributionGroupRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblDistributionGroup));
+        when(distributionGroupMemberRepository.countByDistributionGroupIdAndContactId(anyLong(),any(UUID.class))).thenReturn(4L);
+        when(distributionGroupMemberRepository.save(any(TblDistributionGroupMember.class))).thenReturn(tblDistributionGroupMember);
+
+        assertThrows(OperationDeniedException.class, () -> distributionGroupMemberService.insertDistributionGroupMember(UUID.randomUUID(), memberDto));
+    }
+
+    @Test
     public void shouldDeleteDistributionGroupMember() {
         TblDistributionGroupMember tblDistributionGroupMember = MockDataHelper.mockTblDistributionGroupMember();
         TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
@@ -155,7 +168,6 @@
         when(distributionGroupRepository.findByUuid(any(UUID.class))).thenReturn(Optional.empty());
         when(distributionGroupMemberRepository.save(any(TblDistributionGroupMember.class))).thenReturn(tblDistributionGroupMember);
 
-
         when(distributionGroupMemberRepository.save(any(TblDistributionGroupMember.class)))
                 .then((Answer<TblDistributionGroupMember>) invocation -> {
                     Object[] args = invocation.getArguments();
@@ -165,5 +177,4 @@
 
     }
 
-
 }
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
index cbf84f8..cd2d05d 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
@@ -1064,6 +1064,7 @@
     public static TblDistributionGroup mockTblDistributionGroup(){
 
         TblDistributionGroup tblDistributionGroup = new TblDistributionGroup();
+        tblDistributionGroup.setId(1L);
         tblDistributionGroup.setUuid(UUID.randomUUID());
         tblDistributionGroup.setName("Testverteiler - Abteilung intern");
         tblDistributionGroup.setDistributionText("Liebe Kollegen blabla ...");
@@ -1074,6 +1075,7 @@
     public static TblDistributionGroup mockTblDistributionGroup2(){
 
         TblDistributionGroup tblDistributionGroup = new TblDistributionGroup();
+        tblDistributionGroup.setId(2L);
         tblDistributionGroup.setUuid(UUID.randomUUID());
         tblDistributionGroup.setName("Testverteiler - Gruppe intern");
         tblDistributionGroup.setDistributionText("Liebste Kollegen blabla ...");