KON-14 Contact-Suche um DSGVO erweitert
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
index 0b0ce65..445ced3 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
@@ -20,7 +20,6 @@
 import lombok.extern.log4j.Log4j2;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.eclipse.openk.contactbasedata.service.ContactService;
-import org.eclipse.openk.contactbasedata.viewmodel.ContactDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -50,11 +49,16 @@
             @RequestParam( "contactType") Optional<String> contactType,
             @RequestParam( "personTypeId" ) Optional<UUID> personTypeUuid,
             @RequestParam( "searchText" ) Optional<String> searchText,
+            @RequestParam( "moduleName") Optional<String> moduleName,
+            @RequestParam( "withoutAssignedModule") Optional<Boolean> withoutAssignedModule,
             @PageableDefault( sort = {"name"}, size = 20, direction = ASC) Pageable pageable ) {
         return contactService.findDetailedContacts(
                 contactType.orElse(null),
                 personTypeUuid.orElse(null),
-                searchText.orElse( null), pageable);
+                searchText.orElse( null),
+                moduleName.orElse(null),
+                withoutAssignedModule.orElse(Boolean.FALSE),
+                pageable);
     }
 
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
index 3f14e89..bff9760 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
@@ -14,7 +14,6 @@
  */
 package org.eclipse.openk.contactbasedata.repository;
 
-import org.eclipse.openk.contactbasedata.model.TblAddress;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -22,24 +21,31 @@
 import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.data.repository.query.Param;
 
-import java.util.List;
 import java.util.UUID;
 
 public interface DetailedContactRepository extends PagingAndSortingRepository<VwDetailedContact, Long> {
     Page<VwDetailedContact> findAll(Pageable pageable);
 
 
-    @Query( "select dc from VwDetailedContact dc where"
-            + "(COALESCE(:contactType) is null or COALESCE(:contactType) is not null AND dc.contactType=:contactType)"
+    @Query( "select dc from VwDetailedContact dc "
+            + "left outer join TblAssignmentModulContact ass on"
+            + " ass.tblContact.id = dc.fkContactId"
+            + " where (COALESCE(:contactType) is null or COALESCE(:contactType) is not null AND dc.contactType=:contactType)"
             + " and (COALESCE(:personType) is null or COALESCE(:personType) is not null AND dc.personTypeUuid=:personType)"
-            + " and (COALESCE(:searchText) is null or COALESCE(:searchText) is not null AND dc.searchfield like %:searchText%)")
+            + " and (COALESCE(:searchText) is null or COALESCE(:searchText) is not null AND dc.searchfield like %:searchText%)"
+            + " and (COALESCE(:moduleName) is null or COALESCE(:moduleName) is not null AND ass.modulName = :moduleName)"
+            + " and (COALESCE(:withoutModule) = false or COALESCE(:withoutModule) = true AND ass is null)"
+    )
     Page<VwDetailedContact> findByFilter(@Param("contactType")String contactType,
                                          @Param("personType") UUID personType,
                                          @Param("searchText") String searchText,
+                                         @Param("moduleName") String moduleName,
+                                         @Param("withoutModule") boolean withoutModule,
                                          Pageable pageable);
 
 
-    @Query( "select dc from VwDetailedContact AS dc, TblContact AS c "
+    @Query( "select dc from VwDetailedContact AS dc"
+            + ", TblContact AS c "
             + "inner join c.assignments a where "
             + "dc.fkContactId = c.id and"
             + "(COALESCE(:modulName) is null or COALESCE(:modulName) is not null AND a.modulName =:modulName) and"
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
index 3814d87..56f6be3 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
@@ -16,19 +16,15 @@
 
 import lombok.extern.log4j.Log4j2;
 import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
-import org.eclipse.openk.contactbasedata.model.TblAssignmentModulContact;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.eclipse.openk.contactbasedata.repository.ContactRepository;
 import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
-import org.eclipse.openk.contactbasedata.viewmodel.ContactDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
 import java.util.UUID;
-import java.util.stream.Collectors;
 
 @Log4j2
 @Service
@@ -42,15 +38,24 @@
 
     public Page<VwDetailedContact> findDetailedContacts(String contactType,
                                                         UUID personTypeUuid,
-                                                        String searchText, Pageable pageable) {
+                                                        String searchText,
+                                                        String moduleName,
+                                                        boolean withoutModule,
+                                                        Pageable pageable) {
 
-        if( contactType == null && personTypeUuid == null && searchText == null) {
+        if( contactType == null &&
+                personTypeUuid == null &&
+                searchText == null &&
+                moduleName == null &&
+                !withoutModule) {
             return detailedContactRepository.findAll(pageable);
         }
         else {
             return detailedContactRepository.findByFilter( contactType,
                     personTypeUuid,
                     searchText != null ? searchText.toUpperCase() : null,
+                    moduleName,
+                    withoutModule,
                     pageable);
         }
     }
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
index 1b79c1d..c27791b 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
@@ -30,8 +30,7 @@
 import org.springframework.test.web.servlet.MockMvc;
 
 import static org.hamcrest.Matchers.is;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@@ -55,7 +54,7 @@
         Page<VwDetailedContact> retPage = MockDataHelper.mockVDetailedContactPage();
 
         when(contactService.findDetailedContacts(
-                isNull(), isNull(), isNull(), any(Pageable.class))).thenReturn(retPage);
+                isNull(), isNull(), isNull(), isNull(), anyBoolean(), any(Pageable.class))).thenReturn(retPage);
 
         mockMvc.perform(get("/contacts"))
                 .andExpect(status().is2xxSuccessful())
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
index 91788ba..544867a 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
@@ -49,7 +49,7 @@
         Page<VwDetailedContact> mockPaged = MockDataHelper.mockVDetailedContactPage();
         when(detailedContactRepository.findAll(any(Pageable.class))).thenReturn(mockPaged);
         Page<VwDetailedContact> retPage = contactService.findDetailedContacts(
-                null, null, null, PageRequest.of(0, 20));
+                null, null, null, null, false, PageRequest.of(0, 20));
 
         assertEquals(mockPaged.getTotalElements(), retPage.getTotalElements());
     }