From 4314b647f6cf1e97695208e250b1f7cbbea1f723 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Tue, 9 Apr 2024 10:08:48 +0200 Subject: [PATCH] automatically-create-ex-partner-relation (#35) Co-authored-by: Michael Hoennig Reviewed-on: https://dev.hostsharing.net/hostsharing/hs.hsadmin.ng/pulls/35 Reviewed-by: Timotheus Pokorra --- .../office/debitor/HsOfficeDebitorEntity.java | 1 + .../partner/HsOfficePartnerController.java | 11 +++ .../relation/HsOfficeRelationEntity.java | 2 +- ...OfficePartnerControllerAcceptanceTest.java | 68 ++++++++++++++----- 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntity.java index 7a2cb1ec..51df906f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntity.java @@ -26,6 +26,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import jakarta.persistence.Version; import jakarta.validation.constraints.Pattern; import java.io.IOException; import java.util.UUID; diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerController.java index cacff85e..1b9707f7 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerController.java @@ -26,6 +26,8 @@ import jakarta.persistence.PersistenceContext; import java.util.List; import java.util.UUID; +import static net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType.EX_PARTNER; + @RestController public class HsOfficePartnerController implements HsOfficePartnersApi { @@ -128,14 +130,23 @@ public class HsOfficePartnerController implements HsOfficePartnersApi { context.define(currentUser, assumedRoles); final var current = partnerRepo.findByUuid(partnerUuid).orElseThrow(); + final var previousPartnerRel = current.getPartnerRel(); new HsOfficePartnerEntityPatcher(em, current).apply(body); final var saved = partnerRepo.save(current); + optionallyCreateExPartnerRelation(saved, previousPartnerRel); + final var mapped = mapper.map(saved, HsOfficePartnerResource.class); return ResponseEntity.ok(mapped); } + private void optionallyCreateExPartnerRelation(final HsOfficePartnerEntity saved, final HsOfficeRelationEntity previousPartnerRel) { + if (!saved.getPartnerRel().getUuid().equals(previousPartnerRel.getUuid())) { + relationRepo.save(previousPartnerRel.toBuilder().uuid(null).type(EX_PARTNER).build()); + } + } + private HsOfficePartnerEntity createPartnerEntity(final HsOfficePartnerInsertResource body) { final var entityToSave = new HsOfficePartnerEntity(); entityToSave.setPartnerNumber(body.getPartnerNumber()); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntity.java index c8c41db0..2bc9c452 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntity.java @@ -30,7 +30,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Table(name = "hs_office_relation_rv") @Getter @Setter -@Builder +@Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor @FieldNameConstants diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerAcceptanceTest.java index e8eac1c1..cc18943e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerAcceptanceTest.java @@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.UUID; +import static net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType.EX_PARTNER; import static net.hostsharing.test.IsValidUuidMatcher.isUuidValid; import static net.hostsharing.test.JsonMatcher.lenientlyEquals; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu HsOfficePartnerRepository partnerRepo; @Autowired - HsOfficeRelationRepository relationRepository; + HsOfficeRelationRepository relationRepo; @Autowired HsOfficePersonRepository personRepo; @@ -376,6 +377,45 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu }); } + @Test + void patchingThePartnerRelCreatesExPartnerRel() { + + context.define("superuser-alex@hostsharing.net"); + final var givenPartner = givenSomeTemporaryPartnerBessler(20011); + final var givenPartnerRel = givenSomeTemporaryPartnerRel("Third OHG", "third contact"); + + RestAssured // @formatter:off + .given() + .header("current-user", "superuser-alex@hostsharing.net") + .contentType(ContentType.JSON) + .body(""" + { + "partnerRelUuid": "%s" + } + """.formatted(givenPartnerRel.getUuid())) + .port(port) + .when() + .patch("http://localhost/api/hs/office/partners/" + givenPartner.getUuid()) + .then().log().body() + .assertThat().statusCode(200); + // @formatter:on + + // then the partner got actually updated + context.define("superuser-alex@hostsharing.net"); + assertThat(partnerRepo.findByUuid(givenPartner.getUuid())).isPresent().get() + .matches(partner -> { + assertThat(partner.getPartnerRel().getHolder().getTradeName()).isEqualTo("Third OHG"); + assertThat(partner.getPartnerRel().getContact().getLabel()).isEqualTo("third contact"); + return true; + }); + + // and an ex-partner-relation got created + final var anchorpartnerPersonUUid = givenPartner.getPartnerRel().getAnchor().getUuid(); + assertThat(relationRepo.findRelationRelatedToPersonUuidAndRelationType(anchorpartnerPersonUUid, EX_PARTNER)) + .map(HsOfficeRelationEntity::toShortString) + .contains("rel(anchor='LP Hostsharing eG', type='EX_PARTNER', holder='UF Erben Bessler')"); + } + @Test void globalAdmin_withoutAssumedRole_canPatchPartialPropertiesOfArbitraryPartner() { @@ -402,23 +442,19 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu .statusCode(200) .contentType(ContentType.JSON) .body("uuid", isUuidValid()) - .body("details.birthName", is("Maja Schmidt")); - // TODO: assert partnerRel -// .body("contact.label", is(givenPartner.getContact().getLabel())) -// .body("person.tradeName", is(givenPartner.getPerson().getTradeName())); + .body("details.birthName", is("Maja Schmidt")) + .body("partnerRel.contact.label", is(givenPartner.getPartnerRel().getContact().getLabel())); // @formatter:on - // finally, the partner is actually updated + // finally, the partner details and only the partner details are actually updated assertThat(partnerRepo.findByUuid(givenPartner.getUuid())).isPresent().get() - .matches(person -> { - // TODO: assert partnerRel -// assertThat(person.getPerson().getTradeName()).isEqualTo(givenPartner.getPerson().getTradeName()); -// assertThat(person.getContact().getLabel()).isEqualTo(givenPartner.getContact().getLabel()); - assertThat(person.getDetails().getRegistrationOffice()).isEqualTo("Temp Registergericht Leer"); - assertThat(person.getDetails().getRegistrationNumber()).isEqualTo("333333"); - assertThat(person.getDetails().getBirthName()).isEqualTo("Maja Schmidt"); - assertThat(person.getDetails().getBirthday()).isEqualTo("1938-04-08"); - assertThat(person.getDetails().getDateOfDeath()).isEqualTo("2022-01-12"); + .matches(partner -> { + assertThat(partner.getPartnerRel().getContact().getLabel()).isEqualTo(givenPartner.getPartnerRel().getContact().getLabel()); + assertThat(partner.getDetails().getRegistrationOffice()).isEqualTo("Temp Registergericht Leer"); + assertThat(partner.getDetails().getRegistrationNumber()).isEqualTo("333333"); + assertThat(partner.getDetails().getBirthName()).isEqualTo("Maja Schmidt"); + assertThat(partner.getDetails().getBirthday()).isEqualTo("1938-04-08"); + assertThat(partner.getDetails().getDateOfDeath()).isEqualTo("2022-01-12"); return true; }); } @@ -446,7 +482,7 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu // then the given partner is gone assertThat(partnerRepo.findByUuid(givenPartner.getUuid())).isEmpty(); - assertThat(relationRepository.findByUuid(givenPartner.getPartnerRel().getUuid())).isEmpty(); + assertThat(relationRepo.findByUuid(givenPartner.getPartnerRel().getUuid())).isEmpty(); } @Test