Merge branch 'KON-23_Ansprechpartneruebersicht' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.contactBaseData.backend into DEVELOP
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
index 7d35734..e455fa3 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
@@ -21,6 +21,7 @@
 import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
 import org.eclipse.openk.contactbasedata.service.CompanyService;
 import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -34,6 +35,7 @@
 import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 
 import java.net.URI;
+import java.util.List;
 import java.util.UUID;
 
 @Log4j2
@@ -65,7 +67,7 @@
     }
 
     @PostMapping
-    @Secured("ROLE_KON-ADMIN")
+    @Secured({"ROLE_KON-ADMIN", "ROLE_KON-WRITER"})
     @ApiOperation(value = "Anlegen einer Firma")
     @ApiResponses(value = {
             @ApiResponse(code = 201, message = "Firma erfolgreich angelegt"),
@@ -83,7 +85,7 @@
     }
 
     @PutMapping("/{contactUuid}")
-    @Secured("ROLE_KON-ADMIN")
+    @Secured({"ROLE_KON-ADMIN", "ROLE_KON-WRITER"})
     @ApiOperation(value = "Ändern einer externen Person")
     @ApiResponses(value = {
             @ApiResponse(code = 200, message = "Firma wurde aktualisiert"),
@@ -98,5 +100,16 @@
         companyService.updateCompany(companyDto);
         return ResponseEntity.ok().build();
     }
+
+    @GetMapping("/{contactUuid}/contact-persons")
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiOperation(value = "Anzeigen von Ansprechpartnern zu einer Firma")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
+            @ApiResponse(code = 404, message = "Ansprechpartner wurden nicht gefunden")})
+    public List<ContactPersonDto> findContactPersons(@PathVariable("contactUuid") UUID contactUuid) {
+
+        return companyService.findContactPersonsToCompany(contactUuid);
+    }
 }
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java
index 132fe05..b77906e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java
@@ -23,8 +23,35 @@
 
 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
 public interface ContactPersonMapper {
+
     @Mappings({
-            @Mapping( source="contact.uuid", target="contactUuid")
+            @Mapping( source="contact.uuid", target="contactUuid"),
+            @Mapping( source="contact.contactType", target="contactType"),
+            @Mapping( source="contact.note", target="contactNote"),
+            @Mapping( source="refPersonType.uuid", target="personTypeUuid"),
+            @Mapping( source="refPersonType.type", target="personType"),
+            @Mapping( source="salutation.uuid", target="salutationUuid"),
+            @Mapping( source="salutation.type", target="salutationType"),
+            @Mapping( source="company.contact.uuid", target="companyContactUuid"),
+            @Mapping( source="company.companyName", target="companyName"),
+            @Mapping( source="company.companyType", target="companyType"),
+            @Mapping( source="company.hrNumber", target="companyHrNumber"),
+
     })
     ContactPersonDto toContactPersonDto(TblContactPerson tblContactPerson);
+
+    @Mappings({
+            @Mapping( source="contactUuid", target="contact.uuid"),
+            @Mapping( source="contactType", target="contact.contactType"),
+            @Mapping( source="contactNote", target="contact.note"),
+            @Mapping( source="personTypeUuid", target="refPersonType.uuid"),
+            @Mapping( source="personType", target="refPersonType.type"),
+            @Mapping( source="salutationUuid", target="salutation.uuid"),
+            @Mapping( source="salutationType", target="salutation.type"),
+            @Mapping( source="companyContactUuid", target="company.contact.uuid"),
+            @Mapping( source="companyName", target="company.companyName"),
+            @Mapping( source="companyType", target="company.companyType"),
+            @Mapping( source="companyHrNumber", target="company.hrNumber"),
+    })
+    TblContactPerson toTblContactPerson(ContactPersonDto contactPersonDto);
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
index 77f2316..c616f93 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
@@ -36,8 +36,8 @@
     @JoinColumn( name = "fk_contact_id")
     private TblContact contact;
 
-    @OneToMany
-    private List<TblContactPerson> contactPerson;
+    @OneToMany(cascade=CascadeType.ALL, mappedBy="company", orphanRemoval = false)
+    private List<TblContactPerson> contactPersons;
 
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java
index cdc266d..9bcdf66 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java
@@ -32,15 +32,19 @@
     private String title;
 
     @OneToOne
+    @JoinColumn( name = "fk_contact_id")
     private TblContact contact;
 
     @ManyToOne
-    private TblCompany tblCompany;
+    @JoinColumn( name = "fk_company_id")
+    private TblCompany company;
 
     @ManyToOne
+    @JoinColumn( name = "fk_ref_person_type_id")
     private RefPersonType refPersonType;
 
     @ManyToOne
-    private RefSalutation refSalutation;
+    @JoinColumn( name = "fk_salutation_id")
+    private RefSalutation salutation;
 }
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
index b88907b..663e2ff 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
@@ -19,6 +19,7 @@
 import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
 import org.eclipse.openk.contactbasedata.mapper.CompanyMapper;
 import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
+import org.eclipse.openk.contactbasedata.mapper.ContactPersonMapper;
 import org.eclipse.openk.contactbasedata.model.TblCompany;
 import org.eclipse.openk.contactbasedata.model.TblContact;
 import org.eclipse.openk.contactbasedata.repository.CompanyRepository;
@@ -26,13 +27,16 @@
 import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
 import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
 import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
 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 org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 @Log4j2
 @Service
@@ -53,6 +57,9 @@
     private CompanyMapper companyMapper;
 
     @Autowired
+    private ContactPersonMapper contactPersonMapper;
+
+    @Autowired
     private ContactMapper contactMapper;
 
     @Autowired
@@ -104,6 +111,14 @@
         return companyMapper.toCompanyDto(companyUpdated);
     }
 
+    public List<ContactPersonDto> findContactPersonsToCompany( UUID companyContactUuid ) {
+        TblCompany company = companyRepository.findByTblContactUuid( companyContactUuid )
+                .orElseThrow( NotFoundException::new);
+        return company.getContactPersons().stream()
+                .map(contactPersonMapper::toContactPersonDto)
+                .collect(Collectors.toList());
+    }
+
     private void setFromCompanyDto( TblCompany destTblCompany, CompanyDto sourceDto ) {
 
         destTblCompany.getContact().setNote(sourceDto.getContactNote());
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
index a77b23b..976567e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
@@ -31,20 +31,21 @@
     @JsonProperty("contactId")
     private UUID contactUuid;
     private String contactType;
-    private String note;
+    private String contactNote;
 
     //from Company
     @JsonProperty("companyContactId")
     private UUID companyContactUuid;
     private String companyName;
     private String companyType;
-    private String hrNumber;
+    private String companyHrNumber;
 
-    // from RefPersonType
-    private String refPersonTypeType;
-    private String refPersonTypeDescription;
+    @JsonProperty("personTypeId")
+    private UUID personTypeUuid;
+    private String personType;
 
     //from RefSalutation
-    private String refSalutationType;
-    private String refSalutationDescription;
+    @JsonProperty("salutationId")
+    private UUID salutationUuid;
+    private String salutationType;
 }
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
index e7846ef..1366b4a 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
@@ -42,6 +42,9 @@
     InternalPersonMapper internalPersonMapper() { return new InternalPersonMapperImpl(); }
 
     @Bean
+    ContactPersonMapper contactPersonMapper() { return new ContactPersonMapperImpl(); }
+
+    @Bean
     CompanyMapper companyMapper() { return new CompanyMapperImpl(); }
 
     @Bean
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java
index 27963ea..1448b60 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java
@@ -19,6 +19,7 @@
 import org.eclipse.openk.contactbasedata.service.CompanyService;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
 import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -30,6 +31,7 @@
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.web.servlet.MockMvc;
 
+import java.util.List;
 import java.util.UUID;
 
 import static org.hamcrest.Matchers.is;
@@ -53,7 +55,7 @@
 
 
     @Test
-    public void shouldReturnARequestedExtPerson() throws Exception {
+    public void shouldReturnARequestedCompany() throws Exception {
         CompanyDto ep = MockDataHelper.mockCompanyDto();
 
         when(companyService.findCompany(any(UUID.class))).thenReturn(ep);
@@ -66,7 +68,7 @@
 
 
     @Test
-    public void shouldReturnAllExtPerson() throws Exception {
+    public void shouldReturnAllCompany() throws Exception {
         Page<CompanyDto> epPage = MockDataHelper.mockCompanyDtoPage();
 
         when(companyService.findCompanies(any(Pageable.class))).thenReturn(epPage);
@@ -78,7 +80,7 @@
     }
 
     @Test
-    public void shouldUpdateExtPerson() throws Exception {
+    public void shouldUpdateCompany() throws Exception {
         CompanyDto ep = MockDataHelper.mockCompanyDto();
 
         when( companyService.updateCompany(any(CompanyDto.class))).thenReturn(ep);
@@ -90,7 +92,7 @@
     }
 
     @Test
-    public void shouldNotUpdateExtPersonDueToException() throws Exception {
+    public void shouldNotUpdateCompanyDueToException() throws Exception {
         CompanyDto ep = MockDataHelper.mockCompanyDto();
 
         when( companyService.updateCompany(any(CompanyDto.class))).thenReturn(ep);
@@ -103,7 +105,7 @@
     }
 
     @Test
-    public void shouldInsertExtPerson() throws Exception {
+    public void shouldInsertCompany() throws Exception {
         CompanyDto companyDto = MockDataHelper.mockCompanyDto();
 
         when( companyService.insertCompany(any(CompanyDto.class))).thenReturn(companyDto);
@@ -116,4 +118,15 @@
                 .andExpect(jsonPath("$.contactNote", is(companyDto.getContactNote())))
                 .andExpect(status().is2xxSuccessful());
     }
+
+    @Test
+    public void shouldReturnContactPerson() throws Exception {
+        List<ContactPersonDto> contactPersonDtos = MockDataHelper.mockContactPersonDtos();
+
+        when( companyService.findContactPersonsToCompany(any(UUID.class))).thenReturn(contactPersonDtos);
+
+        mockMvc.perform(get("/companies/"+UUID.randomUUID().toString()+"/contact-persons" ))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java
index ba0b175..9a89a99 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java
@@ -24,6 +24,7 @@
 import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
 import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
 import org.junit.jupiter.api.Test;
 import org.mockito.stubbing.Answer;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +33,7 @@
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.ContextConfiguration;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
@@ -141,4 +143,21 @@
         assertEquals(epDto.getCompanyName(), savedDto.getCompanyName());
         assertEquals(epDto.getCompanyType(), savedDto.getCompanyType());
     }
+
+    @Test
+    public void findContactPersonsToCompanyWithSuccess() {
+        TblCompany company = MockDataHelper.mockCompany();
+        company.setContactPersons( MockDataHelper.mockTblContactPersons());
+        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(company));
+        List<ContactPersonDto> cpDtos = companyService.findContactPersonsToCompany(UUID.randomUUID());
+        assertEquals(company.getContactPersons().size(), cpDtos.size());
+        assertEquals(company.getContactPersons().get(1).getContact().getUuid(), cpDtos.get(1).getContactUuid());
+    }
+
+
+    @Test
+    public void findContactPersonsToCompanyWithException() {
+        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
+        assertThrows( NotFoundException.class, ()-> companyService.findContactPersonsToCompany(UUID.randomUUID()));
+    }
 }
\ No newline at end of file
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 4c294b0..7a413f8 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -481,6 +481,47 @@
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
+    public static TblContactPerson mockTblContactPerson() {
+        TblContactPerson cp = new TblContactPerson();
+        cp.setCompany(mockCompany());
+        cp.setContact(mockTblContact());
+        cp.setFirstName("Prober");
+        cp.setLastName("Cottwick");
+        return cp;
+    }
+
+    public static List<TblContactPerson> mockTblContactPersons() {
+        return Arrays.asList(mockTblContactPerson(), mockTblContactPerson());
+    }
+
+    public static ContactPersonDto mockContactPersonDto() {
+        ContactPersonDto contactPersonDto = new ContactPersonDto();
+        contactPersonDto.setCompanyContactUuid(UUID.randomUUID());
+        contactPersonDto.setCompanyName("Filligri");
+        contactPersonDto.setCompanyType("GmbH");
+        contactPersonDto.setCompanyHrNumber("12345");
+        contactPersonDto.setFirstName("Prober");
+        contactPersonDto.setLastName("Cottwick");
+        contactPersonDto.setCompanyType(Constants.CONTACT_TYPE_CONTACT_PERSON);
+        contactPersonDto.setTitle("Prof. Dr.");
+        return contactPersonDto;
+    }
+
+    public static List<ContactPersonDto> mockContactPersonDtos(){
+
+        ContactPersonDto  cp1 = mockContactPersonDto();
+
+        ContactPersonDto cp2 = new ContactPersonDto();
+        cp2.setContactUuid(UUID.randomUUID());
+        cp2.setFirstName("Pruner");
+        cp2.setLastName("Goldwick");
+        cp2.setContactType(Constants.CONTACT_TYPE_CONTACT_PERSON);
+        cp2.setTitle("Dr.");
+        cp2.setContactNote("Gründer");
+
+        return Arrays.asList(cp1, cp2);
+    }
+
     public static TblContact mockTblContact(){
         TblContact tblContact = new TblContact();
         tblContact.setId(5L);