KON-39 Interne Personen uid und userRef unique
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java
index 0c93a17..adf51c8 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java
@@ -34,6 +34,7 @@
 import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 
 import java.net.URI;
+import java.util.Optional;
 import java.util.UUID;
 
 @Log4j2
@@ -55,13 +56,18 @@
 
     @GetMapping
     @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
-    @ApiOperation(value = "Anzeigen aller internen Personen", notes = "Sortieren ist möglich. Interne Personen werden seitenweise geliefert.")
+    @ApiOperation(value = "Anzeigen von internen Personen", notes = "Filtern und Sortieren ist möglich. Interne Personen werden seitenweise geliefert. Werden mehrere Filter gleichzeit verwendet, so werden diese mit 'UND' verknüpft!")
     @ResponseStatus(HttpStatus.OK)
     @ApiResponses(value = {
             @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
     public Page<InternalPersonDto> readInternalPersons(
+            @RequestParam( "uid") Optional<String> uid,
+            @RequestParam( "userRef" ) Optional<String> userRef,
             @PageableDefault(sort = {"lastName"}, direction = Sort.Direction.ASC) Pageable pageable){
-            return internalPersonService.findInternalPersons(pageable);
+            return internalPersonService.findInternalPersons(
+                    uid.orElse(null ),
+                    userRef.orElse(null ),
+                    pageable);
     }
 
     @PostMapping
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
index b5c53b7..29c780d 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
@@ -15,8 +15,12 @@
 package org.eclipse.openk.contactbasedata.repository;
 
 import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
+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;
 
@@ -24,4 +28,11 @@
     @Query("select ip from TblInternalPerson ip where ip.contact.uuid = ?1")
     Optional< TblInternalPerson > findByTblContactUuid(final UUID contactUuid);
 
+    @Query( "select ip from TblInternalPerson ip where "+
+            "(COALESCE(:uid) is null or COALESCE(:uid) is not null AND ip.uid=:uid) AND " +
+            "(COALESCE(:userRef) is null or COALESCE(:userRef) is not null AND ip.userRef=:userRef)")
+    Page<TblInternalPerson> findByFilter(@Param( "uid") String uid,
+                                         @Param( "userRef") String userRef,
+                                         Pageable pageable);
+
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
index 3adad52..6963a09 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
@@ -19,9 +19,12 @@
 import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
 import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
 import org.eclipse.openk.contactbasedata.mapper.InternalPersonMapper;
-import org.eclipse.openk.contactbasedata.model.*;
-import org.eclipse.openk.contactbasedata.repository.*;
-import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.InternalPersonRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
 import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -61,11 +64,17 @@
         );
     }
 
-    public Page<InternalPersonDto> findInternalPersons(Pageable pageable) {
-        return internalPersonRepository.findAll(pageable).map(internalPersonMapper::toInternalPersonDto);
+    public Page<InternalPersonDto> findInternalPersons(String uid, String userRef, Pageable pageable) {
+        Page<TblInternalPerson> returnPageDb;
+        if( uid == null && userRef == null) {
+            returnPageDb = internalPersonRepository.findAll( pageable );
+        }
+        else {
+            returnPageDb =  internalPersonRepository.findByFilter( uid, userRef, pageable );
+        }
+        return returnPageDb.map(internalPersonMapper::toInternalPersonDto);
     }
 
-
     @Transactional
     public InternalPersonDto insertInternalPerson(InternalPersonDto internalPersonDto) {
         TblContact contactToSave = new TblContact();
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.java
index 3d18ac5..f899812 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.java
@@ -16,12 +16,9 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
-import org.eclipse.openk.contactbasedata.service.ExternalPersonService;
 import org.eclipse.openk.contactbasedata.service.InternalPersonService;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
-import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
 import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
-import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -38,6 +35,7 @@
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@@ -72,9 +70,9 @@
     public void shouldReturnAllIntPersons() throws Exception {
         Page<InternalPersonDto> ipPage = MockDataHelper.mockInternalPersonDtoPage();
 
-        when(internalPersonService.findInternalPersons(any(Pageable.class))).thenReturn(ipPage);
+        when(internalPersonService.findInternalPersons(anyString(), anyString(), any(Pageable.class))).thenReturn(ipPage);
 
-        mockMvc.perform(get("/internal-persons"))
+        mockMvc.perform(get("/internal-persons?uid=ABC&userRef=123"))
                 .andExpect(status().is2xxSuccessful())
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                 .andExpect(jsonPath("totalElements", is(  2 )));
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java
index 4cc33f3..0c94c90 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java
@@ -32,6 +32,8 @@
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.Optional;
@@ -39,7 +41,8 @@
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
 
 @DataJpaTest
 @ContextConfiguration(classes = {TestConfiguration.class})
@@ -71,6 +74,23 @@
     }
 
     @Test
+    public void shouldFindAllInternalPersons() {
+        Page<TblInternalPerson> ipPage = MockDataHelper.mockTblInternalPersonPage();
+        when(internalPersonRepository.findAll(any(Pageable.class))).thenReturn(ipPage);
+        when(internalPersonRepository.findByFilter(anyString(), anyString(), any(Pageable.class))).thenReturn(ipPage);
+
+        Page<InternalPersonDto> dtoPage = internalPersonService.findInternalPersons(null, null, Pageable.unpaged());
+        Page<InternalPersonDto> dtoPage2= internalPersonService.findInternalPersons("abc", "123", Pageable.unpaged());
+
+        verify( internalPersonRepository, times(1)).findAll(any(Pageable.class));
+        verify( internalPersonRepository, times( 1 )).findByFilter(anyString(), anyString(), any(Pageable.class));
+
+        assertEquals( ipPage.getTotalElements(), dtoPage.getTotalElements());
+        assertEquals( ipPage.getTotalElements(), dtoPage2.getTotalElements());
+
+    }
+
+    @Test
     public void shouldThrowInErrorCaseWithInternalPerson() {
         TblInternalPerson ip = MockDataHelper.mockInternalPerson();
         when(internalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
index 5850ad6..b9edd3f 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -422,6 +422,25 @@
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
+    public static Page<TblInternalPerson> mockTblInternalPersonPage(){
+
+        TblInternalPerson ip1 = mockInternalPerson();
+
+        TblInternalPerson ip2 = new TblInternalPerson();
+        ip2.setContact(new TblContact());
+        ip2.getContact().setUuid(UUID.randomUUID());
+        ip2.setFirstName("Fritz");
+        ip2.setLastName("Alter");
+        ip2.setTitle("Dr.");
+        ip2.setDepartment("Geschäftsführung");
+        ip2.setUid("333-999");
+        ip2.setUserRef("FALTER");
+        ip2.getContact().setNote("Gründer");
+
+        List<TblInternalPerson> list = Arrays.asList(ip1, ip2);
+        return new PageImpl<>(list, Pageable.unpaged(), list.size());
+    }
+
     public static TblCompany mockCompany() {
         TblContact c = new TblContact();
         c.setId( 10L );