Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.contactBaseData.backend into KON_14-Kontakte-Modulzuordnung
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 3641442..1a29808 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
@@ -49,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/model/TblAssignmentModulContact.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAssignmentModulContact.java
index 850468f..472dfdd 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblAssignmentModulContact.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAssignmentModulContact.java
@@ -40,6 +40,4 @@
     @JoinColumn( name = "fk_contact_id")
     private TblContact tblContact;
 
-
-
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java
index f3ef0ec..f5cd6fe 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java
@@ -40,6 +40,9 @@
     @OneToMany(cascade=CascadeType.ALL, mappedBy="tblContact", orphanRemoval = true)
     private List<TblCommunication> communications = new ArrayList<>();
 
+    @OneToMany(cascade=CascadeType.ALL, mappedBy="tblContact", orphanRemoval = true)
+    private List<TblAssignmentModulContact> assignments = new ArrayList<>();
+
 }
 
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java b/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java
index 7dc279e..e514d96 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java
@@ -17,8 +17,12 @@
 import lombok.Data;
 import org.springframework.data.annotation.Immutable;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 
 @Data
@@ -47,4 +51,5 @@
     private String community;
     private String email;
     private String searchfield;
+
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
index bacbe7f..f63d8c1 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
@@ -15,11 +15,21 @@
 package org.eclipse.openk.contactbasedata.repository;
 
 import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
 import java.util.Optional;
 import java.util.UUID;
 
 public interface ContactRepository extends JpaRepository<TblContact, Long > {
     public Optional<TblContact> findByUuid( UUID uuid );
 
+    @Query( "select c from TblContact c join c.assignments a where"
+            + "(COALESCE(:modulName) is null or COALESCE(:modulName) is not null AND a.modulName =:modulName)")
+    Page<TblContact> findByModulName(@Param("modulName")String modulName, Pageable 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 821d897..a3000e9 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
@@ -26,13 +26,20 @@
 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);
 }
+
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 4ade8d3..de09d97 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
@@ -15,7 +15,9 @@
 package org.eclipse.openk.contactbasedata.service;
 
 import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
 import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -29,20 +31,33 @@
 public class ContactService {
     @Autowired
     private DetailedContactRepository detailedContactRepository;
+    @Autowired
+    private ContactRepository contactRepository;
+    @Autowired
+    private ContactMapper contactMapper;
 
     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());
     }