KON-22 Services für Company
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
new file mode 100644
index 0000000..82a85d6
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
@@ -0,0 +1,102 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.service.CompanyService;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.annotation.Secured;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import java.net.URI;
+import java.util.UUID;
+
+@Log4j2
+@RestController
+@RequestMapping("/companies")
+public class CompanyController {
+    @Autowired
+    private CompanyService companyService;
+
+    @GetMapping("/{contactUuid}")
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiOperation(value = "Anzeigen einer Firma")
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
+                            @ApiResponse(code = 404, message = "Firma wurde nicht gefunden")})
+    @ResponseStatus(HttpStatus.OK)
+    public CompanyDto getCompany(@PathVariable UUID contactUuid) {
+        return companyService.findCompany(contactUuid);
+    }
+
+    @GetMapping
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiOperation(value = "Anzeigen aller Firmen", notes = "Sortieren ist möglich. Firmen werden seitenweise geliefert.")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    public Page<CompanyDto> readCompanys(
+            @PageableDefault(sort = {"companyName"}, direction = Sort.Direction.ASC) Pageable pageable){
+            return companyService.findCompanys(pageable);
+    }
+
+    @PostMapping
+    @Secured("ROLE_KON-ADMIN")
+    @ApiOperation(value = "Anlegen einer Firma")
+    @ApiResponses(value = {
+            @ApiResponse(code = 201, message = "Firma erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<CompanyDto> insertCompany(
+            @Validated @RequestBody CompanyDto companyDto) {
+        CompanyDto savedCompanyDto = companyService.insertCompany(companyDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedCompanyDto.getContactUuid())
+                .toUri();
+        return ResponseEntity.created(location).body(savedCompanyDto);
+    }
+
+    @PutMapping("/{contactUuid}")
+    @Secured("ROLE_KON-ADMIN")
+    @ApiOperation(value = "Ändern einer externen Person")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Firma wurde aktualisiert"),
+            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public ResponseEntity updateCompany(@PathVariable UUID contactUuid, @Validated @RequestBody CompanyDto companyDto) {
+
+        if (!companyDto.getContactUuid().equals(contactUuid)) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+
+        companyService.updateCompany(companyDto);
+        return ResponseEntity.ok().build();
+    }
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
index 458eecc..662f832 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
@@ -24,7 +24,16 @@
 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
 public interface CompanyMapper {
     @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"),
     })
     CompanyDto toCompanyDto(TblCompany tblCompany);
+
+    @Mappings({
+            @Mapping( source="contactUuid", target="contact.uuid"),
+            @Mapping( source="contactType", target="contact.contactType"),
+            @Mapping( source="contactNote", target="contact.note"),
+    })
+    TblCompany toTblCompany(CompanyDto companyDto);
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
index 23e288c..658e81c 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
@@ -26,7 +26,6 @@
 
     @Mappings({
             @Mapping( source="contact.uuid", target="contactUuid"),
-            //@Mapping( source="contact.uuid", target="contactId"),
             @Mapping( source="contact.contactType", target="contactType"),
             @Mapping( source="contact.note", target="contactNote"),
             @Mapping( source="refPersonType.uuid", target="personTypeUuid"),
@@ -37,7 +36,6 @@
     ExternalPersonDto toExternalPersonDto(TblExternalPerson tblExternalPerson);
 
     @Mappings({
-            //@Mapping( source="id", target="uuid"),
             @Mapping( source="contactUuid", target="contact.uuid"),
             @Mapping( source="contactType", target="contact.contactType"),
             @Mapping( source="contactNote", target="contact.note"),
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 8895d39..77f2316 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
@@ -33,6 +33,7 @@
     private String hrNumber;
 
     @OneToOne
+    @JoinColumn( name = "fk_contact_id")
     private TblContact contact;
 
     @OneToMany
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/CompanyRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/CompanyRepository.java
new file mode 100644
index 0000000..b27c86c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/CompanyRepository.java
@@ -0,0 +1,28 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.TblCompany;
+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 CompanyRepository extends JpaRepository<TblCompany, Long > {
+    @Query("select co from TblCompany co where co.contact.uuid = :contactUuid")
+    Optional<TblCompany> findByTblContactUuid(@Param("contactUuid") UUID contactUuid);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
new file mode 100644
index 0000000..388794a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
@@ -0,0 +1,110 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.constants.Constants;
+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.model.TblCompany;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.repository.CompanyRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+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.UUID;
+
+@Log4j2
+@Service
+public class CompanyService {
+    @Autowired
+    private CompanyRepository companyRepository;
+
+    @Autowired
+    private ContactRepository contactRepository;
+
+    @Autowired
+    private SalutationRepository salutationRepository;
+
+    @Autowired
+    private PersonTypeRepository personTypeRepository;
+
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private ContactMapper contactMapper;
+
+    @Autowired
+    private BaseContactService baseContactService;
+
+    public CompanyDto findCompany(UUID contactUuid) {
+        return companyMapper.toCompanyDto(
+                companyRepository.findByTblContactUuid(contactUuid).orElseThrow(NotFoundException::new)
+        );
+    }
+
+    public Page<CompanyDto> findCompanys(Pageable pageable) {
+        return companyRepository.findAll(pageable).map(companyMapper::toCompanyDto);
+    }
+
+
+    @Transactional
+    public CompanyDto insertCompany(CompanyDto companyDto) {
+        TblContact contactToSave = new TblContact();
+        contactToSave.setUuid(UUID.randomUUID());
+        contactToSave.setContactType(Constants.CONTACT_TYPE_COMPANY);
+
+        TblCompany companyToSave = companyMapper.toTblCompany(companyDto);
+        companyToSave.setContact(contactToSave);
+        contactRepository.save(companyToSave.getContact());
+
+        setFromCompanyDto( companyToSave, companyDto );
+
+        // Then save dependent Model-Object
+        return companyMapper.toCompanyDto(companyRepository.save(companyToSave));
+    }
+
+    @Transactional
+    public CompanyDto updateCompany(CompanyDto companyDto){
+        TblCompany companyUpdated;
+
+        //Interne Person holen
+        TblCompany existingCompany = companyRepository
+                .findByTblContactUuid(companyDto.getContactUuid())
+                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+        existingCompany.setCompanyName(companyDto.getCompanyName());
+        existingCompany.setCompanyType(companyDto.getCompanyType());
+
+        setFromCompanyDto( existingCompany, companyDto );
+        companyUpdated = companyRepository.save(existingCompany);
+
+        return companyMapper.toCompanyDto(companyUpdated);
+    }
+
+    private void setFromCompanyDto( TblCompany destTblCompany, CompanyDto sourceDto ) {
+
+        destTblCompany.getContact().setNote(sourceDto.getContactNote());
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
index 3378d51..834d699 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
@@ -22,9 +22,6 @@
 
 @Data
 public class CompanyDto implements Serializable {
-
-    @JsonProperty("id")
-    private UUID uuid;
     private String companyName;
     private String companyType;
     private String hrNumber;
@@ -33,5 +30,5 @@
     @JsonProperty("contactId")
     private UUID contactUuid;
     private String contactType;
-    private String note;
+    private String contactNote;
 }
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 25a0675..a77b23b 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
@@ -23,8 +23,6 @@
 @Data
 public class ContactPersonDto implements Serializable {
 
-    @JsonProperty("id")
-    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
@@ -36,7 +34,8 @@
     private String note;
 
     //from Company
-    private String companyId;
+    @JsonProperty("companyContactId")
+    private UUID companyContactUuid;
     private String companyName;
     private String companyType;
     private String hrNumber;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
index 975f786..8dcf590 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
@@ -23,8 +23,6 @@
 @Data
 public class ExternalPersonDto implements Serializable {
 
-    @JsonProperty("id")
-    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
index e07c8c7..9da4ff6 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
@@ -22,9 +22,6 @@
 
 @Data
 public class InternalPersonDto implements Serializable {
-
-    @JsonProperty("id")
-    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
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 a5961c3..62524b1 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
+    CompanyMapper companyMapper() { return new CompanyMapperImpl(); }
+
+    @Bean
     ContactMapper contactMapper() { return new ContactMapperImpl(); }
 
     @Bean
@@ -74,6 +77,9 @@
     public InternalPersonService myInternalPersonService() { return new InternalPersonService(); }
 
     @Bean
+    public CompanyService myCompanyService() { return new CompanyService(); }
+
+    @Bean
     public SalutationService mySalutationService() { return new SalutationService(); }
 
     @Bean
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 04e7abc..2ec988e 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,64 @@
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
+
+
+    xxxx
+    public static TblCompany mockCompany() {
+        TblContact c = new TblContact();
+        c.setId( 10L );
+        c.setContactType(Constants.CONTACT_TYPE_COMPANY);
+        c.setUuid(UUID.randomUUID());
+        TblCompany tblCompany = new TblCompany();
+        tblCompany.setId( 12L );
+        tblCompany.setContact(c);
+        tblCompany.setCompanyName("Kuemmelbrot");
+        tblCompany.setCompanyType("GmbH");
+        c.setNote("insolvent");
+        return tblCompany;
+    }
+
+    public static InternalPersonDto mockInternalPersonDto() {
+        InternalPersonDto ipd = new InternalPersonDto();
+        ipd.setContactUuid(UUID.randomUUID());
+        ipd.setFirstName("Hella");
+        ipd.setLastName("Wahnsinn");
+        ipd.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
+        ipd.setTitle("Mrs.");
+        ipd.setDepartment("Beschwerdemanagement");
+        ipd.setUid("222-888");
+        ipd.setUserRef("HWAHNS");
+        ipd.setPersonTypeUuid(UUID.randomUUID());
+        ipd.setSalutationUuid(UUID.randomUUID());
+        ipd.setContactNote("Vorsicht");
+        return ipd;
+    }
+
+    public static Page<InternalPersonDto> mockInternalPersonDtoPage(){
+
+        InternalPersonDto ip1 = mockInternalPersonDto();
+
+        InternalPersonDto ip2 = new InternalPersonDto();
+        ip2.setContactUuid(UUID.randomUUID());
+        ip2.setFirstName("Fritz");
+        ip2.setLastName("Alter");
+        ip2.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
+        ip2.setTitle("Dr.");
+        ip2.setDepartment("Geschäftsführung");
+        ip2.setUid("333-999");
+        ip2.setUserRef("FALTER");
+        ip2.setPersonTypeUuid(UUID.randomUUID());
+        ip2.setSalutationUuid(UUID.randomUUID());
+        ip2.setContactNote("Gründer");
+
+        List<InternalPersonDto> list = Arrays.asList(ip1, ip2);
+        return new PageImpl<>(list, Pageable.unpaged(), list.size());
+    }
+
+
+    yyyy
+
+
     public static TblContact mockTblContact(){
         TblContact tblContact = new TblContact();
         tblContact.setId(5L);