From 085876c7720f2d27f57090f194e16c5bcd429771 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 5 Aug 2024 11:48:33 +0200 Subject: [PATCH] improve-performance-of-office-data-import (#83) Co-authored-by: Michael Hoennig Reviewed-on: https://dev.hostsharing.net/hostsharing/hs.hsadmin.ng/pulls/83 Reviewed-by: Marc Sandlus --- .run/ImportHostingAssets.run.xml | 36 +++ .run/ImportOfficeData.run.xml | 36 +++ .run/README.txt | 1 + doc/rbac-performance-analysis.md | 4 +- .../hsadminng/errors/CustomErrorResponse.java | 2 +- .../hsadminng/errors/DisplayAs.java | 24 ++ .../hsadminng/errors/DisplayName.java | 12 - .../RestResponseEntityExceptionHandler.java | 4 +- .../debitor/HsBookingDebitorEntity.java | 4 +- .../hs/booking/item/HsBookingItemEntity.java | 4 +- .../project/HsBookingProjectEntity.java | 8 +- .../hs/hosting/asset/HsHostingAsset.java | 8 +- .../hosting/asset/HsHostingAssetEntity.java | 8 +- .../asset/HsHostingAssetEntityPatcher.java | 4 +- .../HostingAssetEntityValidator.java | 4 +- .../HsOfficeBankAccountEntity.java | 8 +- .../hs/office/contact/HsOfficeContact.java | 106 +++++++++ .../contact/HsOfficeContactController.java | 6 +- .../office/contact/HsOfficeContactEntity.java | 123 ---------- .../contact/HsOfficeContactEntityPatcher.java | 4 +- .../contact/HsOfficeContactRbacEntity.java | 48 ++++ ...ava => HsOfficeContactRbacRepository.java} | 10 +- .../contact/HsOfficeContactRealEntity.java | 21 ++ .../HsOfficeContactRealRepository.java | 26 +++ .../HsOfficeCoopAssetsTransactionEntity.java | 10 +- .../HsOfficeCoopSharesTransactionEntity.java | 10 +- .../debitor/HsOfficeDebitorController.java | 34 ++- .../office/debitor/HsOfficeDebitorEntity.java | 22 +- .../debitor/HsOfficeDebitorEntityPatcher.java | 4 +- .../debitor/HsOfficeDebitorRepository.java | 2 +- .../membership/HsOfficeMembershipEntity.java | 14 +- .../partner/HsOfficePartnerController.java | 20 +- .../partner/HsOfficePartnerDetailsEntity.java | 8 +- .../office/partner/HsOfficePartnerEntity.java | 26 ++- .../partner/HsOfficePartnerEntityPatcher.java | 4 +- .../partner/HsOfficePartnerRepository.java | 4 +- .../office/person/HsOfficePersonEntity.java | 8 +- .../hs/office/relation/HsOfficeRelation.java | 83 +++++++ .../relation/HsOfficeRelationController.java | 30 +-- .../relation/HsOfficeRelationEntity.java | 174 -------------- .../HsOfficeRelationEntityPatcher.java | 8 +- .../relation/HsOfficeRelationRbacEntity.java | 123 ++++++++++ ...va => HsOfficeRelationRbacRepository.java} | 12 +- .../relation/HsOfficeRelationRealEntity.java | 21 ++ .../HsOfficeRelationRealRepository.java | 37 +++ .../HsOfficeSepaMandateEntity.java | 12 +- .../hostsharing/hsadminng/mapper/Mapper.java | 9 +- .../hsadminng/rbac/rbacdef/RbacView.java | 58 +++-- .../{RbacObject.java => BaseEntity.java} | 3 +- .../rbac/test/cust/TestCustomerEntity.java | 4 +- .../rbac/test/dom/TestDomainEntity.java | 4 +- .../rbac/test/pac/TestPackageEntity.java | 4 +- .../hsadminng/stringify/Stringify.java | 17 +- .../changelog/1-rbac/1058-rbac-generators.sql | 5 +- .../2013-test-customer-rbac.sql | 4 +- .../2023-test-package-rbac.sql | 4 +- .../203-test-domain/2033-test-domain-rbac.sql | 4 +- .../5043-hs-office-partner-rbac.sql | 4 +- .../5044-hs-office-partner-details-rbac.sql | 4 +- .../5063-hs-office-debitor-rbac.sql | 4 +- .../5073-hs-office-sepamandate-rbac.sql | 4 +- .../5103-hs-office-membership-rbac.sql | 4 +- .../5113-hs-office-coopshares-rbac.sql | 4 +- .../5123-hs-office-coopassets-rbac.sql | 4 +- .../hsadminng/arch/ArchitectureTest.java | 5 +- ...esponseEntityExceptionHandlerUnitTest.java | 21 +- ...sHostingAssetControllerAcceptanceTest.java | 12 +- .../HsHostingAssetControllerRestTest.java | 6 +- .../HsHostingAssetEntityPatcherUnitTest.java | 12 +- .../hsadminng/hs/migration/CsvDataImport.java | 16 +- ...ity.java => HsHostingAssetRealEntity.java} | 14 +- .../hs/migration/ImportHostingAssets.java | 213 +++++++++--------- .../hs/migration/ImportOfficeData.java | 40 ++-- ...HsOfficeBankAccountControllerRestTest.java | 4 +- ...OfficeContactControllerAcceptanceTest.java | 8 +- ...va => HsOfficeContactPatcherUnitTest.java} | 18 +- ...ContactRbacRepositoryIntegrationTest.java} | 26 +-- .../HsOfficeContactRbacTestEntity.java | 16 ++ .../HsOfficeContactRealTestEntity.java | 16 ++ ...Test.java => HsOfficeContactUnitTest.java} | 6 +- .../office/contact/TestHsOfficeContact.java | 16 -- ...opAssetsTransactionControllerRestTest.java | 2 +- ...opSharesTransactionControllerRestTest.java | 2 +- ...OfficeDebitorControllerAcceptanceTest.java | 29 ++- .../HsOfficeDebitorEntityPatcherUnitTest.java | 18 +- .../HsOfficeDebitorEntityUnitTest.java | 8 +- ...fficeDebitorRepositoryIntegrationTest.java | 29 +-- .../office/debitor/TestHsOfficeDebitor.java | 8 +- .../HsOfficeMembershipControllerRestTest.java | 5 +- ...OfficePartnerControllerAcceptanceTest.java | 34 +-- .../HsOfficePartnerControllerRestTest.java | 18 +- ...cePartnerDetailsEntityPatcherUnitTest.java | 6 +- .../HsOfficePartnerEntityPatcherUnitTest.java | 17 +- .../HsOfficePartnerEntityUnitTest.java | 8 +- ...fficePartnerRepositoryIntegrationTest.java | 23 +- .../office/partner/TestHsOfficePartner.java | 8 +- ...fficeRelationControllerAcceptanceTest.java | 44 ++-- ...a => HsOfficeRelationPatcherUnitTest.java} | 26 +-- ...ficeRelationRepositoryIntegrationTest.java | 86 +++---- ...est.java => HsOfficeRelationUnitTest.java} | 6 +- ...ceSepaMandateControllerAcceptanceTest.java | 4 +- .../test/ContextBasedTestWithCleanup.java | 12 +- .../hsadminng/rbac/test/EntityList.java | 4 +- .../hsadminng/rbac/test/MapperUnitTest.java | 8 +- .../rbac/test/PatchUnitTestBase.java | 4 +- .../TestCustomerControllerAcceptanceTest.java | 6 +- 106 files changed, 1244 insertions(+), 941 deletions(-) create mode 100644 .run/ImportHostingAssets.run.xml create mode 100644 .run/ImportOfficeData.run.xml create mode 100644 .run/README.txt create mode 100644 src/main/java/net/hostsharing/hsadminng/errors/DisplayAs.java delete mode 100644 src/main/java/net/hostsharing/hsadminng/errors/DisplayName.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContact.java delete mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacEntity.java rename src/main/java/net/hostsharing/hsadminng/hs/office/contact/{HsOfficeContactRepository.java => HsOfficeContactRbacRepository.java} (54%) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealRepository.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelation.java delete mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacEntity.java rename src/main/java/net/hostsharing/hsadminng/hs/office/relation/{HsOfficeRelationRepository.java => HsOfficeRelationRbacRepository.java} (60%) create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealEntity.java create mode 100644 src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealRepository.java rename src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/{RbacObject.java => BaseEntity.java} (64%) rename src/test/java/net/hostsharing/hsadminng/hs/migration/{HsHostingAssetRawEntity.java => HsHostingAssetRealEntity.java} (89%) rename src/test/java/net/hostsharing/hsadminng/hs/office/contact/{HsOfficeContactEntityPatcherUnitTest.java => HsOfficeContactPatcherUnitTest.java} (87%) rename src/test/java/net/hostsharing/hsadminng/hs/office/contact/{HsOfficeContactRepositoryIntegrationTest.java => HsOfficeContactRbacRepositoryIntegrationTest.java} (92%) create mode 100644 src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacTestEntity.java create mode 100644 src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealTestEntity.java rename src/test/java/net/hostsharing/hsadminng/hs/office/contact/{HsOfficeContactEntityUnitTest.java => HsOfficeContactUnitTest.java} (67%) delete mode 100644 src/test/java/net/hostsharing/hsadminng/hs/office/contact/TestHsOfficeContact.java rename src/test/java/net/hostsharing/hsadminng/hs/office/relation/{HsOfficeRelationEntityPatcherUnitTest.java => HsOfficeRelationPatcherUnitTest.java} (76%) rename src/test/java/net/hostsharing/hsadminng/hs/office/relation/{HsOfficeRelationEntityUnitTest.java => HsOfficeRelationUnitTest.java} (90%) diff --git a/.run/ImportHostingAssets.run.xml b/.run/ImportHostingAssets.run.xml new file mode 100644 index 00000000..bedd7143 --- /dev/null +++ b/.run/ImportHostingAssets.run.xml @@ -0,0 +1,36 @@ + + + + + + + + false + true + + + + false + true + + + \ No newline at end of file diff --git a/.run/ImportOfficeData.run.xml b/.run/ImportOfficeData.run.xml new file mode 100644 index 00000000..92ce7bd5 --- /dev/null +++ b/.run/ImportOfficeData.run.xml @@ -0,0 +1,36 @@ + + + + + + + + false + true + + + + false + true + + + diff --git a/.run/README.txt b/.run/README.txt new file mode 100644 index 00000000..96094ded --- /dev/null +++ b/.run/README.txt @@ -0,0 +1 @@ +Stored run-Configurations for IntelliJ IDEA. diff --git a/doc/rbac-performance-analysis.md b/doc/rbac-performance-analysis.md index 43f47ec6..3e43a090 100644 --- a/doc/rbac-performance-analysis.md +++ b/doc/rbac-performance-analysis.md @@ -121,8 +121,8 @@ WITH statements AS ( SELECT * FROM pg_stat_statements pss ) SELECT calls, - total_exec_time::int/(60*1000) as total_exec_time_mins, - mean_exec_time::int as mean_exec_time_millis, + total_exec_time::int/(60*1000) as total_mins, + mean_exec_time::int as mean_millis, query FROM statements WHERE calls > 100 AND shared_blks_hit > 0 diff --git a/src/main/java/net/hostsharing/hsadminng/errors/CustomErrorResponse.java b/src/main/java/net/hostsharing/hsadminng/errors/CustomErrorResponse.java index 9b182137..3df51ebb 100644 --- a/src/main/java/net/hostsharing/hsadminng/errors/CustomErrorResponse.java +++ b/src/main/java/net/hostsharing/hsadminng/errors/CustomErrorResponse.java @@ -46,6 +46,6 @@ public class CustomErrorResponse { this.path = path; this.statusCode = status.value(); this.statusPhrase = status.getReasonPhrase(); - this.message = message; + this.message = message.startsWith("ERROR: [") ? message : "ERROR: [" + statusCode + "] " + message; } } diff --git a/src/main/java/net/hostsharing/hsadminng/errors/DisplayAs.java b/src/main/java/net/hostsharing/hsadminng/errors/DisplayAs.java new file mode 100644 index 00000000..020d006a --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/errors/DisplayAs.java @@ -0,0 +1,24 @@ +package net.hostsharing.hsadminng.errors; + +import jakarta.validation.constraints.NotNull; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface DisplayAs { + class DisplayName { + public static String of(final Class clazz) { + final var displayNameAnnot = clazz.getAnnotation(DisplayAs.class); + return displayNameAnnot != null ? displayNameAnnot.value() : clazz.getSimpleName(); + } + + public static String of(@NotNull final Object instance) { + return of(instance.getClass()); + } + } + + String value() default ""; +} diff --git a/src/main/java/net/hostsharing/hsadminng/errors/DisplayName.java b/src/main/java/net/hostsharing/hsadminng/errors/DisplayName.java deleted file mode 100644 index 8c5eed4c..00000000 --- a/src/main/java/net/hostsharing/hsadminng/errors/DisplayName.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.hostsharing.hsadminng.errors; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface DisplayName { - String value() default ""; -} diff --git a/src/main/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandler.java b/src/main/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandler.java index d4d6e8bf..c366d7bc 100644 --- a/src/main/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandler.java +++ b/src/main/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandler.java @@ -152,8 +152,8 @@ public class RestResponseEntityExceptionHandler final var entityName = matcher.group(1); final var entityClass = resolveClass(entityName); if (entityClass.isPresent()) { - return (entityClass.get().isAnnotationPresent(DisplayName.class) - ? exceptionMessage.replace(entityName, entityClass.get().getAnnotation(DisplayName.class).value()) + return (entityClass.get().isAnnotationPresent(DisplayAs.class) + ? exceptionMessage.replace(entityName, entityClass.get().getAnnotation(DisplayAs.class).value()) : exceptionMessage.replace(entityName, entityClass.get().getSimpleName())) .replace(" with id ", " with uuid "); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/debitor/HsBookingDebitorEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/debitor/HsBookingDebitorEntity.java index 052370f0..6a288a44 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/debitor/HsBookingDebitorEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/debitor/HsBookingDebitorEntity.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -23,7 +23,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @NoArgsConstructor @AllArgsConstructor -@DisplayName("BookingDebitor") +@DisplayAs("BookingDebitor") public class HsBookingDebitorEntity implements Stringifyable { public static final String DEBITOR_NUMBER_TAG = "D-"; diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java index a9a9c879..a7b9db66 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java @@ -15,7 +15,7 @@ import net.hostsharing.hsadminng.hs.validation.PropertiesProvider; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; import org.hibernate.annotations.Type; @@ -71,7 +71,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Setter @NoArgsConstructor @AllArgsConstructor -public class HsBookingItemEntity implements Stringifyable, RbacObject, PropertiesProvider { +public class HsBookingItemEntity implements Stringifyable, BaseEntity, PropertiesProvider { private static Stringify stringify = stringify(HsBookingItemEntity.class) .withProp(HsBookingItemEntity::getProject) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java index 8f5d1397..c44d43f5 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/project/HsBookingProjectEntity.java @@ -3,10 +3,10 @@ package net.hostsharing.hsadminng.hs.booking.project; import lombok.*; import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRbacEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -34,7 +34,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Setter @NoArgsConstructor @AllArgsConstructor -public class HsBookingProjectEntity implements Stringifyable, RbacObject { +public class HsBookingProjectEntity implements Stringifyable, BaseEntity { private static Stringify stringify = stringify(HsBookingProjectEntity.class) .withProp(HsBookingProjectEntity::getDebitor) @@ -81,7 +81,7 @@ public class HsBookingProjectEntity implements Stringifyable, RbacObject, PropertiesProvider { +public interface HsHostingAsset extends Stringifyable, BaseEntity, PropertiesProvider { Stringify stringify = stringify(HsHostingAsset.class) .withProp(HsHostingAsset::getType) @@ -36,7 +36,7 @@ public interface HsHostingAsset extends Stringifyable, RbacObject getSubHostingAssets(); String getCaption(); Map getConfig(); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java index ceb27238..4083ab36 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java @@ -8,7 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; @@ -54,7 +55,6 @@ import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.REFERRER; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.TENANT; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; -import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @Entity @@ -90,7 +90,7 @@ public class HsHostingAssetEntity implements HsHostingAsset { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "alarmcontactuuid") - private HsOfficeContactEntity alarmContact; + private HsOfficeContactRealEntity alarmContact; @OneToMany(cascade = CascadeType.REFRESH, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "parentassetuuid", referencedColumnName = "uuid") @@ -160,7 +160,7 @@ public class HsHostingAssetEntity implements HsHostingAsset { directlyFetchedByDependsOnColumn(), NULLABLE) - .importEntityAlias("alarmContact", HsOfficeContactEntity.class, usingDefaultCase(), + .importEntityAlias("alarmContact", HsOfficeContactRbacEntity.class, usingDefaultCase(), dependsOnColumn("alarmContactUuid"), directlyFetchedByDependsOnColumn(), NULLABLE) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java index f1cff713..856b4243 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset; import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.model.HsHostingAssetPatchResource; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.mapper.EntityPatcher; import net.hostsharing.hsadminng.mapper.KeyValueMap; import net.hostsharing.hsadminng.mapper.OptionalFromJson; @@ -29,7 +29,7 @@ public class HsHostingAssetEntityPatcher implements EntityPatcher entity.setAlarmContact( Optional.ofNullable(newValue) - .map(uuid -> em.getReference(HsOfficeContactEntity.class, newValue)) + .map(uuid -> em.getReference(HsOfficeContactRealEntity.class, newValue)) .orElse(null))); } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java index b6747ff8..472502f6 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HostingAssetEntityValidator.java @@ -5,7 +5,7 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import net.hostsharing.hsadminng.hs.validation.ValidatableProperty; @@ -213,7 +213,7 @@ public abstract class HostingAssetEntityValidator extends HsEntityValidator> { + static class AlarmContact extends ReferenceValidator> { AlarmContact(final HsHostingAssetType.RelationPolicy policy) { super(policy, HsHostingAsset::getAlarmContact); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountEntity.java index 0e9ca079..94fe2b16 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountEntity.java @@ -2,8 +2,8 @@ package net.hostsharing.hsadminng.hs.office.bankaccount; import lombok.*; import lombok.experimental.FieldNameConstants; -import net.hostsharing.hsadminng.errors.DisplayName; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.errors.DisplayAs; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -26,8 +26,8 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @NoArgsConstructor @AllArgsConstructor @FieldNameConstants -@DisplayName("BankAccount") -public class HsOfficeBankAccountEntity implements RbacObject, Stringifyable { +@DisplayAs("BankAccount") +public class HsOfficeBankAccountEntity implements BaseEntity, Stringifyable { private static Stringify toString = stringify(HsOfficeBankAccountEntity.class, "bankAccount") .withIdProp(HsOfficeBankAccountEntity::getIban) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContact.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContact.java new file mode 100644 index 00000000..9450e331 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContact.java @@ -0,0 +1,106 @@ +package net.hostsharing.hsadminng.hs.office.contact; + +import io.hypersistence.utils.hibernate.type.json.JsonType; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.FieldNameConstants; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.errors.DisplayAs; +import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; +import net.hostsharing.hsadminng.stringify.Stringify; +import net.hostsharing.hsadminng.stringify.Stringifyable; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; + +import jakarta.persistence.Column; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.Transient; +import jakarta.persistence.Version; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static net.hostsharing.hsadminng.stringify.Stringify.stringify; + +@MappedSuperclass +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@SuperBuilder(toBuilder = true) +@FieldNameConstants +@DisplayAs("Contact") +public class HsOfficeContact implements Stringifyable, BaseEntity { + + private static Stringify toString = stringify(HsOfficeContact.class, "contact") + .withProp(Fields.caption, HsOfficeContact::getCaption) + .withProp(Fields.emailAddresses, HsOfficeContact::getEmailAddresses); + + @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + private UUID uuid; + + @Version + private int version; + + @Column(name = "caption") + private String caption; + + @Column(name = "postaladdress") + private String postalAddress; // multiline free-format text + + @Builder.Default + @Setter(AccessLevel.NONE) + @Type(JsonType.class) + @Column(name = "emailaddresses") + private Map emailAddresses = new HashMap<>(); + + @Transient + private PatchableMapWrapper emailAddressesWrapper; + + @Builder.Default + @Setter(AccessLevel.NONE) + @Type(JsonType.class) + @Column(name = "phonenumbers") + private Map phoneNumbers = new HashMap<>(); + + @Transient + private PatchableMapWrapper phoneNumbersWrapper; + + public PatchableMapWrapper getEmailAddresses() { + return PatchableMapWrapper.of( + emailAddressesWrapper, + (newWrapper) -> {emailAddressesWrapper = newWrapper;}, + emailAddresses); + } + + public void putEmailAddresses(Map newEmailAddresses) { + getEmailAddresses().assign(newEmailAddresses); + } + + public PatchableMapWrapper getPhoneNumbers() { + return PatchableMapWrapper.of(phoneNumbersWrapper, (newWrapper) -> {phoneNumbersWrapper = newWrapper;}, phoneNumbers); + } + + public void putPhoneNumbers(Map newPhoneNumbers) { + getPhoneNumbers().assign(newPhoneNumbers); + } + + @Override + public String toString() { + return toString.apply(this); + } + + @Override + public String toShortString() { + return caption; + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactController.java index 83f182a3..cee7e28a 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactController.java @@ -29,7 +29,7 @@ public class HsOfficeContactController implements HsOfficeContactsApi { private Mapper mapper; @Autowired - private HsOfficeContactRepository contactRepo; + private HsOfficeContactRbacRepository contactRepo; @Override @Transactional(readOnly = true) @@ -54,7 +54,7 @@ public class HsOfficeContactController implements HsOfficeContactsApi { context.define(currentUser, assumedRoles); - final var entityToSave = mapper.map(body, HsOfficeContactEntity.class, RESOURCE_TO_ENTITY_POSTMAPPER); + final var entityToSave = mapper.map(body, HsOfficeContactRbacEntity.class, RESOURCE_TO_ENTITY_POSTMAPPER); final var saved = contactRepo.save(entityToSave); @@ -119,7 +119,7 @@ public class HsOfficeContactController implements HsOfficeContactsApi { } @SuppressWarnings("unchecked") - final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { + final BiConsumer RESOURCE_TO_ENTITY_POSTMAPPER = (resource, entity) -> { entity.putEmailAddresses(from(resource.getEmailAddresses())); entity.putPhoneNumbers(from(resource.getPhoneNumbers())); }; diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java deleted file mode 100644 index 3bcaf140..00000000 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java +++ /dev/null @@ -1,123 +0,0 @@ -package net.hostsharing.hsadminng.hs.office.contact; - -import io.hypersistence.utils.hibernate.type.json.JsonType; -import lombok.*; -import lombok.experimental.FieldNameConstants; -import net.hostsharing.hsadminng.errors.DisplayName; -import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; -import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; -import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; -import net.hostsharing.hsadminng.stringify.Stringify; -import net.hostsharing.hsadminng.stringify.Stringifyable; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; - -import jakarta.persistence.*; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.GLOBAL; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.*; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.RbacUserReference.UserRole.CREATOR; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.*; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; -import static net.hostsharing.hsadminng.stringify.Stringify.stringify; - -@Entity -@Table(name = "hs_office_contact_rv") -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@FieldNameConstants -@DisplayName("Contact") -public class HsOfficeContactEntity implements Stringifyable, RbacObject { - - private static Stringify toString = stringify(HsOfficeContactEntity.class, "contact") - .withProp(Fields.caption, HsOfficeContactEntity::getCaption) - .withProp(Fields.emailAddresses, HsOfficeContactEntity::getEmailAddresses); - - @Id - @GeneratedValue(generator = "UUID") - @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") - private UUID uuid; - - @Version - private int version; - - @Column(name = "caption") - private String caption; - - @Column(name = "postaladdress") - private String postalAddress; // multiline free-format text - - @Builder.Default - @Setter(AccessLevel.NONE) - @Type(JsonType.class) - @Column(name = "emailaddresses") - private Map emailAddresses = new HashMap<>(); - - @Transient - private PatchableMapWrapper emailAddressesWrapper; - - @Builder.Default - @Setter(AccessLevel.NONE) - @Type(JsonType.class) - @Column(name = "phonenumbers") - private Map phoneNumbers = new HashMap<>(); - - @Transient - private PatchableMapWrapper phoneNumbersWrapper; - - public PatchableMapWrapper getEmailAddresses() { - return PatchableMapWrapper.of(emailAddressesWrapper, (newWrapper) -> {emailAddressesWrapper = newWrapper; }, emailAddresses ); - } - - public void putEmailAddresses(Map newEmailAddresses) { - getEmailAddresses().assign(newEmailAddresses); - } - - public PatchableMapWrapper getPhoneNumbers() { - return PatchableMapWrapper.of(phoneNumbersWrapper, (newWrapper) -> {phoneNumbersWrapper = newWrapper; }, phoneNumbers ); - } - - public void putPhoneNumbers(Map newPhoneNumbers) { - getPhoneNumbers().assign(newPhoneNumbers); - } - - @Override - public String toString() { - return toString.apply(this); - } - - @Override - public String toShortString() { - return caption; - } - - public static RbacView rbac() { - return rbacViewFor("contact", HsOfficeContactEntity.class) - .withIdentityView(SQL.projection("caption")) - .withUpdatableColumns("caption", "postalAddress", "emailAddresses", "phoneNumbers") - .createRole(OWNER, (with) -> { - with.owningUser(CREATOR); - with.incomingSuperRole(GLOBAL, ADMIN); - with.permission(DELETE); - }) - .createSubRole(ADMIN, (with) -> { - with.permission(UPDATE); - }) - .createSubRole(REFERRER, (with) -> { - with.permission(SELECT); - }) - .toRole(GLOBAL, GUEST).grantPermission(INSERT); - } - - public static void main(String[] args) throws IOException { - rbac().generateWithBaseFileName("5-hs-office/501-contact/5013-hs-office-contact-rbac"); - } -} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcher.java index ddc4f982..e08e6bae 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcher.java @@ -9,9 +9,9 @@ import java.util.Optional; class HsOfficeContactEntityPatcher implements EntityPatcher { - private final HsOfficeContactEntity entity; + private final HsOfficeContactRbacEntity entity; - HsOfficeContactEntityPatcher(final HsOfficeContactEntity entity) { + HsOfficeContactEntityPatcher(final HsOfficeContactRbacEntity entity) { this.entity = entity; } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacEntity.java new file mode 100644 index 00000000..c4e934cc --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacEntity.java @@ -0,0 +1,48 @@ +package net.hostsharing.hsadminng.hs.office.contact; + +import lombok.*; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.errors.DisplayAs; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; + +import jakarta.persistence.*; +import java.io.IOException; + +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.GLOBAL; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.*; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.RbacUserReference.UserRole.CREATOR; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.*; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; + +@Entity +@Table(name = "hs_office_contact_rv") +@Getter +@Setter +@NoArgsConstructor +@SuperBuilder(toBuilder = true) +@DisplayAs("RbacContact") +public class HsOfficeContactRbacEntity extends HsOfficeContact { + + public static RbacView rbac() { + return rbacViewFor("contact", HsOfficeContactRbacEntity.class) + .withIdentityView(SQL.projection("caption")) + .withUpdatableColumns("caption", "postalAddress", "emailAddresses", "phoneNumbers") + .createRole(OWNER, (with) -> { + with.owningUser(CREATOR); + with.incomingSuperRole(GLOBAL, ADMIN); + with.permission(DELETE); + }) + .createSubRole(ADMIN, (with) -> { + with.permission(UPDATE); + }) + .createSubRole(REFERRER, (with) -> { + with.permission(SELECT); + }) + .toRole(GLOBAL, GUEST).grantPermission(INSERT); + } + + public static void main(String[] args) throws IOException { + rbac().generateWithBaseFileName("5-hs-office/501-contact/5013-hs-office-contact-rbac"); + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacRepository.java similarity index 54% rename from src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRepository.java rename to src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacRepository.java index 22a285ab..e893bced 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacRepository.java @@ -7,18 +7,18 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -public interface HsOfficeContactRepository extends Repository { +public interface HsOfficeContactRbacRepository extends Repository { - Optional findByUuid(UUID id); + Optional findByUuid(UUID id); @Query(""" - SELECT c FROM HsOfficeContactEntity c + SELECT c FROM HsOfficeContactRbacEntity c WHERE :caption is null OR c.caption like concat(cast(:caption as text), '%') """) - List findContactByOptionalCaptionLike(String caption); + List findContactByOptionalCaptionLike(String caption); - HsOfficeContactEntity save(final HsOfficeContactEntity entity); + HsOfficeContactRbacEntity save(final HsOfficeContactRbacEntity entity); int deleteByUuid(final UUID uuid); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealEntity.java new file mode 100644 index 00000000..44f72d99 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealEntity.java @@ -0,0 +1,21 @@ +package net.hostsharing.hsadminng.hs.office.contact; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.errors.DisplayAs; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + +@Entity +@Table(name = "hs_office_contact") +@Getter +@Setter +@NoArgsConstructor +@SuperBuilder(toBuilder = true) +@DisplayAs("RealContact") +public class HsOfficeContactRealEntity extends HsOfficeContact { + +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealRepository.java new file mode 100644 index 00000000..b4099422 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealRepository.java @@ -0,0 +1,26 @@ +package net.hostsharing.hsadminng.hs.office.contact; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsOfficeContactRealRepository extends Repository { + + Optional findByUuid(UUID id); + + @Query(""" + SELECT c FROM HsOfficeContactRealEntity c + WHERE :caption is null + OR c.caption like concat(cast(:caption as text), '%') + """) + List findContactByOptionalCaptionLike(String caption); + + HsOfficeContactRealEntity save(final HsOfficeContactRealEntity entity); + + int deleteByUuid(final UUID uuid); + + long count(); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionEntity.java index 35e0bda9..49487cd8 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionEntity.java @@ -6,9 +6,9 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import net.hostsharing.hsadminng.hs.office.membership.HsOfficeMembershipEntity; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -40,8 +40,8 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @NoArgsConstructor @AllArgsConstructor -@DisplayName("CoopAssetsTransaction") -public class HsOfficeCoopAssetsTransactionEntity implements Stringifyable, RbacObject { +@DisplayAs("CoopAssetsTransaction") +public class HsOfficeCoopAssetsTransactionEntity implements Stringifyable, BaseEntity { private static Stringify stringify = stringify(HsOfficeCoopAssetsTransactionEntity.class) .withIdProp(HsOfficeCoopAssetsTransactionEntity::getTaggedMemberNumber) @@ -107,7 +107,7 @@ public class HsOfficeCoopAssetsTransactionEntity implements Stringifyable, RbacO @Override public HsOfficeCoopAssetsTransactionEntity load() { - RbacObject.super.load(); + BaseEntity.super.load(); membership.load(); return this; } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionEntity.java index cbab7e4f..aa650bd5 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionEntity.java @@ -5,10 +5,10 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import net.hostsharing.hsadminng.hs.office.membership.HsOfficeMembershipEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -38,8 +38,8 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @NoArgsConstructor @AllArgsConstructor -@DisplayName("CoopShareTransaction") -public class HsOfficeCoopSharesTransactionEntity implements Stringifyable, RbacObject { +@DisplayAs("CoopShareTransaction") +public class HsOfficeCoopSharesTransactionEntity implements Stringifyable, BaseEntity { private static Stringify stringify = stringify(HsOfficeCoopSharesTransactionEntity.class) .withIdProp(HsOfficeCoopSharesTransactionEntity::getMemberNumberTagged) @@ -104,7 +104,7 @@ public class HsOfficeCoopSharesTransactionEntity implements Stringifyable, RbacO @Override public HsOfficeCoopSharesTransactionEntity load() { - RbacObject.super.load(); + BaseEntity.super.load(); membership.load(); return this; } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorController.java index 5455b99b..73fe78af 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorController.java @@ -5,9 +5,10 @@ import net.hostsharing.hsadminng.hs.office.generated.api.v1.api.HsOfficeDebitors import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeDebitorInsertResource; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeDebitorPatchResource; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeDebitorResource; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRepository; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealRepository; import net.hostsharing.hsadminng.mapper.Mapper; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import org.apache.commons.lang3.Validate; import org.hibernate.Hibernate; import org.springframework.beans.factory.annotation.Autowired; @@ -17,11 +18,12 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.PersistenceContext; +import jakarta.validation.ValidationException; import java.util.List; import java.util.UUID; +import static net.hostsharing.hsadminng.errors.DisplayAs.DisplayName; import static net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType.DEBITOR; @RestController @@ -38,7 +40,7 @@ public class HsOfficeDebitorController implements HsOfficeDebitorsApi { private HsOfficeDebitorRepository debitorRepo; @Autowired - private HsOfficeRelationRepository relRepo; + private HsOfficeRelationRealRepository relrealRepo; @PersistenceContext private EntityManager em; @@ -82,13 +84,16 @@ public class HsOfficeDebitorController implements HsOfficeDebitorsApi { final var entityToSave = mapper.map(body, HsOfficeDebitorEntity.class); if ( body.getDebitorRel() != null ) { body.getDebitorRel().setType(DEBITOR.name()); - final var debitorRel = mapper.map(body.getDebitorRel(), HsOfficeRelationEntity.class); - entityToSave.setDebitorRel(relRepo.save(debitorRel)); + final var debitorRel = mapper.map(body.getDebitorRel(), HsOfficeRelationRealEntity.class); + validateEntityExists("debitorRel.anchorUuid", debitorRel.getAnchor()); + validateEntityExists("debitorRel.holderUuid", debitorRel.getHolder()); + validateEntityExists("debitorRel.contactUuid", debitorRel.getContact()); + entityToSave.setDebitorRel(relrealRepo.save(debitorRel)); } else { - final var debitorRelOptional = relRepo.findByUuid(body.getDebitorRelUuid()); + final var debitorRelOptional = relrealRepo.findByUuid(body.getDebitorRelUuid()); debitorRelOptional.ifPresentOrElse( - debitorRel -> {entityToSave.setDebitorRel(relRepo.save(debitorRel));}, - () -> { throw new EntityNotFoundException("ERROR: [400] debitorRelUuid not found: " + body.getDebitorRelUuid());}); + debitorRel -> {entityToSave.setDebitorRel(relrealRepo.save(debitorRel));}, + () -> { throw new ValidationException("Unable to find RealRelation by debitorRelUuid: " + body.getDebitorRelUuid());}); } final var savedEntity = debitorRepo.save(entityToSave); @@ -155,4 +160,15 @@ public class HsOfficeDebitorController implements HsOfficeDebitorsApi { final var mapped = mapper.map(saved, HsOfficeDebitorResource.class); return ResponseEntity.ok(mapped); } + + // TODO.impl: extract this to some generally usable class? + private > T validateEntityExists(final String property, final T entitySkeleton) { + final var foundEntity = em.find(entitySkeleton.getClass(), entitySkeleton.getUuid()); + if ( foundEntity == null) { + throw new ValidationException("Unable to find " + DisplayName.of(entitySkeleton) + " by " + property + ": " + entitySkeleton.getUuid()); + } + + //noinspection unchecked + return (T) foundEntity; + } } 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 04ebd03b..192f3f2e 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 @@ -5,11 +5,13 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountEntity; import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelation; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRbacEntity; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.stringify.Stringify; @@ -57,8 +59,8 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor -@DisplayName("Debitor") -public class HsOfficeDebitorEntity implements RbacObject, Stringifyable { +@DisplayAs("Debitor") +public class HsOfficeDebitorEntity implements BaseEntity, Stringifyable { public static final String DEBITOR_NUMBER_TAG = "D-"; public static final String TWO_DECIMAL_DIGITS = "^([0-9]{2})$"; @@ -66,7 +68,7 @@ public class HsOfficeDebitorEntity implements RbacObject, private static Stringify stringify = stringify(HsOfficeDebitorEntity.class, "debitor") .withIdProp(HsOfficeDebitorEntity::toShortString) - .withProp(e -> ofNullable(e.getDebitorRel()).map(HsOfficeRelationEntity::toShortString).orElse(null)) + .withProp(e -> ofNullable(e.getDebitorRel()).map(HsOfficeRelation::toShortString).orElse(null)) .withProp(HsOfficeDebitorEntity::getDefaultPrefix) .quotedValues(false); @@ -101,7 +103,7 @@ public class HsOfficeDebitorEntity implements RbacObject, @ManyToOne(cascade = { PERSIST, MERGE, REFRESH, DETACH }, optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "debitorreluuid", nullable = false) - private HsOfficeRelationEntity debitorRel; + private HsOfficeRelationRealEntity debitorRel; @Column(name = "billable", nullable = false) private Boolean billable; // not a primitive because otherwise the default would be false @@ -128,7 +130,7 @@ public class HsOfficeDebitorEntity implements RbacObject, @Override public HsOfficeDebitorEntity load() { - RbacObject.super.load(); + BaseEntity.super.load(); if (partner != null) { partner.load(); } @@ -188,7 +190,7 @@ public class HsOfficeDebitorEntity implements RbacObject, "defaultPrefix") .toRole("global", ADMIN).grantPermission(INSERT) - .importRootEntityAliasProxy("debitorRel", HsOfficeRelationEntity.class, usingCase(DEBITOR), + .importRootEntityAliasProxy("debitorRel", HsOfficeRelationRbacEntity.class, usingCase(DEBITOR), directlyFetchedByDependsOnColumn(), dependsOnColumn("debitorRelUuid")) .createPermission(DELETE).grantedTo("debitorRel", OWNER) @@ -202,7 +204,7 @@ public class HsOfficeDebitorEntity implements RbacObject, .toRole("refundBankAccount", ADMIN).grantRole("debitorRel", AGENT) .toRole("debitorRel", AGENT).grantRole("refundBankAccount", REFERRER) - .importEntityAlias("partnerRel", HsOfficeRelationEntity.class, usingDefaultCase(), + .importEntityAlias("partnerRel", HsOfficeRelationRbacEntity.class, usingDefaultCase(), dependsOnColumn("debitorRelUuid"), fetchedBySql(""" SELECT ${columns} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcher.java index cd50abf8..d8d67943 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcher.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.office.debitor; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountEntity; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeDebitorPatchResource; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.mapper.EntityPatcher; import net.hostsharing.hsadminng.mapper.OptionalFromJson; @@ -25,7 +25,7 @@ class HsOfficeDebitorEntityPatcher implements EntityPatcher { verifyNotNull(newValue, "debitorRel"); - entity.setDebitorRel(em.getReference(HsOfficeRelationEntity.class, newValue)); + entity.setDebitorRel(em.getReference(HsOfficeRelationRealEntity.class, newValue)); }); Optional.ofNullable(resource.getBillable()).ifPresent(entity::setBillable); OptionalFromJson.of(resource.getVatId()).ifPresent(entity::setVatId); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepository.java index 1e0b8f60..bb6cd0f2 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepository.java @@ -33,7 +33,7 @@ public interface HsOfficeDebitorRepository extends Repository, Stringifyable { +@DisplayAs("Membership") +public class HsOfficeMembershipEntity implements BaseEntity, Stringifyable { public static final String MEMBER_NUMBER_TAG = "M-"; public static final String TWO_DECIMAL_DIGITS = "^([0-9]{2})$"; @@ -102,7 +102,7 @@ public class HsOfficeMembershipEntity implements RbacObject E ref(final Class entityClass, final UUID uuid) { + private E ref(final Class entityClass, final UUID uuid) { try { return em.getReference(entityClass, uuid); } catch (final Throwable exc) { diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntity.java index 4935f591..1ef8cb8f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntity.java @@ -1,8 +1,8 @@ package net.hostsharing.hsadminng.hs.office.partner; import lombok.*; -import net.hostsharing.hsadminng.errors.DisplayName; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.errors.DisplayAs; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.stringify.Stringify; @@ -25,8 +25,8 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @NoArgsConstructor @AllArgsConstructor -@DisplayName("PartnerDetails") -public class HsOfficePartnerDetailsEntity implements RbacObject, Stringifyable { +@DisplayAs("PartnerDetails") +public class HsOfficePartnerDetailsEntity implements BaseEntity, Stringifyable { private static Stringify stringify = stringify( HsOfficePartnerDetailsEntity.class, diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java index 2ec637be..5e199d0c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java @@ -5,11 +5,13 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.errors.DisplayName; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.errors.DisplayAs; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContact; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRbacEntity; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelation; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.stringify.Stringify; @@ -39,20 +41,20 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @NoArgsConstructor @AllArgsConstructor -@DisplayName("Partner") -public class HsOfficePartnerEntity implements Stringifyable, RbacObject { +@DisplayAs("Partner") +public class HsOfficePartnerEntity implements Stringifyable, BaseEntity { public static final String PARTNER_NUMBER_TAG = "P-"; private static Stringify stringify = stringify(HsOfficePartnerEntity.class, "partner") .withIdProp(HsOfficePartnerEntity::toShortString) .withProp(p -> ofNullable(p.getPartnerRel()) - .map(HsOfficeRelationEntity::getHolder) + .map(HsOfficeRelation::getHolder) .map(HsOfficePersonEntity::toShortString) .orElse(null)) .withProp(p -> ofNullable(p.getPartnerRel()) - .map(HsOfficeRelationEntity::getContact) - .map(HsOfficeContactEntity::toShortString) + .map(HsOfficeRelation::getContact) + .map(HsOfficeContact::toShortString) .orElse(null)) .quotedValues(false); @@ -68,7 +70,7 @@ public class HsOfficePartnerEntity implements Stringifyable, RbacObject { verifyNotNull(newValue, "partnerRel"); - entity.setPartnerRel(em.getReference(HsOfficeRelationEntity.class, newValue)); + entity.setPartnerRel(em.getReference(HsOfficeRelationRealEntity.class, newValue)); }); new HsOfficePartnerDetailsEntityPatcher(em, entity.getDetails()).apply(resource.getDetails()); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepository.java index 2ae260bd..2c5913a5 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepository.java @@ -15,8 +15,8 @@ public interface HsOfficePartnerRepository extends Repository, Stringifyable { +@DisplayAs("Person") +public class HsOfficePersonEntity implements BaseEntity, Stringifyable { private static Stringify toString = stringify(HsOfficePersonEntity.class, "person") .withProp(Fields.personType, HsOfficePersonEntity::getPersonType) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelation.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelation.java new file mode 100644 index 00000000..c0f13f56 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelation.java @@ -0,0 +1,83 @@ +package net.hostsharing.hsadminng.hs.office.relation; + +import lombok.*; +import lombok.experimental.FieldNameConstants; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; +import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; +import net.hostsharing.hsadminng.stringify.Stringify; +import net.hostsharing.hsadminng.stringify.Stringifyable; + +import jakarta.persistence.*; +import jakarta.persistence.Column; +import java.util.UUID; + +import static net.hostsharing.hsadminng.stringify.Stringify.stringify; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Setter +@SuperBuilder(toBuilder = true) +@FieldNameConstants +public class HsOfficeRelation implements BaseEntity, Stringifyable { + + private static Stringify toString = stringify(HsOfficeRelation.class, "rel") + .withProp(Fields.anchor, HsOfficeRelation::getAnchor) + .withProp(Fields.type, HsOfficeRelation::getType) + .withProp(Fields.mark, HsOfficeRelation::getMark) + .withProp(Fields.holder, HsOfficeRelation::getHolder) + .withProp(Fields.contact, HsOfficeRelation::getContact); + + private static Stringify toShortString = stringify(HsOfficeRelation.class, "rel") + .withProp(Fields.anchor, HsOfficeRelation::getAnchor) + .withProp(Fields.type, HsOfficeRelation::getType) + .withProp(Fields.holder, HsOfficeRelation::getHolder); + + @Id + @GeneratedValue + private UUID uuid; + + @Version + private int version; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "anchoruuid") + private HsOfficePersonEntity anchor; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "holderuuid") + private HsOfficePersonEntity holder; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "contactuuid") + private HsOfficeContactRealEntity contact; + + @Column(name = "type") + @Enumerated(EnumType.STRING) + private HsOfficeRelationType type; + + @Column(name = "mark") + private String mark; + + @Override + public HsOfficeRelation load() { + BaseEntity.super.load(); + anchor.load(); + holder.load(); + contact.load(); + return this; + } + + @Override + public String toString() { + return toString.apply(this); + } + + @Override + public String toShortString() { + return toShortString.apply(this); + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationController.java index e1f80148..a3f4d136 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationController.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.office.relation; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.generated.api.v1.api.HsOfficeRelationsApi; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.*; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; @@ -31,13 +31,13 @@ public class HsOfficeRelationController implements HsOfficeRelationsApi { private Mapper mapper; @Autowired - private HsOfficeRelationRepository relationRepo; + private HsOfficeRelationRbacRepository relationRbacRepo; @Autowired private HsOfficePersonRepository holderRepo; @Autowired - private HsOfficeContactRepository contactRepo; + private HsOfficeContactRealRepository contactrealRepo; @PersistenceContext private EntityManager em; @@ -51,7 +51,7 @@ public class HsOfficeRelationController implements HsOfficeRelationsApi { final HsOfficeRelationTypeResource relationType) { context.define(currentUser, assumedRoles); - final var entities = relationRepo.findRelationRelatedToPersonUuidAndRelationType(personUuid, + final var entities = relationRbacRepo.findRelationRelatedToPersonUuidAndRelationType(personUuid, mapper.map(relationType, HsOfficeRelationType.class)); final var resources = mapper.mapList(entities, HsOfficeRelationResource.class, @@ -68,20 +68,20 @@ public class HsOfficeRelationController implements HsOfficeRelationsApi { context.define(currentUser, assumedRoles); - final var entityToSave = new HsOfficeRelationEntity(); + final var entityToSave = new HsOfficeRelationRbacEntity(); entityToSave.setType(HsOfficeRelationType.valueOf(body.getType())); entityToSave.setMark(body.getMark()); entityToSave.setAnchor(holderRepo.findByUuid(body.getAnchorUuid()).orElseThrow( - () -> new NoSuchElementException("cannot find anchorUuid " + body.getAnchorUuid()) + () -> new NoSuchElementException("cannot find Person by anchorUuid: " + body.getAnchorUuid()) )); entityToSave.setHolder(holderRepo.findByUuid(body.getHolderUuid()).orElseThrow( - () -> new NoSuchElementException("cannot find holderUuid " + body.getHolderUuid()) + () -> new NoSuchElementException("cannot find Person by holderUuid: " + body.getHolderUuid()) )); - entityToSave.setContact(contactRepo.findByUuid(body.getContactUuid()).orElseThrow( - () -> new NoSuchElementException("cannot find contactUuid " + body.getContactUuid()) + entityToSave.setContact(contactrealRepo.findByUuid(body.getContactUuid()).orElseThrow( + () -> new NoSuchElementException("cannot find Contact by contactUuid: " + body.getContactUuid()) )); - final var saved = relationRepo.save(entityToSave); + final var saved = relationRbacRepo.save(entityToSave); final var uri = MvcUriComponentsBuilder.fromController(getClass()) @@ -102,7 +102,7 @@ public class HsOfficeRelationController implements HsOfficeRelationsApi { context.define(currentUser, assumedRoles); - final var result = relationRepo.findByUuid(relationUuid); + final var result = relationRbacRepo.findByUuid(relationUuid); if (result.isEmpty()) { return ResponseEntity.notFound().build(); } @@ -117,7 +117,7 @@ public class HsOfficeRelationController implements HsOfficeRelationsApi { final UUID relationUuid) { context.define(currentUser, assumedRoles); - final var result = relationRepo.deleteByUuid(relationUuid); + final var result = relationRbacRepo.deleteByUuid(relationUuid); if (result == 0) { return ResponseEntity.notFound().build(); } @@ -135,17 +135,17 @@ public class HsOfficeRelationController implements HsOfficeRelationsApi { context.define(currentUser, assumedRoles); - final var current = relationRepo.findByUuid(relationUuid).orElseThrow(); + final var current = relationRbacRepo.findByUuid(relationUuid).orElseThrow(); new HsOfficeRelationEntityPatcher(em, current).apply(body); - final var saved = relationRepo.save(current); + final var saved = relationRbacRepo.save(current); final var mapped = mapper.map(saved, HsOfficeRelationResource.class); return ResponseEntity.ok(mapped); } - final BiConsumer RELATION_ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) -> { + final BiConsumer RELATION_ENTITY_TO_RESOURCE_POSTMAPPER = (entity, resource) -> { resource.setAnchor(mapper.map(entity.getAnchor(), HsOfficePersonResource.class)); resource.setHolder(mapper.map(entity.getHolder(), HsOfficePersonResource.class)); resource.setContact(mapper.map(entity.getContact(), HsOfficeContactResource.class)); 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 deleted file mode 100644 index e7ab353b..00000000 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntity.java +++ /dev/null @@ -1,174 +0,0 @@ -package net.hostsharing.hsadminng.hs.office.relation; - -import lombok.*; -import lombok.experimental.FieldNameConstants; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; -import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; -import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; -import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; -import net.hostsharing.hsadminng.stringify.Stringify; -import net.hostsharing.hsadminng.stringify.Stringifyable; - -import jakarta.persistence.*; -import jakarta.persistence.Column; -import java.io.IOException; -import java.util.UUID; - -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.*; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.CaseDef.inCaseOf; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.CaseDef.inOtherCases; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Column.dependsOnColumn; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.ColumnValue.usingDefaultCase; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Nullable.NOT_NULL; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.*; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.RbacUserReference.UserRole.CREATOR; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.*; -import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; -import static net.hostsharing.hsadminng.stringify.Stringify.stringify; - -@Entity -@Table(name = "hs_office_relation_rv") -@Getter -@Setter -@Builder(toBuilder = true) -@NoArgsConstructor -@AllArgsConstructor -@FieldNameConstants -public class HsOfficeRelationEntity implements RbacObject, Stringifyable { - - private static Stringify toString = stringify(HsOfficeRelationEntity.class, "rel") - .withProp(Fields.anchor, HsOfficeRelationEntity::getAnchor) - .withProp(Fields.type, HsOfficeRelationEntity::getType) - .withProp(Fields.mark, HsOfficeRelationEntity::getMark) - .withProp(Fields.holder, HsOfficeRelationEntity::getHolder) - .withProp(Fields.contact, HsOfficeRelationEntity::getContact); - - private static Stringify toShortString = stringify(HsOfficeRelationEntity.class, "rel") - .withProp(Fields.anchor, HsOfficeRelationEntity::getAnchor) - .withProp(Fields.type, HsOfficeRelationEntity::getType) - .withProp(Fields.holder, HsOfficeRelationEntity::getHolder); - - @Id - @GeneratedValue - private UUID uuid; - - @Version - private int version; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "anchoruuid") - private HsOfficePersonEntity anchor; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "holderuuid") - private HsOfficePersonEntity holder; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "contactuuid") - private HsOfficeContactEntity contact; - - @Column(name = "type") - @Enumerated(EnumType.STRING) - private HsOfficeRelationType type; - - @Column(name = "mark") - private String mark; - - @Override - public HsOfficeRelationEntity load() { - RbacObject.super.load(); - anchor.load(); - holder.load(); - contact.load(); - return this; - } - - @Override - public String toString() { - return toString.apply(this); - } - - @Override - public String toShortString() { - return toShortString.apply(this); - } - - public static RbacView rbac() { - return rbacViewFor("relation", HsOfficeRelationEntity.class) - .withIdentityView(SQL.projection(""" - (select idName from hs_office_person_iv p where p.uuid = anchorUuid) - || '-with-' || target.type || '-' - || (select idName from hs_office_person_iv p where p.uuid = holderUuid) - """)) - .withRestrictedViewOrderBy(SQL.expression( - "(select idName from hs_office_person_iv p where p.uuid = target.holderUuid)")) - .withUpdatableColumns("contactUuid") - .importEntityAlias("anchorPerson", HsOfficePersonEntity.class, usingDefaultCase(), - dependsOnColumn("anchorUuid"), - directlyFetchedByDependsOnColumn(), - NOT_NULL) - .importEntityAlias("holderPerson", HsOfficePersonEntity.class, usingDefaultCase(), - dependsOnColumn("holderUuid"), - directlyFetchedByDependsOnColumn(), - NOT_NULL) - .importEntityAlias("contact", HsOfficeContactEntity.class, usingDefaultCase(), - dependsOnColumn("contactUuid"), - directlyFetchedByDependsOnColumn(), - NOT_NULL) - .switchOnColumn("type", - inCaseOf("REPRESENTATIVE", then -> { - then.createRole(OWNER, (with) -> { - with.owningUser(CREATOR); - with.incomingSuperRole(GLOBAL, ADMIN); - with.incomingSuperRole("holderPerson", ADMIN); - with.permission(DELETE); - }) - .createSubRole(ADMIN, (with) -> { - with.outgoingSubRole("anchorPerson", OWNER); - with.permission(UPDATE); - }) - .createSubRole(AGENT, (with) -> { - with.incomingSuperRole("anchorPerson", ADMIN); - }) - .createSubRole(TENANT, (with) -> { - with.incomingSuperRole("contact", ADMIN); - with.outgoingSubRole("anchorPerson", REFERRER); - with.outgoingSubRole("holderPerson", REFERRER); - with.outgoingSubRole("contact", REFERRER); - with.permission(SELECT); - }); - }), - // inCaseOf("DEBITOR", then -> {}), TODO.spec: needs to be defined - inOtherCases(then -> { - then.createRole(OWNER, (with) -> { - with.owningUser(CREATOR); - with.incomingSuperRole(GLOBAL, ADMIN); - with.incomingSuperRole("anchorPerson", ADMIN); - with.permission(DELETE); - }) - .createSubRole(ADMIN, (with) -> { - with.permission(UPDATE); - }) - .createSubRole(AGENT, (with) -> { - // TODO.rbac: we need relation:PROXY, to allow changing the relation contact. - // the alternative would be to move this to the relation:ADMIN role, - // but then the partner holder person could update the partner relation itself, - // see partner entity. - with.incomingSuperRole("holderPerson", ADMIN); - }) - .createSubRole(TENANT, (with) -> { - with.incomingSuperRole("contact", ADMIN); - with.outgoingSubRole("anchorPerson", REFERRER); - with.outgoingSubRole("holderPerson", REFERRER); - with.outgoingSubRole("contact", REFERRER); - with.permission(SELECT); - }); - })) - .toRole("anchorPerson", ADMIN).grantPermission(INSERT); - } - - public static void main(String[] args) throws IOException { - rbac().generateWithBaseFileName("5-hs-office/503-relation/5033-hs-office-relation-rbac"); - } -} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcher.java index aeaae5ea..d9e6244a 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcher.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.office.relation; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeRelationPatchResource; import net.hostsharing.hsadminng.mapper.EntityPatcher; import net.hostsharing.hsadminng.mapper.OptionalFromJson; @@ -11,9 +11,9 @@ import java.util.UUID; class HsOfficeRelationEntityPatcher implements EntityPatcher { private final EntityManager em; - private final HsOfficeRelationEntity entity; + private final HsOfficeRelation entity; - HsOfficeRelationEntityPatcher(final EntityManager em, final HsOfficeRelationEntity entity) { + HsOfficeRelationEntityPatcher(final EntityManager em, final HsOfficeRelation entity) { this.em = em; this.entity = entity; } @@ -22,7 +22,7 @@ class HsOfficeRelationEntityPatcher implements EntityPatcher { verifyNotNull(newValue, "contact"); - entity.setContact(em.getReference(HsOfficeContactEntity.class, newValue)); + entity.setContact(em.getReference(HsOfficeContactRealEntity.class, newValue)); }); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacEntity.java new file mode 100644 index 00000000..f081404e --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacEntity.java @@ -0,0 +1,123 @@ +package net.hostsharing.hsadminng.hs.office.relation; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.errors.DisplayAs; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; +import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; +import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import java.io.IOException; + +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.CaseDef.inCaseOf; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.CaseDef.inOtherCases; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Column.dependsOnColumn; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.ColumnValue.usingDefaultCase; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.GLOBAL; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Nullable.NOT_NULL; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.DELETE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.INSERT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.SELECT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Permission.UPDATE; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.RbacUserReference.UserRole.CREATOR; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.ADMIN; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.AGENT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.OWNER; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.REFERRER; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.Role.TENANT; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL.directlyFetchedByDependsOnColumn; +import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; + +@Entity +@Table(name = "hs_office_relation_rv") +@NoArgsConstructor +@Getter +@Setter +@SuperBuilder(toBuilder = true) +@DisplayAs("RbacRelation") +public class HsOfficeRelationRbacEntity extends HsOfficeRelation { + + public static RbacView rbac() { + return rbacViewFor("relation", HsOfficeRelationRbacEntity.class) + .withIdentityView(SQL.projection(""" + (select idName from hs_office_person_iv p where p.uuid = anchorUuid) + || '-with-' || target.type || '-' + || (select idName from hs_office_person_iv p where p.uuid = holderUuid) + """)) + .withRestrictedViewOrderBy(SQL.expression( + "(select idName from hs_office_person_iv p where p.uuid = target.holderUuid)")) + .withUpdatableColumns("contactUuid") + .importEntityAlias("anchorPerson", HsOfficePersonEntity.class, usingDefaultCase(), + dependsOnColumn("anchorUuid"), + directlyFetchedByDependsOnColumn(), + NOT_NULL) + .importEntityAlias("holderPerson", HsOfficePersonEntity.class, usingDefaultCase(), + dependsOnColumn("holderUuid"), + directlyFetchedByDependsOnColumn(), + NOT_NULL) + .importEntityAlias("contact", HsOfficeContactRbacEntity.class, usingDefaultCase(), + dependsOnColumn("contactUuid"), + directlyFetchedByDependsOnColumn(), + NOT_NULL) + .switchOnColumn( + "type", + inCaseOf("REPRESENTATIVE", then -> { + then.createRole(OWNER, (with) -> { + with.owningUser(CREATOR); + with.incomingSuperRole(GLOBAL, ADMIN); + with.incomingSuperRole("holderPerson", ADMIN); + with.permission(DELETE); + }) + .createSubRole(ADMIN, (with) -> { + with.outgoingSubRole("anchorPerson", OWNER); + with.permission(UPDATE); + }) + .createSubRole(AGENT, (with) -> { + with.incomingSuperRole("anchorPerson", ADMIN); + }) + .createSubRole(TENANT, (with) -> { + with.incomingSuperRole("contact", ADMIN); + with.outgoingSubRole("anchorPerson", REFERRER); + with.outgoingSubRole("holderPerson", REFERRER); + with.outgoingSubRole("contact", REFERRER); + with.permission(SELECT); + }); + }), + // inCaseOf("DEBITOR", then -> {}), TODO.spec: needs to be defined + inOtherCases(then -> { + then.createRole(OWNER, (with) -> { + with.owningUser(CREATOR); + with.incomingSuperRole(GLOBAL, ADMIN); + with.incomingSuperRole("anchorPerson", ADMIN); + with.permission(DELETE); + }) + .createSubRole(ADMIN, (with) -> { + with.permission(UPDATE); + }) + .createSubRole(AGENT, (with) -> { + // TODO.rbac: we need relation:PROXY, to allow changing the relation contact. + // the alternative would be to move this to the relation:ADMIN role, + // but then the partner holder person could update the partner relation itself, + // see partner entity. + with.incomingSuperRole("holderPerson", ADMIN); + }) + .createSubRole(TENANT, (with) -> { + with.incomingSuperRole("contact", ADMIN); + with.outgoingSubRole("anchorPerson", REFERRER); + with.outgoingSubRole("holderPerson", REFERRER); + with.outgoingSubRole("contact", REFERRER); + with.permission(SELECT); + }); + })) + .toRole("anchorPerson", ADMIN).grantPermission(INSERT); + } + + public static void main(String[] args) throws IOException { + rbac().generateWithBaseFileName("5-hs-office/503-relation/5033-hs-office-relation-rbac"); + } +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacRepository.java similarity index 60% rename from src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepository.java rename to src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacRepository.java index 95bac3a2..e8187bb7 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRbacRepository.java @@ -8,11 +8,11 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -public interface HsOfficeRelationRepository extends Repository { +public interface HsOfficeRelationRbacRepository extends Repository { - Optional findByUuid(UUID id); + Optional findByUuid(UUID id); - default List findRelationRelatedToPersonUuidAndRelationType(@NotNull UUID personUuid, HsOfficeRelationType relationType) { + default List findRelationRelatedToPersonUuidAndRelationType(@NotNull UUID personUuid, HsOfficeRelationType relationType) { return findRelationRelatedToPersonUuidAndRelationTypeString(personUuid, relationType.toString()); } @@ -20,16 +20,16 @@ public interface HsOfficeRelationRepository extends Repository findRelationRelatedToPersonUuid(@NotNull UUID personUuid); + List findRelationRelatedToPersonUuid(@NotNull UUID personUuid); @Query(value = """ SELECT p.* FROM hs_office_relation_rv AS p WHERE (:relationType IS NULL OR p.type = cast(:relationType AS HsOfficeRelationType)) AND ( p.anchorUuid = :personUuid OR p.holderUuid = :personUuid) """, nativeQuery = true) - List findRelationRelatedToPersonUuidAndRelationTypeString(@NotNull UUID personUuid, String relationType); + List findRelationRelatedToPersonUuidAndRelationTypeString(@NotNull UUID personUuid, String relationType); - HsOfficeRelationEntity save(final HsOfficeRelationEntity entity); + HsOfficeRelationRbacEntity save(final HsOfficeRelationRbacEntity entity); long count(); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealEntity.java new file mode 100644 index 00000000..3c6c71a9 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealEntity.java @@ -0,0 +1,21 @@ +package net.hostsharing.hsadminng.hs.office.relation; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import net.hostsharing.hsadminng.errors.DisplayAs; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + + +@Entity +@Table(name = "hs_office_relation") +@NoArgsConstructor +@Getter +@Setter +@SuperBuilder(toBuilder = true) +@DisplayAs("RealRelation") +public class HsOfficeRelationRealEntity extends HsOfficeRelation { +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealRepository.java new file mode 100644 index 00000000..6a24ad02 --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRealRepository.java @@ -0,0 +1,37 @@ +package net.hostsharing.hsadminng.hs.office.relation; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; + +import jakarta.validation.constraints.NotNull; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface HsOfficeRelationRealRepository extends Repository { + + Optional findByUuid(UUID id); + + default List findRelationRelatedToPersonUuidAndRelationType(@NotNull UUID personUuid, HsOfficeRelationType relationType) { + return findRelationRelatedToPersonUuidAndRelationTypeString(personUuid, relationType.toString()); + } + + @Query(value = """ + SELECT p.* FROM hs_office_relation AS p + WHERE p.anchorUuid = :personUuid OR p.holderUuid = :personUuid + """, nativeQuery = true) + List findRelationRelatedToPersonUuid(@NotNull UUID personUuid); + + @Query(value = """ + SELECT p.* FROM hs_office_relation AS p + WHERE (:relationType IS NULL OR p.type = cast(:relationType AS HsOfficeRelationType)) + AND ( p.anchorUuid = :personUuid OR p.holderUuid = :personUuid) + """, nativeQuery = true) + List findRelationRelatedToPersonUuidAndRelationTypeString(@NotNull UUID personUuid, String relationType); + + HsOfficeRelationRealEntity save(final HsOfficeRelationRealEntity entity); + + long count(); + + int deleteByUuid(UUID uuid); +} diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java index 7b0f9121..a57ee32a 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java @@ -3,11 +3,11 @@ package net.hostsharing.hsadminng.hs.office.sepamandate; import io.hypersistence.utils.hibernate.type.range.PostgreSQLRangeType; import io.hypersistence.utils.hibernate.type.range.Range; import lombok.*; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountEntity; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRbacEntity; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; @@ -39,8 +39,8 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @Builder @NoArgsConstructor @AllArgsConstructor -@DisplayName("SEPA-Mandate") -public class HsOfficeSepaMandateEntity implements Stringifyable, RbacObject { +@DisplayAs("SEPA-Mandate") +public class HsOfficeSepaMandateEntity implements Stringifyable, BaseEntity { private static Stringify stringify = stringify(HsOfficeSepaMandateEntity.class) .withProp(e -> e.getBankAccount().getIban()) @@ -110,7 +110,7 @@ public class HsOfficeSepaMandateEntity implements Stringifyable, RbacObject T map(final S source, final Class targetClass, final BiConsumer postMapper) { diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacdef/RbacView.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacdef/RbacView.java index 9b4d2bbb..ed3a1486 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacdef/RbacView.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacdef/RbacView.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.rbac.rbacdef; import lombok.EqualsAndHashCode; import lombok.Getter; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import org.reflections.Reflections; import org.reflections.scanners.TypeAnnotationsScanner; @@ -12,6 +12,7 @@ import jakarta.persistence.Version; import jakarta.validation.constraints.NotNull; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.nio.file.Path; import java.util.*; import java.util.function.Consumer; @@ -89,11 +90,11 @@ public class RbacView { * @param * a JPA entity class extending RbacObject */ - public static RbacView rbacViewFor(final String alias, final Class entityClass) { + public static RbacView rbacViewFor(final String alias, final Class entityClass) { return new RbacView(alias, entityClass); } - RbacView(final String alias, final Class entityClass) { + RbacView(final String alias, final Class entityClass) { rootEntityAlias = new EntityAlias(alias, entityClass); entityAliases.put(alias, rootEntityAlias); new RbacUserReference(CREATOR); @@ -253,7 +254,7 @@ public class RbacView { .orElseGet(() -> new RbacPermissionDefinition(entityAlias, permission, null, true)); } - public RbacView declarePlaceholderEntityAliases(final String... aliasNames) { + public RbacView declarePlaceholderEntityAliases(final String... aliasNames) { for (String alias : aliasNames) { entityAliases.put(alias, new EntityAlias(alias)); } @@ -286,9 +287,9 @@ public class RbacView { * @param * a JPA entity class extending RbacObject */ - public RbacView importRootEntityAliasProxy( + public RbacView importRootEntityAliasProxy( final String aliasName, - final Class entityClass, + final Class entityClass, final ColumnValue forCase, final SQL fetchSql, final Column dependsOnColum) { @@ -312,7 +313,7 @@ public class RbacView { * a JPA entity class extending RbacObject */ public RbacView importSubEntityAlias( - final String aliasName, final Class entityClass, + final String aliasName, final Class entityClass, final SQL fetchSql, final Column dependsOnColum) { importEntityAliasImpl(aliasName, entityClass, usingDefaultCase(), fetchSql, dependsOnColum, true, NOT_NULL); return this; @@ -349,14 +350,14 @@ public class RbacView { * a JPA entity class extending RbacObject */ public RbacView importEntityAlias( - final String aliasName, final Class entityClass, final ColumnValue usingCase, + final String aliasName, final Class entityClass, final ColumnValue usingCase, final Column dependsOnColum, final SQL fetchSql, final Nullable nullable) { importEntityAliasImpl(aliasName, entityClass, usingCase, fetchSql, dependsOnColum, false, nullable); return this; } private EntityAlias importEntityAliasImpl( - final String aliasName, final Class entityClass, final ColumnValue usingCase, + final String aliasName, final Class entityClass, final ColumnValue usingCase, final SQL fetchSql, final Column dependsOnColum, boolean asSubEntity, final Nullable nullable) { final var entityAlias = ofNullable(entityAliases.get(aliasName)) @@ -378,7 +379,7 @@ public class RbacView { return entityAlias; } - private static RbacView rbacDefinition(final Class entityClass) + private static RbacView rbacDefinition(final Class entityClass) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { return (RbacView) entityClass.getMethod("rbac").invoke(null); } @@ -432,12 +433,22 @@ public class RbacView { } private void verifyVersionColumnExists() { - if (stream(rootEntityAlias.entityClass.getDeclaredFields()) - .noneMatch(f -> f.getAnnotation(Version.class) != null)) { + final var clazz = rootEntityAlias.entityClass; + if (!hasVersionColumn(clazz)) { throw new IllegalArgumentException("@Version field required in updatable entity " + rootEntityAlias.entityClass); } } + private static boolean hasVersionColumn(final Class clazz) { + if (stream(clazz.getDeclaredFields()).anyMatch(f -> f.getAnnotation(Version.class) != null)) { + return true; + } + if (clazz.getSuperclass() != null) { + return hasVersionColumn(clazz.getSuperclass()); + } + return false; + } + /** * Starts declaring a grant to a given role. * @@ -900,13 +911,13 @@ public class RbacView { return distinctGrantDef; } - record EntityAlias(String aliasName, Class entityClass, ColumnValue usingCase, SQL fetchSql, Column dependsOnColum, boolean isSubEntity, Nullable nullable) { + record EntityAlias(String aliasName, Class entityClass, ColumnValue usingCase, SQL fetchSql, Column dependsOnColum, boolean isSubEntity, Nullable nullable) { public EntityAlias(final String aliasName) { this(aliasName, null, null, null, null, false, null); } - public EntityAlias(final String aliasName, final Class entityClass) { + public EntityAlias(final String aliasName, final Class entityClass) { this(aliasName, entityClass, null, null, null, false, null); } @@ -936,6 +947,10 @@ public class RbacView { } private String withoutEntitySuffix(final String simpleEntityName) { + // TODO.impl: maybe introduce an annotation like @RbacObjectName("hsOfficeContact")? + if ( simpleEntityName.endsWith("RbacEntity")) { + return simpleEntityName.substring(0, simpleEntityName.length() - "RbacEntity".length()); + } return simpleEntityName.substring(0, simpleEntityName.length() - "Entity".length()); } @@ -1210,7 +1225,7 @@ public class RbacView { } } - private static void generateRbacView(final Class c) { + private static void generateRbacView(final Class c) { final Method mainMethod = stream(c.getMethods()).filter( m -> isStatic(m.getModifiers()) && m.getName().equals("main") ) @@ -1227,17 +1242,20 @@ public class RbacView { } } - public static Set> findRbacEntityClasses(String packageName) { + public static Set> findRbacEntityClasses(String packageName) { final var reflections = new Reflections(packageName, TypeAnnotationsScanner.class); return reflections.getTypesAnnotatedWith(Entity.class).stream() - .filter(c -> stream(c.getInterfaces()).anyMatch(i -> i==RbacObject.class)) - .map(RbacView::castToSubclassOfRbacObject) + .filter(c -> stream(c.getInterfaces()).anyMatch(i -> i== BaseEntity.class)) + .filter(c -> stream(c.getDeclaredMethods()) + .anyMatch(m -> m.getName().equals("rbac") && Modifier.isStatic(m.getModifiers())) + ) + .map(RbacView::castToSubclassOfBaseEntity) .collect(Collectors.toSet()); } @SuppressWarnings("unchecked") - private static Class castToSubclassOfRbacObject(final Class clazz) { - return (Class) clazz; + private static Class castToSubclassOfBaseEntity(final Class clazz) { + return (Class) clazz; } /** diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/RbacObject.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/BaseEntity.java similarity index 64% rename from src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/RbacObject.java rename to src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/BaseEntity.java index 31e9a85c..d0e7605f 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/RbacObject.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacobject/BaseEntity.java @@ -5,7 +5,8 @@ import org.hibernate.Hibernate; import java.util.UUID; -public interface RbacObject> { +// TODO.impl: this class does not really belong into this package, but there is no right place yet +public interface BaseEntity> { UUID getUuid(); int getVersion(); diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java b/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java index 391a82a6..e9541dd7 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerEntity.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; @@ -24,7 +24,7 @@ import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; @Setter @NoArgsConstructor @AllArgsConstructor -public class TestCustomerEntity implements RbacObject { +public class TestCustomerEntity implements BaseEntity { @Id @GeneratedValue diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/test/dom/TestDomainEntity.java b/src/main/java/net/hostsharing/hsadminng/rbac/test/dom/TestDomainEntity.java index 1dde65d7..5d1369ca 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/test/dom/TestDomainEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/test/dom/TestDomainEntity.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.rbac.test.pac.TestPackageEntity; @@ -27,7 +27,7 @@ import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; @Setter @NoArgsConstructor @AllArgsConstructor -public class TestDomainEntity implements RbacObject { +public class TestDomainEntity implements BaseEntity { @Id @GeneratedValue diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/test/pac/TestPackageEntity.java b/src/main/java/net/hostsharing/hsadminng/rbac/test/pac/TestPackageEntity.java index 5de98a64..8f4541d5 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/test/pac/TestPackageEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/test/pac/TestPackageEntity.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView; import net.hostsharing.hsadminng.rbac.rbacdef.RbacView.SQL; import net.hostsharing.hsadminng.rbac.test.cust.TestCustomerEntity; @@ -27,7 +27,7 @@ import static net.hostsharing.hsadminng.rbac.rbacdef.RbacView.rbacViewFor; @Setter @NoArgsConstructor @AllArgsConstructor -public class TestPackageEntity implements RbacObject { +public class TestPackageEntity implements BaseEntity { @Id @GeneratedValue diff --git a/src/main/java/net/hostsharing/hsadminng/stringify/Stringify.java b/src/main/java/net/hostsharing/hsadminng/stringify/Stringify.java index b410465f..269b0c69 100644 --- a/src/main/java/net/hostsharing/hsadminng/stringify/Stringify.java +++ b/src/main/java/net/hostsharing/hsadminng/stringify/Stringify.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.stringify; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import jakarta.validation.constraints.NotNull; import java.util.ArrayList; @@ -8,11 +8,11 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import static java.lang.Boolean.TRUE; +import static java.util.Optional.ofNullable; public final class Stringify { @@ -32,18 +32,21 @@ public final class Stringify { public Stringify using(final Class subClass) { //noinspection unchecked - return (Stringify) new Stringify(subClass, null) + final var stringify = new Stringify(subClass, null) .withIdProp(cast(idProp)) .withProps(cast(props)) - .withSeparator(separator) - .quotedValues(quotedValues); + .withSeparator(separator); + if (quotedValues != null) { + stringify.quotedValues(quotedValues); + } + return stringify; } private Stringify(final Class clazz, final String name) { if (name != null) { this.name = name; } else { - final var displayName = clazz.getAnnotation(DisplayName.class); + final var displayName = clazz.getAnnotation(DisplayAs.class); if (displayName != null) { this.name = displayName.value(); } else { @@ -96,7 +99,7 @@ public final class Stringify { } private String propName(final PropertyValue propVal, final String delimiter) { - return Optional.ofNullable(propVal.prop.name).map(v -> v + delimiter).orElse(""); + return ofNullable(propVal.prop.name).map(v -> v + delimiter).orElse(""); } private String optionallyQuoted(final PropertyValue propVal) { diff --git a/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql b/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql index 86d9b673..4bfc83b2 100644 --- a/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql +++ b/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql @@ -178,6 +178,8 @@ begin create or replace view %1$s_rv as with accessible_%1$s_uuids as ( + -- TODO.perf: this CTE query makes RBAC-SELECT-permission-queries so slow (~500ms), any idea how to optimize? + -- My guess is, that the depth of role-grants causes the problem. with recursive grants as ( select descendantUuid, ascendantUuid, 1 as level from RbacGrants @@ -197,8 +199,7 @@ begin from granted join RbacPermission perm on granted.descendantUuid = perm.uuid join RbacObject obj on obj.uuid = perm.objectUuid - where perm.op = 'SELECT' - and obj.objectTable = '%1$s' + where obj.objectTable = '%1$s' -- 'SELECT' permission is included in all other permissions limit 8001 ) select target.* diff --git a/src/main/resources/db/changelog/2-test/201-test-customer/2013-test-customer-rbac.sql b/src/main/resources/db/changelog/2-test/201-test-customer/2013-test-customer-rbac.sql index 14767c4b..e1540c9a 100644 --- a/src/main/resources/db/changelog/2-test/201-test-customer/2013-test-customer-rbac.sql +++ b/src/main/resources/db/changelog/2-test/201-test-customer/2013-test-customer-rbac.sql @@ -142,8 +142,8 @@ begin return NEW; end if; - raise exception '[403] insert into test_customer not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into test_customer values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger test_customer_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/2-test/202-test-package/2023-test-package-rbac.sql b/src/main/resources/db/changelog/2-test/202-test-package/2023-test-package-rbac.sql index fd832ccf..9ec9c06a 100644 --- a/src/main/resources/db/changelog/2-test/202-test-package/2023-test-package-rbac.sql +++ b/src/main/resources/db/changelog/2-test/202-test-package/2023-test-package-rbac.sql @@ -207,8 +207,8 @@ begin return NEW; end if; - raise exception '[403] insert into test_package not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into test_package values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger test_package_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/2-test/203-test-domain/2033-test-domain-rbac.sql b/src/main/resources/db/changelog/2-test/203-test-domain/2033-test-domain-rbac.sql index d6f32001..042021c9 100644 --- a/src/main/resources/db/changelog/2-test/203-test-domain/2033-test-domain-rbac.sql +++ b/src/main/resources/db/changelog/2-test/203-test-domain/2033-test-domain-rbac.sql @@ -206,8 +206,8 @@ begin return NEW; end if; - raise exception '[403] insert into test_domain not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into test_domain values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger test_domain_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/504-partner/5043-hs-office-partner-rbac.sql b/src/main/resources/db/changelog/5-hs-office/504-partner/5043-hs-office-partner-rbac.sql index 520ef180..bd1c673d 100644 --- a/src/main/resources/db/changelog/5-hs-office/504-partner/5043-hs-office-partner-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/504-partner/5043-hs-office-partner-rbac.sql @@ -219,8 +219,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_partner not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_partner values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_partner_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/504-partner/5044-hs-office-partner-details-rbac.sql b/src/main/resources/db/changelog/5-hs-office/504-partner/5044-hs-office-partner-details-rbac.sql index bf0fe164..8a7f2725 100644 --- a/src/main/resources/db/changelog/5-hs-office/504-partner/5044-hs-office-partner-details-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/504-partner/5044-hs-office-partner-details-rbac.sql @@ -123,8 +123,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_partner_details not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_partner_details values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_partner_details_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/506-debitor/5063-hs-office-debitor-rbac.sql b/src/main/resources/db/changelog/5-hs-office/506-debitor/5063-hs-office-debitor-rbac.sql index 12f4f09d..8e91d7e7 100644 --- a/src/main/resources/db/changelog/5-hs-office/506-debitor/5063-hs-office-debitor-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/506-debitor/5063-hs-office-debitor-rbac.sql @@ -192,8 +192,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_debitor not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_debitor values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_debitor_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/507-sepamandate/5073-hs-office-sepamandate-rbac.sql b/src/main/resources/db/changelog/5-hs-office/507-sepamandate/5073-hs-office-sepamandate-rbac.sql index 3fb20baf..6b6595a0 100644 --- a/src/main/resources/db/changelog/5-hs-office/507-sepamandate/5073-hs-office-sepamandate-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/507-sepamandate/5073-hs-office-sepamandate-rbac.sql @@ -173,8 +173,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_sepamandate not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_sepamandate values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_sepamandate_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/510-membership/5103-hs-office-membership-rbac.sql b/src/main/resources/db/changelog/5-hs-office/510-membership/5103-hs-office-membership-rbac.sql index bc998fa3..7e628d39 100644 --- a/src/main/resources/db/changelog/5-hs-office/510-membership/5103-hs-office-membership-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/510-membership/5103-hs-office-membership-rbac.sql @@ -154,8 +154,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_membership not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_membership values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_membership_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/511-coopshares/5113-hs-office-coopshares-rbac.sql b/src/main/resources/db/changelog/5-hs-office/511-coopshares/5113-hs-office-coopshares-rbac.sql index 1270fd69..6707bdaa 100644 --- a/src/main/resources/db/changelog/5-hs-office/511-coopshares/5113-hs-office-coopshares-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/511-coopshares/5113-hs-office-coopshares-rbac.sql @@ -130,8 +130,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_coopsharestransaction not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_coopsharestransaction values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_coopsharestransaction_insert_permission_check_tg diff --git a/src/main/resources/db/changelog/5-hs-office/512-coopassets/5123-hs-office-coopassets-rbac.sql b/src/main/resources/db/changelog/5-hs-office/512-coopassets/5123-hs-office-coopassets-rbac.sql index ce9926b2..39f5a8fe 100644 --- a/src/main/resources/db/changelog/5-hs-office/512-coopassets/5123-hs-office-coopassets-rbac.sql +++ b/src/main/resources/db/changelog/5-hs-office/512-coopassets/5123-hs-office-coopassets-rbac.sql @@ -130,8 +130,8 @@ begin return NEW; end if; - raise exception '[403] insert into hs_office_coopassetstransaction not allowed for current subjects % (%)', - currentSubjects(), currentSubjectsUuids(); + raise exception '[403] insert into hs_office_coopassetstransaction values(%) not allowed for current subjects % (%)', + NEW, currentSubjects(), currentSubjectsUuids(); end; $$; create trigger hs_office_coopassetstransaction_insert_permission_check_tg diff --git a/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java b/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java index 68a62763..49071496 100644 --- a/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java +++ b/src/test/java/net/hostsharing/hsadminng/arch/ArchitectureTest.java @@ -12,7 +12,7 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import net.hostsharing.hsadminng.rbac.context.ContextBasedTest; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import org.springframework.data.repository.Repository; import org.springframework.web.bind.annotation.RestController; @@ -84,6 +84,7 @@ public class ArchitectureTest { @ArchTest @SuppressWarnings("unused") public static final ArchRule dontUseImplSuffix = noClasses() + .that().areNotPrivate() // e.g. Lombok SuperBuilder generated classes .should().haveSimpleNameEndingWith("Impl"); @ArchTest @@ -346,7 +347,7 @@ public class ArchitectureTest { static final ArchRule tableNamesOfRbacEntitiesShouldEndWith_rv = classes() .that().areAnnotatedWith(Table.class) - .and().areAssignableTo(RbacObject.class) + .and().areAssignableTo(BaseEntity.class) .should(haveTableNameEndingWith_rv()) .because("it's required that the table names of RBAC entities end with '_rv'"); diff --git a/src/test/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandlerUnitTest.java b/src/test/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandlerUnitTest.java index 9b25fed4..e54eac1e 100644 --- a/src/test/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandlerUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/errors/RestResponseEntityExceptionHandlerUnitTest.java @@ -40,7 +40,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(409); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("First Line"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [409] First Line"); } @Test @@ -59,7 +59,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(400); assertThat(errorResponse.getBody()).isNotNull() - .extracting(CustomErrorResponse::getMessage).isEqualTo("Second Line"); + .extracting(CustomErrorResponse::getMessage).isEqualTo("ERROR: [400] Second Line"); } @Test @@ -91,7 +91,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(400); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("Unable to find Partner with uuid 12345-123454"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [400] Unable to find Partner with uuid 12345-123454"); } @Test @@ -109,7 +109,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(400); assertThat(errorResponse.getBody().getMessage()).isEqualTo( - "Unable to find net.hostsharing.hsadminng.WhateverEntity with id 12345-123454"); + "ERROR: [400] Unable to find net.hostsharing.hsadminng.WhateverEntity with id 12345-123454"); } @Test @@ -125,7 +125,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(400); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("whatever error message"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [400] whatever error message"); } @Test @@ -143,7 +143,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(400); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("Unable to find NoDisplayNameEntity with uuid 12345-123454"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [400] Unable to find NoDisplayNameEntity with uuid 12345-123454"); } @Test @@ -172,7 +172,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(404); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("some error message"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [404] some error message"); } @ParameterizedTest @@ -191,7 +191,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(400); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("given error message"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [400] given error message"); } @Test @@ -218,7 +218,8 @@ class RestResponseEntityExceptionHandlerUnitTest { .extracting("statusCode").isEqualTo(400); assertThat(errorResponse.getBody()) .extracting("message") - .isEqualTo("[someField expected to be something but is \"someRejectedValue\"]"); + // FYI: the brackets around the message are here because it's actually an array, in this case of size 1 + .isEqualTo("ERROR: [400] [someField expected to be something but is \"someRejectedValue\"]"); } @Test @@ -232,7 +233,7 @@ class RestResponseEntityExceptionHandlerUnitTest { // then assertThat(errorResponse.getBody().getStatusCode()).isEqualTo(500); - assertThat(errorResponse.getBody().getMessage()).isEqualTo("First Line"); + assertThat(errorResponse.getBody().getMessage()).isEqualTo("ERROR: [500] First Line"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 54edc9ef..1e822604 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -8,8 +8,8 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRepository; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.project.HsBookingProjectRepository; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacRepository; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; @@ -62,7 +62,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup HsOfficeDebitorRepository debitorRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRbacRepository contactRepo; @Autowired JpaAttempt jpaAttempt; @@ -307,7 +307,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup .body("", lenientlyEquals(""" { "statusPhrase": "Bad Request", - "message": "[ + "message": "ERROR: [400] [ <<<'MANAGED_SERVER:vm1400.config.extra' is not expected but is set to '42', <<<'MANAGED_SERVER:vm1400.config.monit_max_cpu_usage' is expected to be at most 100 but is 101, <<<'MANAGED_SERVER:vm1400.config.monit_max_ssd_usage' is expected to be at least 10 but is 0 @@ -360,7 +360,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup .body("", lenientlyEquals(""" { "statusPhrase": "Bad Request", - "message": "['D-1000111:D-1000111 default project:separate ManagedWebspace.resources.Multi=1 allows at maximum 25 unix users, but 26 found]" + "message": "ERROR: [400] ['D-1000111:D-1000111 default project:separate ManagedWebspace.resources.Multi=1 allows at maximum 25 unix users, but 26 found]" } """.replaceAll(" +<<<", ""))); // @formatter:on } @@ -732,7 +732,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup }).assertSuccessful().returnedValue(); } - private HsOfficeContactEntity givenContact() { + private HsOfficeContactRbacEntity givenContact() { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); return contactRepo.findContactByOptionalCaptionLike("second").stream().findFirst().orElseThrow(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java index f20006c2..7a382edb 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerRestTest.java @@ -32,7 +32,7 @@ import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_C import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET; -import static net.hostsharing.hsadminng.hs.office.contact.TestHsOfficeContact.TEST_CONTACT; +import static net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealTestEntity.TEST_REAL_CONTACT; import static net.hostsharing.hsadminng.rbac.test.JsonMatcher.lenientlyEquals; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -75,7 +75,7 @@ public class HsHostingAssetControllerRestTest { .bookingItem(TEST_CLOUD_SERVER_BOOKING_ITEM) .identifier("vm1234") .caption("some fake cloud-server") - .alarmContact(TEST_CONTACT) + .alarmContact(TEST_REAL_CONTACT) .build()), """ [ @@ -101,7 +101,7 @@ public class HsHostingAssetControllerRestTest { .bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM) .identifier("vm1234") .caption("some fake managed-server") - .alarmContact(TEST_CONTACT) + .alarmContact(TEST_REAL_CONTACT) .config(Map.ofEntries( entry("monit_max_ssd_usage", 70), entry("monit_max_cpu_usage", 80), diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java index 96728cca..f9e4c568 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcherUnitTest.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset; import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.model.HsHostingAssetPatchResource; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.mapper.KeyValueMap; import net.hostsharing.hsadminng.rbac.test.PatchUnitTestBase; import org.junit.jupiter.api.BeforeEach; @@ -48,7 +48,7 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< entry("SSD", 256), entry("MEM", 64) ); - final HsOfficeContactEntity givenInitialContact = HsOfficeContactEntity.builder() + final HsOfficeContactRealEntity givenInitialContact = HsOfficeContactRealEntity.builder() .uuid(UUID.randomUUID()) .build(); @@ -62,8 +62,8 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< void initMocks() { lenient().when(em.getReference(eq(HsHostingAssetEntity.class), any())).thenAnswer(invocation -> HsHostingAssetEntity.builder().uuid(invocation.getArgument(1)).build()); - lenient().when(em.getReference(eq(HsOfficeContactEntity.class), any())).thenAnswer(invocation -> - HsOfficeContactEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsOfficeContactRealEntity.class), any())).thenAnswer(invocation -> + HsOfficeContactRealEntity.builder().uuid(invocation.getArgument(1)).build()); } @Override @@ -111,7 +111,7 @@ class HsHostingAssetEntityPatcherUnitTest extends PatchUnitTestBase< ); } - static HsOfficeContactEntity newContact(final UUID uuid) { - return HsOfficeContactEntity.builder().uuid(uuid).build(); + static HsOfficeContactRealEntity newContact(final UUID uuid) { + return HsOfficeContactRealEntity.builder().uuid(uuid).build(); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java index 2b68e352..a8ad47e1 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java @@ -6,7 +6,7 @@ import com.opencsv.CSVReaderBuilder; import lombok.SneakyThrows; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; import net.hostsharing.hsadminng.rbac.context.ContextBasedTest; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -141,7 +141,7 @@ public class CsvDataImport extends ContextBasedTest { return record; } - public T persist(final Integer id, final T entity) { + public T persist(final Integer id, final T entity) { try { if (entity instanceof HsHostingAsset ha) { //noinspection unchecked @@ -155,7 +155,7 @@ public class CsvDataImport extends ContextBasedTest { return entity; } - public T persistViaEM(final Integer id, final T entity) { + public T persistViaEM(final Integer id, final T entity) { //System.out.println("persisting #" + entity.hashCode() + ": " + entity); em.persist(entity); // uncomment for debugging purposes @@ -165,7 +165,7 @@ public class CsvDataImport extends ContextBasedTest { } @SneakyThrows - public RbacObject persistViaSql(final Integer id, final HsHostingAsset entity) { + public BaseEntity persistViaSql(final Integer id, final HsHostingAsset entity) { if (entity.getUuid() == null) { entity.setUuid(UUID.randomUUID()); } @@ -196,10 +196,10 @@ public class CsvDataImport extends ContextBasedTest { """) .setParameter("uuid", entity.getUuid()) .setParameter("type", entity.getType().name()) - .setParameter("bookingitemuuid", ofNullable(entity.getBookingItem()).map(RbacObject::getUuid).orElse(null)) - .setParameter("parentassetuuid", ofNullable(entity.getParentAsset()).map(RbacObject::getUuid).orElse(null)) - .setParameter("assignedtoassetuuid", ofNullable(entity.getAssignedToAsset()).map(RbacObject::getUuid).orElse(null)) - .setParameter("alarmcontactuuid", ofNullable(entity.getAlarmContact()).map(RbacObject::getUuid).orElse(null)) + .setParameter("bookingitemuuid", ofNullable(entity.getBookingItem()).map(BaseEntity::getUuid).orElse(null)) + .setParameter("parentassetuuid", ofNullable(entity.getParentAsset()).map(BaseEntity::getUuid).orElse(null)) + .setParameter("assignedtoassetuuid", ofNullable(entity.getAssignedToAsset()).map(BaseEntity::getUuid).orElse(null)) + .setParameter("alarmcontactuuid", ofNullable(entity.getAlarmContact()).map(BaseEntity::getUuid).orElse(null)) .setParameter("identifier", entity.getIdentifier()) .setParameter("caption", entity.getCaption()) .setParameter("config", entity.getConfig().toString()) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRawEntity.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java similarity index 89% rename from src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRawEntity.java rename to src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java index 33e632d5..51665b9c 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRawEntity.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java @@ -10,7 +10,7 @@ import lombok.Setter; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import org.hibernate.annotations.Type; @@ -42,7 +42,7 @@ import java.util.UUID; @Setter @NoArgsConstructor @AllArgsConstructor -public class HsHostingAssetRawEntity implements HsHostingAsset { +public class HsHostingAssetRealEntity implements HsHostingAsset { @Id @GeneratedValue @@ -57,11 +57,11 @@ public class HsHostingAssetRawEntity implements HsHostingAsset { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parentassetuuid") - private HsHostingAssetRawEntity parentAsset; + private HsHostingAssetRealEntity parentAsset; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "assignedtoassetuuid") - private HsHostingAssetRawEntity assignedToAsset; + private HsHostingAssetRealEntity assignedToAsset; @Column(name = "type") @Enumerated(EnumType.STRING) @@ -69,11 +69,11 @@ public class HsHostingAssetRawEntity implements HsHostingAsset { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "alarmcontactuuid") - private HsOfficeContactEntity alarmContact; + private HsOfficeContactRealEntity alarmContact; @OneToMany(cascade = CascadeType.REFRESH, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "parentassetuuid", referencedColumnName = "uuid") - private List subHostingAssets; + private List subHostingAssets; @Column(name = "identifier") private String identifier; // e.g. vm1234, xyz00, example.org, xyz00_abc @@ -109,6 +109,6 @@ public class HsHostingAssetRawEntity implements HsHostingAsset { @Override public String toString() { - return stringify.using(HsHostingAssetRawEntity.class).apply(this); + return stringify.using(HsHostingAssetRealEntity.class).apply(this); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 288261e7..ae1b5e44 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -113,13 +113,13 @@ public class ImportHostingAssets extends ImportOfficeData { static final Integer DBUSER_ID_OFFSET = 7000000; static final Integer DB_ID_OFFSET = 8000000; - record Hive(int hive_id, String hive_name, int inet_addr_id, AtomicReference serverRef) {} + record Hive(int hive_id, String hive_name, int inet_addr_id, AtomicReference serverRef) {} static Map bookingProjects = new WriteOnceMap<>(); static Map bookingItems = new WriteOnceMap<>(); static Map hives = new WriteOnceMap<>(); - static Map hostingAssets = new WriteOnceMap<>(); // TODO.impl: separate maps for each type? - static Map dbUsersByEngineAndName = new WriteOnceMap<>(); + static Map hostingAssets = new WriteOnceMap<>(); // TODO.impl: separate maps for each type? + static Map dbUsersByEngineAndName = new WriteOnceMap<>(); @Test @Order(11010) @@ -150,11 +150,11 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(5, IPV4_NUMBER)).isEqualToIgnoringWhitespace(""" { - 1000363=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.34), - 1000381=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.52), - 1000402=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.73), - 1000433=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.104), - 1000457=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.128) + 1000363=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.34), + 1000381=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.52), + 1000402=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.73), + 1000433=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.104), + 1000457=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.128) } """); } @@ -204,13 +204,13 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(3, CLOUD_SERVER, MANAGED_SERVER, MANAGED_WEBSPACE)).isEqualToIgnoringWhitespace(""" { - 3000630=HsHostingAssetRawEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), - 3000968=HsHostingAssetRawEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), - 3000978=HsHostingAssetRawEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), - 3001061=HsHostingAssetRawEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), - 3001094=HsHostingAssetRawEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 3001112=HsHostingAssetRawEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), - 3023611=HsHostingAssetRawEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) + 3000630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), + 3000968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), + 3000978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), + 3001061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), + 3001094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 3001112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), + 3023611=HsHostingAssetRealEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) } """); assertThat(firstOfEachType( @@ -249,15 +249,15 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(5, CLOUD_SERVER, MANAGED_SERVER, MANAGED_WEBSPACE)) .isEqualToIgnoringWhitespace(""" { - 3000630=HsHostingAssetRawEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), - 3000968=HsHostingAssetRawEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), - 3000978=HsHostingAssetRawEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), - 3001061=HsHostingAssetRawEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), - 3001094=HsHostingAssetRawEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 3001112=HsHostingAssetRawEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), - 3001447=HsHostingAssetRawEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), - 3019959=HsHostingAssetRawEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00), - 3023611=HsHostingAssetRawEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) + 3000630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), + 3000968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), + 3000978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), + 3001061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), + 3001094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 3001112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), + 3001447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), + 3019959=HsHostingAssetRealEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00), + 3023611=HsHostingAssetRealEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) } """); assertThat(firstOfEachType( @@ -298,20 +298,20 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace(""" { - 4005803=HsHostingAssetRawEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), - 4005805=HsHostingAssetRawEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), - 4005809=HsHostingAssetRawEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), - 4005811=HsHostingAssetRawEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), - 4005813=HsHostingAssetRawEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), - 4005835=HsHostingAssetRawEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), - 4005964=HsHostingAssetRawEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), - 4005966=HsHostingAssetRawEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), - 4005990=HsHostingAssetRawEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), - 4100705=HsHostingAssetRawEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), - 4100824=HsHostingAssetRawEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), - 4167846=HsHostingAssetRawEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), - 4169546=HsHostingAssetRawEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), - 4169596=HsHostingAssetRawEntity(UNIX_USER, dph00-uph, Domain admin, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) + 4005803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), + 4005805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), + 4005809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), + 4005811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), + 4005813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), + 4005835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), + 4005964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), + 4005966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), + 4005990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), + 4100705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), + 4100824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), + 4167846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), + 4169546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), + 4169596=HsHostingAssetRealEntity(UNIX_USER, dph00-uph, Domain admin, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) } """); } @@ -334,17 +334,17 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(15, EMAIL_ALIAS)).isEqualToIgnoringWhitespace(""" { - 5002403=HsHostingAssetRawEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, { "target": "[michael.mellis@example.com]"}), - 5002405=HsHostingAssetRawEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, { "target": "[|/home/pacs/lug00/users/in/mailinglist/listar]"}), - 5002429=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, { "target": "[mim12-mi@mim12.hostsharing.net]"}), - 5002431=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, { "target": "[michael.mellis@hostsharing.net]"}), - 5002449=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, { "target": "[mim00-hhfx, |/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l]"}), - 5002451=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, { "target": "[:include:/home/pacs/mim00/etc/hhfx.list]"}), - 5002452=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-empty, mim00-empty, MANAGED_WEBSPACE:mim00, { "target": "[]"}), - 5002453=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-0_entries, mim00-0_entries, MANAGED_WEBSPACE:mim00, { "target": "[]"}), - 5002454=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, { "target": "[/dev/null]"}), - 5002455=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, { "target": "[|/home/pacs/mim00/install/corpslistar/listar]"}), - 5002456=HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, { "target": "[|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern]"}) + 5002403=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, { "target": "[michael.mellis@example.com]"}), + 5002405=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, { "target": "[|/home/pacs/lug00/users/in/mailinglist/listar]"}), + 5002429=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, { "target": "[mim12-mi@mim12.hostsharing.net]"}), + 5002431=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, { "target": "[michael.mellis@hostsharing.net]"}), + 5002449=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, { "target": "[mim00-hhfx, |/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l]"}), + 5002451=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, { "target": "[:include:/home/pacs/mim00/etc/hhfx.list]"}), + 5002452=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-empty, mim00-empty, MANAGED_WEBSPACE:mim00, { "target": "[]"}), + 5002453=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-0_entries, mim00-0_entries, MANAGED_WEBSPACE:mim00, { "target": "[]"}), + 5002454=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, { "target": "[/dev/null]"}), + 5002455=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, { "target": "[|/home/pacs/mim00/install/corpslistar/listar]"}), + 5002456=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, { "target": "[|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern]"}) } """); } @@ -362,14 +362,14 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(5, PGSQL_INSTANCE, MARIADB_INSTANCE)).isEqualToIgnoringWhitespace(""" { - 6000000=HsHostingAssetRawEntity(PGSQL_INSTANCE, vm1061|PgSql.default, vm1061-PostgreSQL default instance, MANAGED_SERVER:vm1061), - 6000001=HsHostingAssetRawEntity(MARIADB_INSTANCE, vm1061|MariaDB.default, vm1061-MariaDB default instance, MANAGED_SERVER:vm1061), - 6000002=HsHostingAssetRawEntity(PGSQL_INSTANCE, vm1050|PgSql.default, vm1050-PostgreSQL default instance, MANAGED_SERVER:vm1050), - 6000003=HsHostingAssetRawEntity(MARIADB_INSTANCE, vm1050|MariaDB.default, vm1050-MariaDB default instance, MANAGED_SERVER:vm1050), - 6000004=HsHostingAssetRawEntity(PGSQL_INSTANCE, vm1068|PgSql.default, vm1068-PostgreSQL default instance, MANAGED_SERVER:vm1068), - 6000005=HsHostingAssetRawEntity(MARIADB_INSTANCE, vm1068|MariaDB.default, vm1068-MariaDB default instance, MANAGED_SERVER:vm1068), - 6000006=HsHostingAssetRawEntity(PGSQL_INSTANCE, vm1093|PgSql.default, vm1093-PostgreSQL default instance, MANAGED_SERVER:vm1093), - 6000007=HsHostingAssetRawEntity(MARIADB_INSTANCE, vm1093|MariaDB.default, vm1093-MariaDB default instance, MANAGED_SERVER:vm1093) + 6000000=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1061|PgSql.default, vm1061-PostgreSQL default instance, MANAGED_SERVER:vm1061), + 6000001=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1061|MariaDB.default, vm1061-MariaDB default instance, MANAGED_SERVER:vm1061), + 6000002=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1050|PgSql.default, vm1050-PostgreSQL default instance, MANAGED_SERVER:vm1050), + 6000003=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1050|MariaDB.default, vm1050-MariaDB default instance, MANAGED_SERVER:vm1050), + 6000004=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1068|PgSql.default, vm1068-PostgreSQL default instance, MANAGED_SERVER:vm1068), + 6000005=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1068|MariaDB.default, vm1068-MariaDB default instance, MANAGED_SERVER:vm1068), + 6000006=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1093|PgSql.default, vm1093-PostgreSQL default instance, MANAGED_SERVER:vm1093), + 6000007=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1093|MariaDB.default, vm1093-MariaDB default instance, MANAGED_SERVER:vm1093) } """); } @@ -392,16 +392,16 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(5, PGSQL_USER, MARIADB_USER)).isEqualToIgnoringWhitespace(""" { - 7001857=HsHostingAssetRawEntity(PGSQL_USER, PGU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc="}), - 7001858=HsHostingAssetRawEntity(MARIADB_USER, MAU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*59067A36BA197AD0A47D74909296C5B002A0FB9F"}), - 7001859=HsHostingAssetRawEntity(PGSQL_USER, PGU|hsh00_vorstand, hsh00_vorstand, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), - 7001860=HsHostingAssetRawEntity(PGSQL_USER, PGU|hsh00_hsadmin, hsh00_hsadmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), - 7001861=HsHostingAssetRawEntity(PGSQL_USER, PGU|hsh00_hsadmin_ro, hsh00_hsadmin_ro, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), - 7004908=HsHostingAssetRawEntity(MARIADB_USER, MAU|hsh00_mantis, hsh00_mantis, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F"}), - 7004909=HsHostingAssetRawEntity(MARIADB_USER, MAU|hsh00_mantis_ro, hsh00_mantis_ro, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383"}), - 7004931=HsHostingAssetRawEntity(PGSQL_USER, PGU|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), - 7004932=HsHostingAssetRawEntity(MARIADB_USER, MAU|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*3188720B1889EF5447C722629765F296F40257C2"}), - 7007520=HsHostingAssetRawEntity(MARIADB_USER, MAU|lug00_wla, lug00_wla, MANAGED_WEBSPACE:lug00, MARIADB_INSTANCE:vm1068|MariaDB.default, { "password": "*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5"}) + 7001857=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc="}), + 7001858=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*59067A36BA197AD0A47D74909296C5B002A0FB9F"}), + 7001859=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_vorstand, hsh00_vorstand, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), + 7001860=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin, hsh00_hsadmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), + 7001861=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin_ro, hsh00_hsadmin_ro, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), + 7004908=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis, hsh00_mantis, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F"}), + 7004909=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis_ro, hsh00_mantis_ro, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383"}), + 7004931=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), + 7004932=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*3188720B1889EF5447C722629765F296F40257C2"}), + 7007520=HsHostingAssetRealEntity(MARIADB_USER, MAU|lug00_wla, lug00_wla, MANAGED_WEBSPACE:lug00, MARIADB_INSTANCE:vm1068|MariaDB.default, { "password": "*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5"}) } """); } @@ -424,16 +424,16 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(5, PGSQL_DATABASE, MARIADB_DATABASE)).isEqualToIgnoringWhitespace(""" { - 8000077=HsHostingAssetRawEntity(PGSQL_DATABASE, PGD|hsh00_vorstand, hsh00_vorstand, PGSQL_USER:PGU|hsh00_vorstand, { "encoding": "LATIN1"}), - 8000786=HsHostingAssetRawEntity(MARIADB_DATABASE, MAD|hsh00_addr, hsh00_addr, MARIADB_USER:MAU|hsh00, { "encoding": "latin1"}), - 8000805=HsHostingAssetRawEntity(MARIADB_DATABASE, MAD|hsh00_db2, hsh00_db2, MARIADB_USER:MAU|hsh00, { "encoding": "latin1"}), - 8001858=HsHostingAssetRawEntity(PGSQL_DATABASE, PGD|hsh00, hsh00, PGSQL_USER:PGU|hsh00, { "encoding": "LATIN1"}), - 8001860=HsHostingAssetRawEntity(PGSQL_DATABASE, PGD|hsh00_hsadmin, hsh00_hsadmin, PGSQL_USER:PGU|hsh00_hsadmin, { "encoding": "UTF8"}), - 8004908=HsHostingAssetRawEntity(MARIADB_DATABASE, MAD|hsh00_mantis, hsh00_mantis, MARIADB_USER:MAU|hsh00_mantis, { "encoding": "utf8"}), - 8004931=HsHostingAssetRawEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, { "encoding": "UTF8"}), - 8004932=HsHostingAssetRawEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin_new, hsh00_phpPgSqlAdmin_new, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, { "encoding": "UTF8"}), - 8004941=HsHostingAssetRawEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MARIADB_USER:MAU|hsh00_phpMyAdmin, { "encoding": "utf8"}), - 8004942=HsHostingAssetRawEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin_old, hsh00_phpMyAdmin_old, MARIADB_USER:MAU|hsh00_phpMyAdmin, { "encoding": "utf8"}) + 8000077=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_vorstand, hsh00_vorstand, PGSQL_USER:PGU|hsh00_vorstand, { "encoding": "LATIN1"}), + 8000786=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_addr, hsh00_addr, MARIADB_USER:MAU|hsh00, { "encoding": "latin1"}), + 8000805=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_db2, hsh00_db2, MARIADB_USER:MAU|hsh00, { "encoding": "latin1"}), + 8001858=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00, hsh00, PGSQL_USER:PGU|hsh00, { "encoding": "LATIN1"}), + 8001860=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_hsadmin, hsh00_hsadmin, PGSQL_USER:PGU|hsh00_hsadmin, { "encoding": "UTF8"}), + 8004908=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_mantis, hsh00_mantis, MARIADB_USER:MAU|hsh00_mantis, { "encoding": "utf8"}), + 8004931=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, { "encoding": "UTF8"}), + 8004932=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin_new, hsh00_phpPgSqlAdmin_new, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, { "encoding": "UTF8"}), + 8004941=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MARIADB_USER:MAU|hsh00_phpMyAdmin, { "encoding": "utf8"}), + 8004942=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin_old, hsh00_phpMyAdmin_old, MARIADB_USER:MAU|hsh00_phpMyAdmin, { "encoding": "utf8"}) } """); } @@ -583,20 +583,20 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace(""" { - 4005803=HsHostingAssetRawEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}), - 4005805=HsHostingAssetRawEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102091}), - 4005809=HsHostingAssetRawEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102093}), - 4005811=HsHostingAssetRawEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), - 4005813=HsHostingAssetRawEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), - 4005835=HsHostingAssetRawEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), - 4005964=HsHostingAssetRawEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), - 4005966=HsHostingAssetRawEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), - 4005990=HsHostingAssetRawEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), - 4100705=HsHostingAssetRawEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 10003}), - 4100824=HsHostingAssetRawEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 10000}), - 4167846=HsHostingAssetRawEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 110568}), - 4169546=HsHostingAssetRawEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110593}), - 4169596=HsHostingAssetRawEntity(UNIX_USER, dph00-uph, Domain admin, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110594}) + 4005803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}), + 4005805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102091}), + 4005809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102093}), + 4005811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), + 4005813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), + 4005835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), + 4005964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), + 4005966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), + 4005990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), + 4100705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 10003}), + 4100824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 10000}), + 4167846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 110568}), + 4169546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110593}), + 4169596=HsHostingAssetRealEntity(UNIX_USER, dph00-uph, Domain admin, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110594}) } """); } @@ -622,12 +622,12 @@ public class ImportHostingAssets extends ImportOfficeData { void logErrors() { if (isImportingControlledTestData()) { super.expectErrors(""" - validation failed for id:5002452( HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-empty, mim00-empty, MANAGED_WEBSPACE:mim00, { + validation failed for id:5002452( HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-empty, mim00-empty, MANAGED_WEBSPACE:mim00, { "target": "[]" } )): ['EMAIL_ALIAS:mim00-empty.config.target' length is expected to be at min 1 but length of [[]] is 0]""", """ - validation failed for id:5002453( HsHostingAssetRawEntity(EMAIL_ALIAS, mim00-0_entries, mim00-0_entries, MANAGED_WEBSPACE:mim00, { + validation failed for id:5002453( HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-0_entries, mim00-0_entries, MANAGED_WEBSPACE:mim00, { "target": "[]" } )): ['EMAIL_ALIAS:mim00-0_entries.config.target' length is expected to be at min 1 but length of [[]] is 0]""" @@ -670,7 +670,7 @@ public class ImportHostingAssets extends ImportOfficeData { .map(this::trimAll) .map(row -> new Record(columns, row)) .forEach(rec -> { - final var ipNumber = HsHostingAssetRawEntity.builder() + final var ipNumber = HsHostingAssetRealEntity.builder() .type(IPV4_NUMBER) .identifier(rec.getString("inet_addr")) .caption(rec.getString("description")) @@ -734,7 +734,7 @@ public class ImportHostingAssets extends ImportOfficeData { + packet_name) .isTrue()); - final var asset = HsHostingAssetRawEntity.builder() + final var asset = HsHostingAssetRealEntity.builder() // this turns off identifier validation to accept former default prefixes .isLoaded(haType == MANAGED_WEBSPACE) .type(haType) @@ -874,7 +874,7 @@ public class ImportHostingAssets extends ImportOfficeData { .forEach(rec -> { final var unixuser_id = rec.getInteger("unixuser_id"); final var packet_id = rec.getInteger("packet_id"); - final var unixUserAsset = HsHostingAssetRawEntity.builder() + final var unixUserAsset = HsHostingAssetRealEntity.builder() .type(UNIX_USER) .parentAsset(hostingAssets.get(PACKET_ID_OFFSET + packet_id)) .identifier(rec.getString("name")) @@ -931,7 +931,7 @@ public class ImportHostingAssets extends ImportOfficeData { final var unixuser_id = rec.getInteger("emailalias_id"); final var packet_id = rec.getInteger("pac_id"); final var targets = parseCsvLine(rec.getString("target")); - final var unixUserAsset = HsHostingAssetRawEntity.builder() + final var unixUserAsset = HsHostingAssetRealEntity.builder() .type(EMAIL_ALIAS) .parentAsset(hostingAssets.get(PACKET_ID_OFFSET + packet_id)) .identifier(rec.getString("name")) @@ -944,14 +944,14 @@ public class ImportHostingAssets extends ImportOfficeData { }); } - private void createDatabaseInstances(final List parentAssets) { + private void createDatabaseInstances(final List parentAssets) { final var idRef = new AtomicInteger(0); parentAssets.forEach(pa -> { if (pa.getSubHostingAssets() == null) { pa.setSubHostingAssets(new ArrayList<>()); } - final var pgSqlInstanceAsset = HsHostingAssetRawEntity.builder() + final var pgSqlInstanceAsset = HsHostingAssetRealEntity.builder() .type(PGSQL_INSTANCE) .parentAsset(pa) .identifier(pa.getIdentifier() + "|PgSql.default") @@ -960,7 +960,7 @@ public class ImportHostingAssets extends ImportOfficeData { pa.getSubHostingAssets().add(pgSqlInstanceAsset); hostingAssets.put(DBINSTANCE_ID_OFFSET + idRef.getAndIncrement(), pgSqlInstanceAsset); - final var mariaDbInstanceAsset = HsHostingAssetRawEntity.builder() + final var mariaDbInstanceAsset = HsHostingAssetRealEntity.builder() .type(MARIADB_INSTANCE) .parentAsset(pa) .identifier(pa.getIdentifier() + "|MariaDB.default") @@ -996,7 +996,7 @@ public class ImportHostingAssets extends ImportOfficeData { .filter(ha -> ha.getType() == dbInstanceAssetType) .findAny().orElseThrow(); // there is exactly one: the default instance for the given type - final var dbUserAsset = HsHostingAssetRawEntity.builder() + final var dbUserAsset = HsHostingAssetRealEntity.builder() .type(dbUserAssetType) .parentAsset(hostingAssets.get(PACKET_ID_OFFSET + packet_id)) .assignedToAsset(dbInstanceAsset) @@ -1027,7 +1027,7 @@ public class ImportHostingAssets extends ImportOfficeData { : failWith("unknown DB engine " + engine); final var name = rec.getString("name"); final var encoding = rec.getString("encoding").replaceAll("[-_]+", ""); - final var dbAsset = HsHostingAssetRawEntity.builder() + final var dbAsset = HsHostingAssetRealEntity.builder() .type(type) .parentAsset(owningDbUserHA) .identifier(type.name().substring(0, 2) + "D|" + name) @@ -1069,7 +1069,7 @@ public class ImportHostingAssets extends ImportOfficeData { }; } - private static HsHostingAssetRawEntity ipNumber(final Integer inet_addr_id) { + private static HsHostingAssetRealEntity ipNumber(final Integer inet_addr_id) { return inet_addr_id != null ? hostingAssets.get(IP_NUMBER_ID_OFFSET + inet_addr_id) : null; } @@ -1077,7 +1077,7 @@ public class ImportHostingAssets extends ImportOfficeData { return hive_id != null ? hives.get(HIVE_ID_OFFSET + hive_id) : null; } - private static HsHostingAssetRawEntity pac(final Integer packet_id) { + private static HsHostingAssetRealEntity pac(final Integer packet_id) { return packet_id != null ? hostingAssets.get(PACKET_ID_OFFSET + packet_id) : null; } @@ -1117,11 +1117,6 @@ public class ImportHostingAssets extends ImportOfficeData { .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); } - @Override - protected void assumeThatWeAreExplicitlyImportingOfficeData() { - assumeThat(false).isTrue(); - } - protected static boolean isImportingControlledTestData() { return MIGRATION_DATA_PATH.equals(TEST_DATA_MIGRATION_DATA_PATH); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java index dd1f7d2b..4e3e9e01 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.migration; import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountEntity; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.coopassets.HsOfficeCoopAssetsTransactionEntity; import net.hostsharing.hsadminng.hs.office.coopassets.HsOfficeCoopAssetsTransactionType; import net.hostsharing.hsadminng.hs.office.coopshares.HsOfficeCoopSharesTransactionEntity; @@ -14,10 +14,11 @@ import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerDetailsEntity; import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonType; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelation; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType; import net.hostsharing.hsadminng.hs.office.sepamandate.HsOfficeSepaMandateEntity; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -120,13 +121,13 @@ public class ImportOfficeData extends CsvDataImport { -1 ); - static Map contacts = new WriteOnceMap<>(); + static Map contacts = new WriteOnceMap<>(); static Map persons = new WriteOnceMap<>(); static Map partners = new WriteOnceMap<>(); static Map debitors = new WriteOnceMap<>(); static Map memberships = new WriteOnceMap<>(); - static Map relations = new WriteOnceMap<>(); + static Map relations = new WriteOnceMap<>(); static Map sepaMandates = new WriteOnceMap<>(); static Map bankAccounts = new WriteOnceMap<>(); static Map coopShares = new WriteOnceMap<>(); @@ -359,8 +360,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1030) void importSepaMandates() { - assumeThatWeAreExplicitlyImportingOfficeData(); - try (Reader reader = resourceReader(MIGRATION_DATA_PATH + "/office/sepa_mandates.csv")) { final var lines = readAllLines(reader); importSepaMandates(justHeader(lines), withoutHeader(lines)); @@ -372,7 +371,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1039) void verifySepaMandates() { - assumeThatWeAreExplicitlyImportingOfficeData(); assumeThatWeAreImportingControlledTestData(); assertThat(toFormattedString(bankAccounts)).isEqualToIgnoringWhitespace(""" @@ -402,8 +400,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1040) void importCoopShares() { - assumeThatWeAreExplicitlyImportingOfficeData(); - try (Reader reader = resourceReader(MIGRATION_DATA_PATH + "/office/share_transactions.csv")) { final var lines = readAllLines(reader); importCoopShares(justHeader(lines), withoutHeader(lines)); @@ -415,7 +411,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1041) void verifyCoopShares() { - assumeThatWeAreExplicitlyImportingOfficeData(); assumeThatWeAreImportingControlledTestData(); assertThat(toFormattedString(coopShares)).isEqualToIgnoringWhitespace(""" @@ -438,8 +433,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1050) void importCoopAssets() { - assumeThatWeAreExplicitlyImportingOfficeData(); - try (Reader reader = resourceReader(MIGRATION_DATA_PATH + "/office/asset_transactions.csv")) { final var lines = readAllLines(reader); importCoopAssets(justHeader(lines), withoutHeader(lines)); @@ -451,7 +444,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1059) void verifyCoopAssets() { - assumeThatWeAreExplicitlyImportingOfficeData(); assumeThatWeAreImportingControlledTestData(); assertThat(toFormattedString(coopAssets)).isEqualToIgnoringWhitespace(""" @@ -481,7 +473,6 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(1099) void verifyMemberships() { - assumeThatWeAreExplicitlyImportingOfficeData(); assumeThatWeAreImportingControlledTestData(); assertThat(toFormattedString(memberships)).isEqualToIgnoringWhitespace(""" @@ -692,8 +683,11 @@ public class ImportOfficeData extends CsvDataImport { } - protected void assumeThatWeAreExplicitlyImportingOfficeData() { - // not throwing AssumptionException + @Test + @Order(9190) + void verifyMembershipsActuallyPersisted() { + final var biCount = (Integer) em.createNativeQuery("SELECT count(*) FROM hs_office_membership", Integer.class).getSingleResult(); + assertThat(biCount).isGreaterThan(isImportingControlledTestData() ? 5 : 300); } private static boolean isImportingControlledTestData() { @@ -704,7 +698,7 @@ public class ImportOfficeData extends CsvDataImport { assumeThat(partners.size()).isLessThanOrEqualTo(MAX_NUMBER_OF_TEST_DATA_PARTNERS); } - private void updateLegacyIds( + private void updateLegacyIds( Map entities, final String legacyIdTable, final String legacyIdColumn) { @@ -978,7 +972,7 @@ public class ImportOfficeData extends CsvDataImport { contactPerson = addPerson(HsOfficePersonEntity.builder().build(), rec); } - final var contact = HsOfficeContactEntity.builder().build(); + final var contact = HsOfficeContactRealEntity.builder().build(); initContact(contact, rec); if (containsPartnerRel(rec)) { @@ -1052,12 +1046,12 @@ public class ImportOfficeData extends CsvDataImport { return containsRole(rec, "partner"); } - private static HsOfficeRelationEntity addRelation( + private static HsOfficeRelationRealEntity addRelation( final HsOfficeRelationType type, final HsOfficePersonEntity anchor, final HsOfficePersonEntity holder, - final HsOfficeContactEntity contact) { - final var rel = HsOfficeRelationEntity.builder() + final HsOfficeContactRealEntity contact) { + final var rel = HsOfficeRelationRealEntity.builder() .anchor(anchor) .holder(holder) .contact(contact) @@ -1117,7 +1111,7 @@ public class ImportOfficeData extends CsvDataImport { assertThat(unexpectedRolesSet).isEmpty(); } - private HsOfficeContactEntity initContact(final HsOfficeContactEntity contact, final Record contactRecord) { + private HsOfficeContactRealEntity initContact(final HsOfficeContactRealEntity contact, final Record contactRecord) { contact.setCaption(toCaption( contactRecord.getString("salut"), diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountControllerRestTest.java index d870ca1a..37f85f83 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/bankaccount/HsOfficeBankAccountControllerRestTest.java @@ -77,7 +77,7 @@ class HsOfficeBankAccountControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", is(testCase.expectedErrorMessage()))); + .andExpect(jsonPath("message", is("ERROR: [400] " + testCase.expectedErrorMessage()))); } enum InvalidBicTestCase { @@ -124,6 +124,6 @@ class HsOfficeBankAccountControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", is(testCase.expectedErrorMessage()))); + .andExpect(jsonPath("message", is("ERROR: [400] " + testCase.expectedErrorMessage()))); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactControllerAcceptanceTest.java index 2d171fcc..4bd2a4be 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactControllerAcceptanceTest.java @@ -45,7 +45,7 @@ class HsOfficeContactControllerAcceptanceTest extends ContextBasedTestWithCleanu Context contextMock; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRbacRepository contactRepo; @Autowired JpaAttempt jpaAttempt; @@ -355,10 +355,10 @@ class HsOfficeContactControllerAcceptanceTest extends ContextBasedTestWithCleanu } } - private HsOfficeContactEntity givenSomeTemporaryContactCreatedBy(final String creatingUser) { + private HsOfficeContactRbacEntity givenSomeTemporaryContactCreatedBy(final String creatingUser) { return jpaAttempt.transacted(() -> { context.define(creatingUser); - final var newContact = HsOfficeContactEntity.builder() + final var newContact = HsOfficeContactRbacEntity.builder() .uuid(UUID.randomUUID()) .caption("Temp from " + Context.getCallerMethodNameFromStackFrame(1) ) .emailAddresses(Map.of("main", RandomStringUtils.randomAlphabetic(10) + "@example.org")) @@ -375,7 +375,7 @@ class HsOfficeContactControllerAcceptanceTest extends ContextBasedTestWithCleanu void cleanup() { jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net", null); - em.createQuery("DELETE FROM HsOfficeContactEntity c WHERE c.caption LIKE 'Temp %'").executeUpdate(); + em.createQuery("DELETE FROM HsOfficeContactRbacEntity c WHERE c.caption LIKE 'Temp %'").executeUpdate(); }).assertSuccessful(); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactPatcherUnitTest.java similarity index 87% rename from src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcherUnitTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactPatcherUnitTest.java index a4c7cd38..95b4eb94 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactPatcherUnitTest.java @@ -13,9 +13,9 @@ import static net.hostsharing.hsadminng.mapper.PatchMap.patchMap; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS; @TestInstance(PER_CLASS) -class HsOfficeContactEntityPatcherUnitTest extends PatchUnitTestBase< +class HsOfficeContactPatcherUnitTest extends PatchUnitTestBase< HsOfficeContactPatchResource, - HsOfficeContactEntity + HsOfficeContactRbacEntity > { private static final UUID INITIAL_CONTACT_UUID = UUID.randomUUID(); @@ -42,8 +42,8 @@ class HsOfficeContactEntityPatcherUnitTest extends PatchUnitTestBase< ); @Override - protected HsOfficeContactEntity newInitialEntity() { - final var entity = new HsOfficeContactEntity(); + protected HsOfficeContactRbacEntity newInitialEntity() { + final var entity = new HsOfficeContactRbacEntity(); entity.setUuid(INITIAL_CONTACT_UUID); entity.setCaption("initial caption"); entity.putEmailAddresses(Map.ofEntries( @@ -64,7 +64,7 @@ class HsOfficeContactEntityPatcherUnitTest extends PatchUnitTestBase< } @Override - protected HsOfficeContactEntityPatcher createPatcher(final HsOfficeContactEntity entity) { + protected HsOfficeContactEntityPatcher createPatcher(final HsOfficeContactRbacEntity entity) { return new HsOfficeContactEntityPatcher(entity); } @@ -75,26 +75,26 @@ class HsOfficeContactEntityPatcherUnitTest extends PatchUnitTestBase< "caption", HsOfficeContactPatchResource::setCaption, "patched caption", - HsOfficeContactEntity::setCaption), + HsOfficeContactRbacEntity::setCaption), new SimpleProperty<>( "resources", HsOfficeContactPatchResource::setEmailAddresses, PATCH_EMAIL_ADDRESSES, - HsOfficeContactEntity::putEmailAddresses, + HsOfficeContactRbacEntity::putEmailAddresses, PATCHED_EMAIL_ADDRESSES) .notNullable(), new SimpleProperty<>( "resources", HsOfficeContactPatchResource::setPhoneNumbers, PATCH_PHONE_NUMBERS, - HsOfficeContactEntity::putPhoneNumbers, + HsOfficeContactRbacEntity::putPhoneNumbers, PATCHED_PHONE_NUMBERS) .notNullable(), new JsonNullableProperty<>( "patched given name", HsOfficeContactPatchResource::setPostalAddress, "patched given name", - HsOfficeContactEntity::setPostalAddress) + HsOfficeContactRbacEntity::setPostalAddress) ); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacRepositoryIntegrationTest.java similarity index 92% rename from src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRepositoryIntegrationTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacRepositoryIntegrationTest.java index 89a03f67..5f5e6190 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacRepositoryIntegrationTest.java @@ -21,7 +21,7 @@ import java.util.Arrays; import java.util.List; import java.util.function.Supplier; -import static net.hostsharing.hsadminng.hs.office.contact.TestHsOfficeContact.hsOfficeContact; +import static net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacTestEntity.hsOfficeContact; import static net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantEntity.distinctGrantDisplaysOf; import static net.hostsharing.hsadminng.rbac.rbacrole.RawRbacRoleEntity.distinctRoleNamesOf; import static net.hostsharing.hsadminng.rbac.test.JpaAttempt.attempt; @@ -29,10 +29,10 @@ import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest @Import( { Context.class, JpaAttempt.class }) -class HsOfficeContactRepositoryIntegrationTest extends ContextBasedTestWithCleanup { +class HsOfficeContactRbacRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRbacRepository contactRepo; @Autowired RawRbacRoleRepository rawRoleRepo; @@ -65,7 +65,7 @@ class HsOfficeContactRepositoryIntegrationTest extends ContextBasedTestWithClean // then result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsOfficeContactEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsOfficeContactRbacEntity::getUuid).isNotNull(); assertThatContactIsPersisted(result.returnedValue()); assertThat(contactRepo.count()).isEqualTo(count + 1); } @@ -82,7 +82,7 @@ class HsOfficeContactRepositoryIntegrationTest extends ContextBasedTestWithClean // then result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsOfficeContactEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsOfficeContactRbacEntity::getUuid).isNotNull(); assertThatContactIsPersisted(result.returnedValue()); assertThat(contactRepo.count()).isEqualTo(count + 1); } @@ -120,7 +120,7 @@ class HsOfficeContactRepositoryIntegrationTest extends ContextBasedTestWithClean )); } - private void assertThatContactIsPersisted(final HsOfficeContactEntity saved) { + private void assertThatContactIsPersisted(final HsOfficeContactRbacEntity saved) { final var found = contactRepo.findByUuid(saved.getUuid()); assertThat(found).isNotEmpty().get().extracting(Object::toString).isEqualTo(saved.toString()); } @@ -270,16 +270,16 @@ class HsOfficeContactRepositoryIntegrationTest extends ContextBasedTestWithClean "[creating contact test-data second contact, hs_office_contact, INSERT]"); } - private HsOfficeContactEntity givenSomeTemporaryContact( + private HsOfficeContactRbacEntity givenSomeTemporaryContact( final String createdByUser, - Supplier entitySupplier) { + Supplier entitySupplier) { return jpaAttempt.transacted(() -> { context(createdByUser); return toCleanup(contactRepo.save(entitySupplier.get())); }).assumeSuccessful().returnedValue(); } - private HsOfficeContactEntity givenSomeTemporaryContact(final String createdByUser) { + private HsOfficeContactRbacEntity givenSomeTemporaryContact(final String createdByUser) { final var random = RandomStringUtils.randomAlphabetic(12); return givenSomeTemporaryContact(createdByUser, () -> hsOfficeContact( @@ -287,15 +287,15 @@ class HsOfficeContactRepositoryIntegrationTest extends ContextBasedTestWithClean "some-temporary-contact" + random + "@example.com")); } - void exactlyTheseContactsAreReturned(final List actualResult, final String... contactCaptions) { + void exactlyTheseContactsAreReturned(final List actualResult, final String... contactCaptions) { assertThat(actualResult) - .extracting(HsOfficeContactEntity::getCaption) + .extracting(HsOfficeContactRbacEntity::getCaption) .containsExactlyInAnyOrder(contactCaptions); } - void allTheseContactsAreReturned(final List actualResult, final String... contactCaptions) { + void allTheseContactsAreReturned(final List actualResult, final String... contactCaptions) { assertThat(actualResult) - .extracting(HsOfficeContactEntity::getCaption) + .extracting(HsOfficeContactRbacEntity::getCaption) .contains(contactCaptions); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacTestEntity.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacTestEntity.java new file mode 100644 index 00000000..ba96f31b --- /dev/null +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRbacTestEntity.java @@ -0,0 +1,16 @@ +package net.hostsharing.hsadminng.hs.office.contact; + +import java.util.Map; + +public class HsOfficeContactRbacTestEntity { + + public static final HsOfficeContactRbacEntity TEST_RBAC_CONTACT = hsOfficeContact("some contact", "some-contact@example.com"); + + static public HsOfficeContactRbacEntity hsOfficeContact(final String caption, final String emailAddr) { + return HsOfficeContactRbacEntity.builder() + .caption(caption) + .postalAddress("address of " + caption) + .emailAddresses(Map.of("main", emailAddr)) + .build(); + } +} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealTestEntity.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealTestEntity.java new file mode 100644 index 00000000..d8cdfe1b --- /dev/null +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactRealTestEntity.java @@ -0,0 +1,16 @@ +package net.hostsharing.hsadminng.hs.office.contact; + +import java.util.Map; + +public class HsOfficeContactRealTestEntity { + + public static final HsOfficeContactRealEntity TEST_REAL_CONTACT = hsOfficeContact("some contact", "some-contact@example.com"); + + static public HsOfficeContactRealEntity hsOfficeContact(final String caption, final String emailAddr) { + return HsOfficeContactRealEntity.builder() + .caption(caption) + .postalAddress("address of " + caption) + .emailAddresses(Map.of("main", emailAddr)) + .build(); + } +} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactUnitTest.java similarity index 67% rename from src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityUnitTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactUnitTest.java index 43747418..94f8e0b8 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactUnitTest.java @@ -4,17 +4,17 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -class HsOfficeContactEntityUnitTest { +class HsOfficeContactUnitTest { @Test void toStringReturnsNullForNullContact() { - final HsOfficeContactEntity givenContact = null; + final HsOfficeContactRbacEntity givenContact = null; assertThat("" + givenContact).isEqualTo("null"); } @Test void toStringReturnsCaption() { - final var givenContact = HsOfficeContactEntity.builder().caption("given caption").build(); + final var givenContact = HsOfficeContactRbacEntity.builder().caption("given caption").build(); assertThat("" + givenContact).isEqualTo("contact(caption='given caption')"); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/TestHsOfficeContact.java b/src/test/java/net/hostsharing/hsadminng/hs/office/contact/TestHsOfficeContact.java deleted file mode 100644 index c104be32..00000000 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/contact/TestHsOfficeContact.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.hostsharing.hsadminng.hs.office.contact; - -import java.util.Map; - -public class TestHsOfficeContact { - - public static final HsOfficeContactEntity TEST_CONTACT = hsOfficeContact("some contact", "some-contact@example.com"); - - static public HsOfficeContactEntity hsOfficeContact(final String caption, final String emailAddr) { - return HsOfficeContactEntity.builder() - .caption(caption) - .postalAddress("address of " + caption) - .emailAddresses(Map.of("main", emailAddr)) - .build(); - } -} diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerRestTest.java index 0d33bf85..8176df09 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerRestTest.java @@ -124,7 +124,7 @@ class HsOfficeCoopAssetsTransactionControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", is(testCase.expectedErrorMessage))); + .andExpect(jsonPath("message", is("ERROR: [400] " + testCase.expectedErrorMessage))); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerRestTest.java index fec88cb0..6c126978 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerRestTest.java @@ -120,7 +120,7 @@ class HsOfficeCoopSharesTransactionControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", is(testCase.expectedErrorMessage))); + .andExpect(jsonPath("message", is("ERROR: [400] " + testCase.expectedErrorMessage))); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorControllerAcceptanceTest.java index 2fee9a31..68545a78 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorControllerAcceptanceTest.java @@ -5,11 +5,11 @@ import io.restassured.http.ContentType; import net.hostsharing.hsadminng.HsadminNgApplication; import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountRepository; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerRepository; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRepository; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; import org.json.JSONException; @@ -55,7 +55,7 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu HsOfficePartnerRepository partnerRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRealRepository contactrealRepo; @Autowired HsOfficeBankAccountRepository bankAccountRepo; @@ -64,7 +64,7 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu HsOfficePersonRepository personRepo; @Autowired - HsOfficeRelationRepository relRepo; + HsOfficeRelationRealRepository relrealRepo; @Autowired JpaAttempt jpaAttempt; @@ -268,13 +268,13 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu context.define("superuser-alex@hostsharing.net"); final var givenPartner = partnerRepo.findPartnerByOptionalNameLike("Third").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); final var givenBankAccount = bankAccountRepo.findByOptionalHolderLike("Fourth").get(0); final var givenBillingPerson = personRepo.findPersonByOptionalNameLike("Fourth").get(0); final var givenDebitorRelUUid = jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); - return relRepo.save(HsOfficeRelationEntity.builder() + return relrealRepo.save(HsOfficeRelationRealEntity.builder() .type(DEBITOR) .anchor(givenPartner.getPartnerRel().getHolder()) .holder(givenBillingPerson) @@ -325,7 +325,7 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu context.define("superuser-alex@hostsharing.net"); final var givenPartner = partnerRepo.findPartnerByOptionalNameLike("Third").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); final var location = RestAssured // @formatter:off .given() @@ -405,7 +405,7 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu .post("http://localhost/api/hs/office/debitors") .then().log().all().assertThat() .statusCode(400) - .body("message", is("Unable to find Contact with uuid 00000000-0000-0000-0000-000000000000")); + .body("message", is("ERROR: [400] Unable to find RealContact by debitorRel.contactUuid: 00000000-0000-0000-0000-000000000000")); // @formatter:on } @@ -414,9 +414,8 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu context.define("superuser-alex@hostsharing.net"); final var givenDebitorRelUuid = UUID.fromString("00000000-0000-0000-0000-000000000000"); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); - final var location = RestAssured // @formatter:off + RestAssured // @formatter:off .given() .header("current-user", "superuser-alex@hostsharing.net") .contentType(ContentType.JSON) @@ -434,7 +433,7 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu .post("http://localhost/api/hs/office/debitors") .then().log().all().assertThat() .statusCode(400) - .body("message", is("Unable to find HsOfficeRelationEntity with uuid 00000000-0000-0000-0000-000000000000")); + .body("message", is("ERROR: [400] Unable to find RealRelation by uuid: 00000000-0000-0000-0000-000000000000")); // @formatter:on } } @@ -551,7 +550,7 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu context.define("superuser-alex@hostsharing.net"); final var givenDebitor = givenSomeTemporaryDebitor(); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); final var location = RestAssured // @formatter:off .given() @@ -721,12 +720,12 @@ class HsOfficeDebitorControllerAcceptanceTest extends ContextBasedTestWithCleanu return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); final var givenPartner = partnerRepo.findPartnerByOptionalNameLike("Fourth").get(0).load(); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth contact").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth contact").get(0); final var newDebitor = HsOfficeDebitorEntity.builder() .debitorNumberSuffix(nextDebitorSuffix()) .billable(true) .debitorRel( - HsOfficeRelationEntity.builder() + HsOfficeRelationRealEntity.builder() .type(DEBITOR) .anchor(givenPartner.getPartnerRel().getHolder()) .holder(givenPartner.getPartnerRel().getHolder()) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcherUnitTest.java index 82e4d303..52ddb318 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityPatcherUnitTest.java @@ -2,7 +2,7 @@ package net.hostsharing.hsadminng.hs.office.debitor; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountEntity; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeDebitorPatchResource; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.rbac.test.PatchUnitTestBase; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestInstance; @@ -21,10 +21,7 @@ import static org.mockito.Mockito.lenient; @TestInstance(PER_CLASS) @ExtendWith(MockitoExtension.class) -class HsOfficeDebitorEntityPatcherUnitTest extends PatchUnitTestBase< - HsOfficeDebitorPatchResource, - HsOfficeDebitorEntity - > { +class HsOfficeDebitorEntityPatcherUnitTest extends PatchUnitTestBase { private static final UUID INITIAL_DEBITOR_UUID = UUID.randomUUID(); private static final UUID INITIAL_DEBITOR_REL_UUID = UUID.randomUUID(); @@ -44,20 +41,21 @@ class HsOfficeDebitorEntityPatcherUnitTest extends PatchUnitTestBase< private static final UUID INITIAL_REFUND_BANK_ACCOUNT_UUID = UUID.randomUUID(); private static final UUID PATCHED_REFUND_BANK_ACCOUNT_UUID = UUID.randomUUID(); - private final HsOfficeRelationEntity givenInitialDebitorRel = HsOfficeRelationEntity.builder() + private final HsOfficeRelationRealEntity givenInitialDebitorRel = HsOfficeRelationRealEntity.builder() .uuid(INITIAL_DEBITOR_REL_UUID) .build(); private final HsOfficeBankAccountEntity givenInitialBankAccount = HsOfficeBankAccountEntity.builder() .uuid(INITIAL_REFUND_BANK_ACCOUNT_UUID) .build(); + @Mock private EntityManager em; @BeforeEach void initMocks() { - lenient().when(em.getReference(eq(HsOfficeRelationEntity.class), any())).thenAnswer(invocation -> - HsOfficeRelationEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsOfficeRelationRealEntity.class), any())).thenAnswer(invocation -> + HsOfficeRelationRealEntity.builder().uuid(invocation.getArgument(1)).build()); lenient().when(em.getReference(eq(HsOfficeBankAccountEntity.class), any())).thenAnswer(invocation -> HsOfficeBankAccountEntity.builder().uuid(invocation.getArgument(1)).build()); } @@ -141,8 +139,8 @@ class HsOfficeDebitorEntityPatcherUnitTest extends PatchUnitTestBase< ); } - private HsOfficeRelationEntity newDebitorRel(final UUID uuid) { - return HsOfficeRelationEntity.builder() + private HsOfficeRelationRealEntity newDebitorRel(final UUID uuid) { + return HsOfficeRelationRealEntity.builder() .uuid(uuid) .build(); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityUnitTest.java index e1250775..5dc61235 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorEntityUnitTest.java @@ -1,17 +1,17 @@ package net.hostsharing.hsadminng.hs.office.debitor; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonType; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class HsOfficeDebitorEntityUnitTest { - private HsOfficeRelationEntity givenDebitorRel = HsOfficeRelationEntity.builder() + private HsOfficeRelationRealEntity givenDebitorRel = HsOfficeRelationRealEntity.builder() .anchor(HsOfficePersonEntity.builder() .personType(HsOfficePersonType.LEGAL_PERSON) .tradeName("some partner trade name") @@ -20,7 +20,7 @@ class HsOfficeDebitorEntityUnitTest { .personType(HsOfficePersonType.LEGAL_PERSON) .tradeName("some billing trade name") .build()) - .contact(HsOfficeContactEntity.builder().caption("some caption").build()) + .contact(HsOfficeContactRealEntity.builder().caption("some caption").build()) .build(); @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java index fabc93e7..d2960862 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java @@ -2,10 +2,11 @@ package net.hostsharing.hsadminng.hs.office.debitor; import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountRepository; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerRepository; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelation; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; @@ -49,7 +50,7 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean HsOfficePartnerRepository partnerRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRealRepository contactrealRepo; @Autowired HsOfficePersonRepository personRepo; @@ -84,14 +85,14 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean final var count = debitorRepo.count(); final var givenPartner = partnerRepo.findPartnerByPartnerNumber(10001); final var givenPartnerPerson = one(personRepo.findPersonByOptionalNameLike("First GmbH")); - final var givenContact = one(contactRepo.findContactByOptionalCaptionLike("first contact")); + final var givenContact = one(contactrealRepo.findContactByOptionalCaptionLike("first contact")); // when final var result = attempt(em, () -> { final var newDebitor = HsOfficeDebitorEntity.builder() .partner(givenPartner) .debitorNumberSuffix("21") - .debitorRel(HsOfficeRelationEntity.builder() + .debitorRel(HsOfficeRelationRealEntity.builder() .type(HsOfficeRelationType.DEBITOR) .anchor(givenPartnerPerson) .holder(givenPartnerPerson) @@ -118,13 +119,13 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean // given context("superuser-alex@hostsharing.net"); final var givenPartnerPerson = one(personRepo.findPersonByOptionalNameLike("First GmbH")); - final var givenContact = one(contactRepo.findContactByOptionalCaptionLike("first contact")); + final var givenContact = one(contactrealRepo.findContactByOptionalCaptionLike("first contact")); // when final var result = attempt(em, () -> { final var newDebitor = HsOfficeDebitorEntity.builder() .debitorNumberSuffix("21") - .debitorRel(HsOfficeRelationEntity.builder() + .debitorRel(HsOfficeRelationRealEntity.builder() .type(HsOfficeRelationType.DEBITOR) .anchor(givenPartnerPerson) .holder(givenPartnerPerson) @@ -156,10 +157,10 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean attempt(em, () -> { final var givenPartnerPerson = one(personRepo.findPersonByOptionalNameLike("First GmbH")); final var givenDebitorPerson = one(personRepo.findPersonByOptionalNameLike("Fourth eG")); - final var givenContact = one(contactRepo.findContactByOptionalCaptionLike("fourth contact")); + final var givenContact = one(contactrealRepo.findContactByOptionalCaptionLike("fourth contact")); final var newDebitor = HsOfficeDebitorEntity.builder() .debitorNumberSuffix("22") - .debitorRel(HsOfficeRelationEntity.builder() + .debitorRel(HsOfficeRelationRealEntity.builder() .type(HsOfficeRelationType.DEBITOR) .anchor(givenPartnerPerson) .holder(givenDebitorPerson) @@ -322,7 +323,7 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean "hs_office_relation#FourtheG-with-DEBITOR-FourtheG:ADMIN", true); final var givenNewPartnerPerson = one(personRepo.findPersonByOptionalNameLike("First")); final var givenNewBillingPerson = one(personRepo.findPersonByOptionalNameLike("Firby")); - final var givenNewContact = one(contactRepo.findContactByOptionalCaptionLike("sixth contact")); + final var givenNewContact = one(contactrealRepo.findContactByOptionalCaptionLike("sixth contact")); final var givenNewBankAccount = one(bankAccountRepo.findByOptionalHolderLike("first")); final String givenNewVatId = "NEW-VAT-ID"; final String givenNewVatCountryCode = "NC"; @@ -331,7 +332,7 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - givenDebitor.setDebitorRel(HsOfficeRelationEntity.builder() + givenDebitor.setDebitorRel(HsOfficeRelationRealEntity.builder() .type(HsOfficeRelationType.DEBITOR) .anchor(givenNewPartnerPerson) .holder(givenNewBillingPerson) @@ -488,7 +489,7 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean if (withPartner) { assertThat(foundEntity.getPartner()).isNotNull(); } - assertThat(foundEntity.getDebitorRel()).extracting(HsOfficeRelationEntity::toString) + assertThat(foundEntity.getDebitorRel()).extracting(HsOfficeRelation::toString) .isEqualTo(saved.getDebitorRel().toString()); }); } @@ -610,13 +611,13 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean context("superuser-alex@hostsharing.net"); final var givenPartner = one(partnerRepo.findPartnerByOptionalNameLike(partnerName)); final var givenPartnerPerson = givenPartner.getPartnerRel().getHolder(); - final var givenContact = one(contactRepo.findContactByOptionalCaptionLike(contactCaption)); + final var givenContact = one(contactrealRepo.findContactByOptionalCaptionLike(contactCaption)); final var givenBankAccount = bankAccountHolder != null ? one(bankAccountRepo.findByOptionalHolderLike(bankAccountHolder)) : null; final var newDebitor = HsOfficeDebitorEntity.builder() .partner(givenPartner) .debitorNumberSuffix("20") - .debitorRel(HsOfficeRelationEntity.builder() + .debitorRel(HsOfficeRelationRealEntity.builder() .type(HsOfficeRelationType.DEBITOR) .anchor(givenPartnerPerson) .holder(givenPartnerPerson) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/TestHsOfficeDebitor.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/TestHsOfficeDebitor.java index b8ddf8b5..a3df1026 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/TestHsOfficeDebitor.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/TestHsOfficeDebitor.java @@ -2,9 +2,9 @@ package net.hostsharing.hsadminng.hs.office.debitor; import lombok.experimental.UtilityClass; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; -import static net.hostsharing.hsadminng.hs.office.contact.TestHsOfficeContact.TEST_CONTACT; +import static net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealTestEntity.TEST_REAL_CONTACT; import static net.hostsharing.hsadminng.hs.office.partner.TestHsOfficePartner.TEST_PARTNER; @UtilityClass @@ -14,10 +14,10 @@ public class TestHsOfficeDebitor { public static final HsOfficeDebitorEntity TEST_DEBITOR = HsOfficeDebitorEntity.builder() .debitorNumberSuffix(DEFAULT_DEBITOR_SUFFIX) - .debitorRel(HsOfficeRelationEntity.builder() + .debitorRel(HsOfficeRelationRealEntity.builder() .holder(HsOfficePersonEntity.builder().build()) .anchor(HsOfficePersonEntity.builder().build()) - .contact(TEST_CONTACT) + .contact(TEST_REAL_CONTACT) .build()) .partner(TEST_PARTNER) .defaultPrefix("abc") diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java index bcd7e9ab..7c62859b 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java @@ -85,7 +85,8 @@ public class HsOfficeMembershipControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", is("[partnerUuid must not be null but is \"null\"]"))); + // FYI: the brackets around the message are here because it's actually an array, in this case of size 1 + .andExpect(jsonPath("message", is("ERROR: [400] [partnerUuid must not be null but is \"null\"]"))); } @Test @@ -114,7 +115,7 @@ public class HsOfficeMembershipControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", is("Unable to find Partner with uuid " + givenPartnerUuid))); + .andExpect(jsonPath("message", is("ERROR: [400] Unable to find Partner by uuid: " + givenPartnerUuid))); } @ParameterizedTest 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 1bf30d14..fc7287e4 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 @@ -3,12 +3,13 @@ package net.hostsharing.hsadminng.hs.office.partner; import io.restassured.RestAssured; import io.restassured.http.ContentType; import net.hostsharing.hsadminng.HsadminNgApplication; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRepository; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelation; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealRepository; import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; @@ -41,13 +42,13 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu HsOfficePartnerRepository partnerRepo; @Autowired - HsOfficeRelationRepository relationRepo; + HsOfficeRelationRealRepository relationRepo; @Autowired HsOfficePersonRepository personRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRealRepository contactrealRepo; @Autowired JpaAttempt jpaAttempt; @@ -91,7 +92,7 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu context.define("superuser-alex@hostsharing.net"); final var givenMandantPerson = personRepo.findPersonByOptionalNameLike("Hostsharing eG").stream().findFirst().orElseThrow(); final var givenPerson = personRepo.findPersonByOptionalNameLike("Third").stream().findFirst().orElseThrow(); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").stream().findFirst().orElseThrow(); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").stream().findFirst().orElseThrow(); final var location = RestAssured // @formatter:off .given() @@ -179,7 +180,7 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu .post("http://localhost/api/hs/office/partners") .then().log().all().assertThat() .statusCode(400) - .body("message", is("Unable to find " + HsOfficeContactEntity.class.getName() + " with id " + GIVEN_NON_EXISTING_UUID)); + .body("message", is("ERROR: [400] Unable to find " + HsOfficeContactRealEntity.class.getName() + " with id " + GIVEN_NON_EXISTING_UUID)); // @formatter:on } @@ -188,7 +189,7 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu context.define("superuser-alex@hostsharing.net"); final var mandantPerson = personRepo.findPersonByOptionalNameLike("Hostsharing eG").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); final var location = RestAssured // @formatter:off .given() @@ -217,7 +218,10 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu .post("http://localhost/api/hs/office/partners") .then().log().all().assertThat() .statusCode(400) - .body("message", is("Unable to find " + HsOfficePersonEntity.class.getName() + " with id " + GIVEN_NON_EXISTING_UUID)); + // TODO.impl: we want this error message: + // .body("message", is("ERROR: [400] Unable to find Person by uuid: " + GIVEN_NON_EXISTING_UUID)); + // but ModelMapper creates this error message: + .body("message", is("ERROR: [400] Unable to find " + HsOfficePersonEntity.class.getName() + " with id " + GIVEN_NON_EXISTING_UUID)); // @formatter:on } } @@ -405,7 +409,7 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu // and an ex-partner-relation got created final var anchorpartnerPersonUUid = givenPartner.getPartnerRel().getAnchor().getUuid(); assertThat(relationRepo.findRelationRelatedToPersonUuidAndRelationType(anchorpartnerPersonUUid, EX_PARTNER)) - .map(HsOfficeRelationEntity::toShortString) + .map(HsOfficeRelation::toShortString) .contains("rel(anchor='LP Hostsharing eG', type='EX_PARTNER', holder='UF Erben Bessler')"); } @@ -516,16 +520,16 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu } } - private HsOfficeRelationEntity givenSomeTemporaryPartnerRel( + private HsOfficeRelationRealEntity givenSomeTemporaryPartnerRel( final String partnerHolderName, final String contactName) { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); final var givenMandantPerson = personRepo.findPersonByOptionalNameLike("Hostsharing eG").stream().findFirst().orElseThrow(); final var givenPerson = personRepo.findPersonByOptionalNameLike(partnerHolderName).stream().findFirst().orElseThrow(); - final var givenContact = contactRepo.findContactByOptionalCaptionLike(contactName).stream().findFirst().orElseThrow(); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike(contactName).stream().findFirst().orElseThrow(); - final var partnerRel = new HsOfficeRelationEntity(); + final var partnerRel = new HsOfficeRelationRealEntity(); partnerRel.setType(HsOfficeRelationType.PARTNER); partnerRel.setAnchor(givenMandantPerson); partnerRel.setHolder(givenPerson); @@ -557,6 +561,6 @@ class HsOfficePartnerControllerAcceptanceTest extends ContextBasedTestWithCleanu cleanupAllNew(HsOfficePartnerEntity.class); // TODO: should not be necessary anymore, once it's deleted via after delete trigger - cleanupAllNew(HsOfficeRelationEntity.class); + cleanupAllNew(HsOfficeRelationRealEntity.class); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerRestTest.java index e6e7fb7e..97b56052 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerControllerRestTest.java @@ -1,10 +1,10 @@ package net.hostsharing.hsadminng.hs.office.partner; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRepository; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealRepository; import net.hostsharing.hsadminng.mapper.Mapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -54,7 +54,7 @@ class HsOfficePartnerControllerRestTest { HsOfficePartnerRepository partnerRepo; @MockBean - HsOfficeRelationRepository relationRepo; + HsOfficeRelationRealRepository relationRepo; @MockBean EntityManager em; @@ -69,7 +69,7 @@ class HsOfficePartnerControllerRestTest { HsOfficePersonEntity personMock; @Mock - HsOfficeContactEntity contactMock; + HsOfficeContactRbacEntity contactMock; @Mock HsOfficePartnerEntity partnerMock; @@ -83,7 +83,7 @@ class HsOfficePartnerControllerRestTest { lenient().when(em.getReference(HsOfficePersonEntity.class, GIVEN_MANDANTE_UUID)).thenReturn(mandateMock); lenient().when(em.getReference(HsOfficePersonEntity.class, GIVEN_PERSON_UUID)).thenReturn(personMock); - lenient().when(em.getReference(HsOfficeContactEntity.class, GIVEN_CONTACT_UUID)).thenReturn(contactMock); + lenient().when(em.getReference(HsOfficeContactRbacEntity.class, GIVEN_CONTACT_UUID)).thenReturn(contactMock); lenient().when(em.getReference(any(), eq(GIVEN_INVALID_UUID))).thenThrow(EntityNotFoundException.class); } @@ -124,7 +124,7 @@ class HsOfficePartnerControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", startsWith("Cannot resolve HsOfficePersonEntity with uuid "))); + .andExpect(jsonPath("message", startsWith("ERROR: [400] Cannot resolve HsOfficePersonEntity with uuid "))); } @Test @@ -161,7 +161,7 @@ class HsOfficePartnerControllerRestTest { .andExpect(status().is4xxClientError()) .andExpect(jsonPath("statusCode", is(400))) .andExpect(jsonPath("statusPhrase", is("Bad Request"))) - .andExpect(jsonPath("message", startsWith("Cannot resolve HsOfficeContactEntity with uuid "))); + .andExpect(jsonPath("message", startsWith("ERROR: [400] Cannot resolve HsOfficeContactRealEntity with uuid "))); } } @@ -176,7 +176,7 @@ class HsOfficePartnerControllerRestTest { when(partnerRepo.deleteByUuid(givenPartnerUuid)).thenReturn(0); final UUID givenRelationUuid = UUID.randomUUID(); - when(partnerMock.getPartnerRel()).thenReturn(HsOfficeRelationEntity.builder() + when(partnerMock.getPartnerRel()).thenReturn(HsOfficeRelationRealEntity.builder() .uuid(givenRelationUuid) .build()); when(relationRepo.deleteByUuid(givenRelationUuid)).thenReturn(0); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntityPatcherUnitTest.java index 10cb6016..8a3c0084 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerDetailsEntityPatcherUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.office.partner; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRbacEntity; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficePartnerDetailsPatchResource; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.rbac.test.PatchUnitTestBase; @@ -43,8 +43,8 @@ class HsOfficePartnerDetailsEntityPatcherUnitTest extends PatchUnitTestBase< @BeforeEach void initMocks() { - lenient().when(em.getReference(eq(HsOfficeContactEntity.class), any())).thenAnswer(invocation -> - HsOfficeContactEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsOfficeContactRbacEntity.class), any())).thenAnswer(invocation -> + HsOfficeContactRbacEntity.builder().uuid(invocation.getArgument(1)).build()); lenient().when(em.getReference(eq(HsOfficePersonEntity.class), any())).thenAnswer(invocation -> HsOfficePersonEntity.builder().uuid(invocation.getArgument(1)).build()); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityPatcherUnitTest.java index 6cc072b3..a2ed7ca5 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityPatcherUnitTest.java @@ -1,9 +1,9 @@ package net.hostsharing.hsadminng.hs.office.partner; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficePartnerPatchResource; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.rbac.test.PatchUnitTestBase; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestInstance; @@ -36,7 +36,7 @@ class HsOfficePartnerEntityPatcherUnitTest extends PatchUnitTestBase< private final HsOfficePersonEntity givenInitialPerson = HsOfficePersonEntity.builder() .uuid(INITIAL_PERSON_UUID) .build(); - private final HsOfficeContactEntity givenInitialContact = HsOfficeContactEntity.builder() + private final HsOfficeContactRealEntity givenInitialContact = HsOfficeContactRealEntity.builder() .uuid(INITIAL_CONTACT_UUID) .build(); @@ -48,8 +48,8 @@ class HsOfficePartnerEntityPatcherUnitTest extends PatchUnitTestBase< @BeforeEach void initMocks() { - lenient().when(em.getReference(eq(HsOfficeRelationEntity.class), any())).thenAnswer(invocation -> - HsOfficeRelationEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsOfficeRelationRealEntity.class), any())).thenAnswer(invocation -> + HsOfficeRelationRealEntity.builder().uuid(invocation.getArgument(1)).build()); } @Override @@ -57,7 +57,7 @@ class HsOfficePartnerEntityPatcherUnitTest extends PatchUnitTestBase< final var entity = HsOfficePartnerEntity.builder() .uuid(INITIAL_PARTNER_UUID) .partnerNumber(12345) - .partnerRel(HsOfficeRelationEntity.builder() + .partnerRel(HsOfficeRelationRealEntity.builder() .holder(givenInitialPerson) .contact(givenInitialContact) .build()) @@ -89,10 +89,9 @@ class HsOfficePartnerEntityPatcherUnitTest extends PatchUnitTestBase< ); } - private static HsOfficeRelationEntity newPartnerRel(final UUID uuid) { - final var newPartnerRel = HsOfficeRelationEntity.builder() + private static HsOfficeRelationRealEntity newPartnerRel(final UUID uuid) { + return HsOfficeRelationRealEntity.builder() .uuid(uuid) .build(); - return newPartnerRel; } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityUnitTest.java index dd373e98..3cf07cab 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntityUnitTest.java @@ -1,9 +1,9 @@ package net.hostsharing.hsadminng.hs.office.partner; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonType; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType; import org.junit.jupiter.api.Test; @@ -13,7 +13,7 @@ class HsOfficePartnerEntityUnitTest { private final HsOfficePartnerEntity givenPartner = HsOfficePartnerEntity.builder() .partnerNumber(12345) - .partnerRel(HsOfficeRelationEntity.builder() + .partnerRel(HsOfficeRelationRealEntity.builder() .anchor(HsOfficePersonEntity.builder() .personType(HsOfficePersonType.LEGAL_PERSON) .tradeName("Hostsharing eG") @@ -23,7 +23,7 @@ class HsOfficePartnerEntityUnitTest { .personType(HsOfficePersonType.LEGAL_PERSON) .tradeName("some trade name") .build()) - .contact(HsOfficeContactEntity.builder().caption("some caption").build()) + .contact(HsOfficeContactRealEntity.builder().caption("some caption").build()) .build()) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepositoryIntegrationTest.java index ecf645d7..e365d183 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerRepositoryIntegrationTest.java @@ -1,10 +1,10 @@ package net.hostsharing.hsadminng.hs.office.partner; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRepository; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealRepository; import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; @@ -42,13 +42,13 @@ class HsOfficePartnerRepositoryIntegrationTest extends ContextBasedTestWithClean HsOfficePartnerRepository partnerRepo; @Autowired - HsOfficeRelationRepository relationRepo; + HsOfficeRelationRealRepository relationRepo; @Autowired HsOfficePersonRepository personRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRealRepository contactrealRepo; @Autowired RawRbacObjectRepository rawObjectRepo; @@ -109,10 +109,10 @@ class HsOfficePartnerRepositoryIntegrationTest extends ContextBasedTestWithClean // when attempt(em, () -> { final var givenPartnerPerson = personRepo.findPersonByOptionalNameLike("Erben Bessler").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth contact").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth contact").get(0); final var givenMandantPerson = personRepo.findPersonByOptionalNameLike("Hostsharing eG").get(0); - final var newRelation = HsOfficeRelationEntity.builder() + final var newRelation = HsOfficeRelationRealEntity.builder() .holder(givenPartnerPerson) .type(HsOfficeRelationType.PARTNER) .anchor(givenMandantPerson) @@ -329,7 +329,8 @@ class HsOfficePartnerRepositoryIntegrationTest extends ContextBasedTestWithClean // then result.assertExceptionWithRootCauseMessage(JpaSystemException.class, - "[403] insert into hs_office_partner_details not allowed for current subjects {hs_office_relation#HostsharingeG-with-PARTNER-ErbenBesslerMelBessler:TENANT}"); + "ERROR: [403] insert into hs_office_partner_details ", + " not allowed for current subjects {hs_office_relation#HostsharingeG-with-PARTNER-ErbenBesslerMelBessler:TENANT}"); } private void assertThatPartnerActuallyInDatabase(final HsOfficePartnerEntity saved) { @@ -462,12 +463,12 @@ class HsOfficePartnerRepositoryIntegrationTest extends ContextBasedTestWithClean }).assertSuccessful().returnedValue(); } - private HsOfficeRelationEntity givenSomeTemporaryHostsharingPartnerRel(final String person, final String contact) { + private HsOfficeRelationRealEntity givenSomeTemporaryHostsharingPartnerRel(final String person, final String contact) { final var givenMandantorPerson = personRepo.findPersonByOptionalNameLike("Hostsharing eG").get(0); final var givenPartnerPerson = personRepo.findPersonByOptionalNameLike(person).get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike(contact).get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike(contact).get(0); - final var partnerRel = HsOfficeRelationEntity.builder() + final var partnerRel = HsOfficeRelationRealEntity.builder() .holder(givenPartnerPerson) .type(HsOfficeRelationType.PARTNER) .anchor(givenMandantorPerson) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/TestHsOfficePartner.java b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/TestHsOfficePartner.java index 5fa6c156..1d3b8164 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/partner/TestHsOfficePartner.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/partner/TestHsOfficePartner.java @@ -1,8 +1,8 @@ package net.hostsharing.hsadminng.hs.office.partner; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; -import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationEntity; +import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationRealEntity; import net.hostsharing.hsadminng.hs.office.relation.HsOfficeRelationType; import static net.hostsharing.hsadminng.hs.office.person.HsOfficePersonType.LEGAL_PERSON; @@ -15,7 +15,7 @@ public class TestHsOfficePartner { return HsOfficePartnerEntity.builder() .partnerNumber(10001) .partnerRel( - HsOfficeRelationEntity.builder() + HsOfficeRelationRealEntity.builder() .holder(HsOfficePersonEntity.builder() .personType(LEGAL_PERSON) .tradeName("Hostsharing eG") @@ -25,7 +25,7 @@ public class TestHsOfficePartner { .personType(LEGAL_PERSON) .tradeName(tradeName) .build()) - .contact(HsOfficeContactEntity.builder() + .contact(HsOfficeContactRealEntity.builder() .caption(tradeName) .build()) .build() diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java index 636975eb..4f397199 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationControllerAcceptanceTest.java @@ -2,10 +2,10 @@ package net.hostsharing.hsadminng.hs.office.relation; import io.restassured.RestAssured; import io.restassured.http.ContentType; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.HsadminNgApplication; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeRelationTypeResource; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; @@ -43,13 +43,13 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean Context contextMock; @Autowired - HsOfficeRelationRepository relationRepo; + HsOfficeRelationRealRepository relationrealRepo; @Autowired HsOfficePersonRepository personRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRealRepository contactrealRepo; @Autowired JpaAttempt jpaAttempt; @@ -125,7 +125,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean context.define("superuser-alex@hostsharing.net"); final var givenAnchorPerson = personRepo.findPersonByOptionalNameLike("Third").get(0); final var givenHolderPerson = personRepo.findPersonByOptionalNameLike("Paul").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("second").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("second").get(0); final var location = RestAssured // @formatter:off .given() @@ -161,7 +161,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .extract().header("Location"); // @formatter:on // finally, the new relation can be accessed under the generated UUID - final var newUserUuid = toCleanup(HsOfficeRelationEntity.class, UUID.fromString( + final var newUserUuid = toCleanup(HsOfficeRelation.class, UUID.fromString( location.substring(location.lastIndexOf('/') + 1))); assertThat(newUserUuid).isNotNull(); } @@ -172,7 +172,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean context.define("superuser-alex@hostsharing.net"); final var givenAnchorPersonUuid = GIVEN_NON_EXISTING_HOLDER_PERSON_UUID; final var givenHolderPerson = personRepo.findPersonByOptionalNameLike("Smith").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); final var location = RestAssured // @formatter:off .given() @@ -195,7 +195,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .post("http://localhost/api/hs/office/relations") .then().log().all().assertThat() .statusCode(404) - .body("message", is("cannot find anchorUuid " + GIVEN_NON_EXISTING_HOLDER_PERSON_UUID)); + .body("message", is("ERROR: [404] cannot find Person by anchorUuid: " + GIVEN_NON_EXISTING_HOLDER_PERSON_UUID)); // @formatter:on } @@ -204,7 +204,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean context.define("superuser-alex@hostsharing.net"); final var givenAnchorPerson = personRepo.findPersonByOptionalNameLike("Third").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); final var location = RestAssured // @formatter:off .given() @@ -227,7 +227,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .post("http://localhost/api/hs/office/relations") .then().log().all().assertThat() .statusCode(404) - .body("message", is("cannot find holderUuid " + GIVEN_NON_EXISTING_HOLDER_PERSON_UUID)); + .body("message", is("ERROR: [404] cannot find Person by holderUuid: " + GIVEN_NON_EXISTING_HOLDER_PERSON_UUID)); // @formatter:on } @@ -250,7 +250,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean "holderUuid": "%s", "contactUuid": "%s" } - """.formatted( + """.formatted( HsOfficeRelationTypeResource.DEBITOR, givenAnchorPerson.getUuid(), givenHolderPerson.getUuid(), @@ -260,7 +260,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .post("http://localhost/api/hs/office/relations") .then().log().all().assertThat() .statusCode(404) - .body("message", is("cannot find contactUuid 00000000-0000-0000-0000-000000000000")); + .body("message", is("ERROR: [404] cannot find Contact by contactUuid: 00000000-0000-0000-0000-000000000000")); // @formatter:on } } @@ -331,12 +331,12 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean } } - private HsOfficeRelationEntity findRelation( + private HsOfficeRelation findRelation( final String anchorPersonName, final String holderPersoneName) { final var anchorPersonUuid = personRepo.findPersonByOptionalNameLike(anchorPersonName).get(0).getUuid(); final var holderPersonUuid = personRepo.findPersonByOptionalNameLike(holderPersoneName).get(0).getUuid(); - final var givenRelation = relationRepo + final var givenRelation = relationrealRepo .findRelationRelatedToPersonUuid(anchorPersonUuid) .stream() .filter(r -> r.getHolder().getUuid().equals(holderPersonUuid)) @@ -353,7 +353,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean context.define("superuser-alex@hostsharing.net"); final var givenRelation = givenSomeTemporaryRelationBessler(); assertThat(givenRelation.getContact().getCaption()).isEqualTo("seventh contact"); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth").get(0); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth").get(0); RestAssured // @formatter:off .given() @@ -379,7 +379,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean // finally, the relation is actually updated context.define("superuser-alex@hostsharing.net"); - assertThat(relationRepo.findByUuid(givenRelation.getUuid())).isPresent().get() + assertThat(relationrealRepo.findByUuid(givenRelation.getUuid())).isPresent().get() .matches(rel -> { assertThat(rel.getAnchor().getTradeName()).contains("Bessler"); assertThat(rel.getHolder().getFamilyName()).contains("Winkler"); @@ -408,7 +408,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .statusCode(204); // @formatter:on // then the given relation is gone - assertThat(relationRepo.findByUuid(givenRelation.getUuid())).isEmpty(); + assertThat(relationrealRepo.findByUuid(givenRelation.getUuid())).isEmpty(); } @Test @@ -427,7 +427,7 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .statusCode(403); // @formatter:on // then the given relation is still there - assertThat(relationRepo.findByUuid(givenRelation.getUuid())).isNotEmpty(); + assertThat(relationrealRepo.findByUuid(givenRelation.getUuid())).isNotEmpty(); } @Test @@ -446,24 +446,24 @@ class HsOfficeRelationControllerAcceptanceTest extends ContextBasedTestWithClean .statusCode(404); // @formatter:on // then the given relation is still there - assertThat(relationRepo.findByUuid(givenRelation.getUuid())).isNotEmpty(); + assertThat(relationrealRepo.findByUuid(givenRelation.getUuid())).isNotEmpty(); } } - private HsOfficeRelationEntity givenSomeTemporaryRelationBessler() { + private HsOfficeRelation givenSomeTemporaryRelationBessler() { return jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net"); final var givenAnchorPerson = personRepo.findPersonByOptionalNameLike("Erben Bessler").get(0); final var givenHolderPerson = personRepo.findPersonByOptionalNameLike("Winkler").get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("seventh contact").get(0); - final var newRelation = HsOfficeRelationEntity.builder() + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("seventh contact").get(0); + final var newRelation = HsOfficeRelationRealEntity.builder() .type(HsOfficeRelationType.REPRESENTATIVE) .anchor(givenAnchorPerson) .holder(givenHolderPerson) .contact(givenContact) .build(); - assertThat(toCleanup(relationRepo.save(newRelation))).isEqualTo(newRelation); + assertThat(toCleanup(relationrealRepo.save(newRelation))).isEqualTo(newRelation); return newRelation; }).assertSuccessful().returnedValue(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationPatcherUnitTest.java similarity index 76% rename from src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcherUnitTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationPatcherUnitTest.java index 823d1c61..2fc9b95e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationPatcherUnitTest.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.hs.office.relation; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealEntity; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeRelationPatchResource; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.rbac.test.PatchUnitTestBase; @@ -21,9 +21,9 @@ import static org.mockito.Mockito.lenient; @TestInstance(PER_CLASS) @ExtendWith(MockitoExtension.class) -class HsOfficeRelationEntityPatcherUnitTest extends PatchUnitTestBase< +class HsOfficeRelationPatcherUnitTest extends PatchUnitTestBase< HsOfficeRelationPatchResource, - HsOfficeRelationEntity + HsOfficeRelation > { static final UUID INITIAL_RELATION_UUID = UUID.randomUUID(); @@ -34,8 +34,8 @@ class HsOfficeRelationEntityPatcherUnitTest extends PatchUnitTestBase< @BeforeEach void initMocks() { - lenient().when(em.getReference(eq(HsOfficeContactEntity.class), any())).thenAnswer(invocation -> - HsOfficeContactEntity.builder().uuid(invocation.getArgument(1)).build()); + lenient().when(em.getReference(eq(HsOfficeContactRealEntity.class), any())).thenAnswer(invocation -> + HsOfficeContactRealEntity.builder().uuid(invocation.getArgument(1)).build()); } final HsOfficePersonEntity givenInitialAnchorPerson = HsOfficePersonEntity.builder() @@ -44,13 +44,13 @@ class HsOfficeRelationEntityPatcherUnitTest extends PatchUnitTestBase< final HsOfficePersonEntity givenInitialHolderPerson = HsOfficePersonEntity.builder() .uuid(UUID.randomUUID()) .build(); - final HsOfficeContactEntity givenInitialContact = HsOfficeContactEntity.builder() + final HsOfficeContactRealEntity givenInitialContact = HsOfficeContactRealEntity.builder() .uuid(UUID.randomUUID()) .build(); @Override - protected HsOfficeRelationEntity newInitialEntity() { - final var entity = new HsOfficeRelationEntity(); + protected HsOfficeRelation newInitialEntity() { + final var entity = new HsOfficeRelationRbacEntity(); entity.setUuid(INITIAL_RELATION_UUID); entity.setType(HsOfficeRelationType.REPRESENTATIVE); entity.setAnchor(givenInitialAnchorPerson); @@ -65,7 +65,7 @@ class HsOfficeRelationEntityPatcherUnitTest extends PatchUnitTestBase< } @Override - protected HsOfficeRelationEntityPatcher createPatcher(final HsOfficeRelationEntity relation) { + protected HsOfficeRelationEntityPatcher createPatcher(final HsOfficeRelation relation) { return new HsOfficeRelationEntityPatcher(em, relation); } @@ -76,15 +76,13 @@ class HsOfficeRelationEntityPatcherUnitTest extends PatchUnitTestBase< "contact", HsOfficeRelationPatchResource::setContactUuid, PATCHED_CONTACT_UUID, - HsOfficeRelationEntity::setContact, + HsOfficeRelation::setContact, newContact(PATCHED_CONTACT_UUID)) .notNullable() ); } - static HsOfficeContactEntity newContact(final UUID uuid) { - final var newContact = new HsOfficeContactEntity(); - newContact.setUuid(uuid); - return newContact; + static HsOfficeContactRealEntity newContact(final UUID uuid) { + return HsOfficeContactRealEntity.builder().uuid(uuid).build(); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepositoryIntegrationTest.java index f6807b34..151d9967 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationRepositoryIntegrationTest.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.office.relation; import net.hostsharing.hsadminng.context.Context; -import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRepository; +import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactRealRepository; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; import net.hostsharing.hsadminng.rbac.test.ContextBasedTestWithCleanup; import net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantRepository; @@ -34,13 +34,13 @@ import static org.assertj.core.api.Assertions.assertThat; class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithCleanup { @Autowired - HsOfficeRelationRepository relationRepo; + HsOfficeRelationRbacRepository relationRbacRepo; @Autowired HsOfficePersonRepository personRepo; @Autowired - HsOfficeContactRepository contactRepo; + HsOfficeContactRealRepository contactrealRepo; @Autowired RawRbacRoleRepository rawRoleRepo; @@ -64,35 +64,35 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea public void testHostsharingAdmin_withoutAssumedRole_canCreateNewRelation() { // given context("superuser-alex@hostsharing.net"); - final var count = relationRepo.count(); + final var count = relationRbacRepo.count(); final var givenAnchorPerson = personRepo.findPersonByOptionalNameLike("Bessler").stream() .filter(p -> p.getPersonType() == UNINCORPORATED_FIRM) .findFirst().orElseThrow(); final var givenHolderPerson = personRepo.findPersonByOptionalNameLike("Paul").stream() .filter(p -> p.getPersonType() == NATURAL_PERSON) .findFirst().orElseThrow(); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth contact").stream() + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth contact").stream() .findFirst().orElseThrow(); // when final var result = attempt(em, () -> { - final var newRelation = HsOfficeRelationEntity.builder() + final var newRelation = HsOfficeRelationRbacEntity.builder() .anchor(givenAnchorPerson) .holder(givenHolderPerson) .type(HsOfficeRelationType.SUBSCRIBER) .mark("operations-announce") .contact(givenContact) .build(); - return toCleanup(relationRepo.save(newRelation)); + return toCleanup(relationRbacRepo.save(newRelation)); }); // then result.assertSuccessful(); - assertThat(result.returnedValue()).isNotNull().extracting(HsOfficeRelationEntity::getUuid).isNotNull(); + assertThat(result.returnedValue()).isNotNull().extracting(HsOfficeRelation::getUuid).isNotNull(); assertThatRelationIsPersisted(result.returnedValue()); - assertThat(relationRepo.count()).isEqualTo(count + 1); - final var stored = relationRepo.findByUuid(result.returnedValue().getUuid()); - assertThat(stored).isNotEmpty().map(HsOfficeRelationEntity::toString).get() + assertThat(relationRbacRepo.count()).isEqualTo(count + 1); + final var stored = relationRbacRepo.findByUuid(result.returnedValue().getUuid()); + assertThat(stored).isNotEmpty().map(HsOfficeRelation::toString).get() .isEqualTo("rel(anchor='UF Erben Bessler', type='SUBSCRIBER', mark='operations-announce', holder='NP Winkler, Paul', contact='fourth contact')"); } @@ -111,15 +111,15 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea final var givenHolderPerson = personRepo.findPersonByOptionalNameLike("Bert").stream() .filter(p -> p.getPersonType() == NATURAL_PERSON) .findFirst().orElseThrow(); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("fourth contact").stream() + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("fourth contact").stream() .findFirst().orElseThrow(); - final var newRelation = HsOfficeRelationEntity.builder() + final var newRelation = HsOfficeRelationRbacEntity.builder() .anchor(givenAnchorPerson) .holder(givenHolderPerson) .type(HsOfficeRelationType.REPRESENTATIVE) .contact(givenContact) .build(); - return toCleanup(relationRepo.save(newRelation)); + return toCleanup(relationRbacRepo.save(newRelation)); }); // then @@ -156,8 +156,8 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea ); } - private void assertThatRelationIsPersisted(final HsOfficeRelationEntity saved) { - final var found = relationRepo.findByUuid(saved.getUuid()); + private void assertThatRelationIsPersisted(final HsOfficeRelation saved) { + final var found = relationRbacRepo.findByUuid(saved.getUuid()); assertThat(found).isNotEmpty().get().extracting(Object::toString).isEqualTo(saved.toString()); } } @@ -174,7 +174,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea .findFirst().orElseThrow(); // when - final var result = relationRepo.findRelationRelatedToPersonUuid(person.getUuid()); + final var result = relationRbacRepo.findRelationRelatedToPersonUuid(person.getUuid()); // then allTheseRelationsAreReturned( @@ -193,7 +193,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea .findFirst().orElseThrow(); // when: - final var result = relationRepo.findRelationRelatedToPersonUuid(person.getUuid()); + final var result = relationRbacRepo.findRelationRelatedToPersonUuid(person.getUuid()); // then: exactlyTheseRelationsAreReturned( @@ -219,13 +219,13 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea givenRelation, "hs_office_person#ErbenBesslerMelBessler:ADMIN"); context("superuser-alex@hostsharing.net"); - final var givenContact = contactRepo.findContactByOptionalCaptionLike("sixth contact").stream().findFirst().orElseThrow(); + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike("sixth contact").stream().findFirst().orElseThrow(); // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); givenRelation.setContact(givenContact); - return toCleanup(relationRepo.save(givenRelation).load()); + return toCleanup(relationRbacRepo.save(givenRelation).load()); }); // then @@ -242,7 +242,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea result.returnedValue(), "hs_office_contact#fifthcontact:ADMIN"); - relationRepo.deleteByUuid(givenRelation.getUuid()); + relationRbacRepo.deleteByUuid(givenRelation.getUuid()); } @Test @@ -260,7 +260,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net", "hs_office_relation#ErbenBesslerMelBessler-with-REPRESENTATIVE-BesslerAnita:AGENT"); givenRelation.setContact(null); - return relationRepo.save(givenRelation); + return relationRbacRepo.save(givenRelation); }); // then @@ -283,7 +283,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net", "hs_office_contact#ninthcontact:ADMIN"); givenRelation.setContact(null); // TODO - return relationRepo.save(givenRelation); + return relationRbacRepo.save(givenRelation); }); // then @@ -291,16 +291,16 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea "[403] Subject ", " is not allowed to update hs_office_relation uuid"); } - private void assertThatRelationActuallyInDatabase(final HsOfficeRelationEntity saved) { - final var found = relationRepo.findByUuid(saved.getUuid()); + private void assertThatRelationActuallyInDatabase(final HsOfficeRelation saved) { + final var found = relationRbacRepo.findByUuid(saved.getUuid()); assertThat(found).isNotEmpty().get() .isNotSameAs(saved) - .extracting(HsOfficeRelationEntity::toString) + .extracting(HsOfficeRelation::toString) .isEqualTo(saved.toString()); } private void assertThatRelationIsVisibleForUserWithRole( - final HsOfficeRelationEntity entity, + final HsOfficeRelation entity, final String assumedRoles) { jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net", assumedRoles); @@ -309,11 +309,11 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea } private void assertThatRelationIsNotVisibleForUserWithRole( - final HsOfficeRelationEntity entity, + final HsOfficeRelation entity, final String assumedRoles) { jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net", assumedRoles); - final var found = relationRepo.findByUuid(entity.getUuid()); + final var found = relationRbacRepo.findByUuid(entity.getUuid()); assertThat(found).isEmpty(); }).assertSuccessful(); } @@ -332,14 +332,14 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - relationRepo.deleteByUuid(givenRelation.getUuid()); + relationRbacRepo.deleteByUuid(givenRelation.getUuid()); }); // then result.assertSuccessful(); assertThat(jpaAttempt.transacted(() -> { context("superuser-fran@hostsharing.net", null); - return relationRepo.findByUuid(givenRelation.getUuid()); + return relationRbacRepo.findByUuid(givenRelation.getUuid()); }).assertSuccessful().returnedValue()).isEmpty(); } @@ -353,8 +353,8 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea // when final var result = jpaAttempt.transacted(() -> { context("contact-admin@eleventhcontact.example.com"); - assertThat(relationRepo.findByUuid(givenRelation.getUuid())).isPresent(); - relationRepo.deleteByUuid(givenRelation.getUuid()); + assertThat(relationRbacRepo.findByUuid(givenRelation.getUuid())).isPresent(); + relationRbacRepo.deleteByUuid(givenRelation.getUuid()); }); // then @@ -363,7 +363,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea "[403] Subject ", " not allowed to delete hs_office_relation"); assertThat(jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return relationRepo.findByUuid(givenRelation.getUuid()); + return relationRbacRepo.findByUuid(givenRelation.getUuid()); }).assertSuccessful().returnedValue()).isPresent(); // still there } @@ -379,7 +379,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea // when final var result = jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); - return relationRepo.deleteByUuid(givenRelation.getUuid()); + return relationRbacRepo.deleteByUuid(givenRelation.getUuid()); }); // then @@ -408,36 +408,36 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea "[creating relation test-data FirstGmbH-Firby, hs_office_relation, INSERT]"); } - private HsOfficeRelationEntity givenSomeTemporaryRelationBessler(final String holderPerson, final String contact) { + private HsOfficeRelationRbacEntity givenSomeTemporaryRelationBessler(final String holderPerson, final String contact) { return jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net"); final var givenAnchorPerson = personRepo.findPersonByOptionalNameLike("Erben Bessler").get(0); final var givenHolderPerson = personRepo.findPersonByOptionalNameLike(holderPerson).get(0); - final var givenContact = contactRepo.findContactByOptionalCaptionLike(contact).get(0); - final var newRelation = HsOfficeRelationEntity.builder() + final var givenContact = contactrealRepo.findContactByOptionalCaptionLike(contact).get(0); + final var newRelation = HsOfficeRelationRbacEntity.builder() .type(HsOfficeRelationType.REPRESENTATIVE) .anchor(givenAnchorPerson) .holder(givenHolderPerson) .contact(givenContact) .build(); - return toCleanup(relationRepo.save(newRelation)); + return toCleanup(relationRbacRepo.save(newRelation)); }).assertSuccessful().returnedValue(); } void exactlyTheseRelationsAreReturned( - final List actualResult, + final List actualResult, final String... relationNames) { assertThat(actualResult) - .extracting(HsOfficeRelationEntity::toString) + .extracting(HsOfficeRelation::toString) .containsExactlyInAnyOrder(relationNames); } void allTheseRelationsAreReturned( - final List actualResult, + final List actualResult, final String... relationNames) { assertThat(actualResult) - .extracting(HsOfficeRelationEntity::toString) + .extracting(HsOfficeRelation::toString) .contains(relationNames); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationUnitTest.java similarity index 90% rename from src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityUnitTest.java rename to src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationUnitTest.java index bf2a7ed3..a422a8b6 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/relation/HsOfficeRelationUnitTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -class HsOfficeRelationEntityUnitTest { +class HsOfficeRelationUnitTest { private HsOfficePersonEntity anchor = HsOfficePersonEntity.builder() .personType(HsOfficePersonType.LEGAL_PERSON) @@ -20,7 +20,7 @@ class HsOfficeRelationEntityUnitTest { @Test void toStringReturnsAllProperties() { - final var given = HsOfficeRelationEntity.builder() + final var given = HsOfficeRelationRbacEntity.builder() .type(HsOfficeRelationType.SUBSCRIBER) .mark("members-announce") .anchor(anchor) @@ -32,7 +32,7 @@ class HsOfficeRelationEntityUnitTest { @Test void toShortString() { - final var given = HsOfficeRelationEntity.builder() + final var given = HsOfficeRelationRbacEntity.builder() .type(HsOfficeRelationType.REPRESENTATIVE) .anchor(anchor) .holder(holder) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateControllerAcceptanceTest.java index c0f68451..7d7e2c3a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateControllerAcceptanceTest.java @@ -195,7 +195,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest extends ContextBasedTestWithCl .post("http://localhost/api/hs/office/sepamandates") .then().log().all().assertThat() .statusCode(400) - .body("message", is("Unable to find BankAccount with uuid 00000000-0000-0000-0000-000000000000")); + .body("message", is("ERROR: [400] Unable to find BankAccount by uuid: 00000000-0000-0000-0000-000000000000")); // @formatter:on } @@ -225,7 +225,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest extends ContextBasedTestWithCl .post("http://localhost/api/hs/office/sepamandates") .then().log().all().assertThat() .statusCode(400) - .body("message", is("Unable to find Debitor with uuid 00000000-0000-0000-0000-000000000000")); + .body("message", is("ERROR: [400] Unable to find Debitor by uuid: 00000000-0000-0000-0000-000000000000")); // @formatter:on } } diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java index 5e9d8347..771b7e1f 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/ContextBasedTestWithCleanup.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.rbac.test; import net.hostsharing.hsadminng.rbac.context.ContextBasedTest; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantEntity; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantRepository; import net.hostsharing.hsadminng.rbac.rbacgrant.RbacGrantsDiagramService; @@ -50,7 +50,7 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { @Autowired JpaAttempt jpaAttempt; - private TreeMap> entitiesToCleanup = new TreeMap<>(); + private TreeMap> entitiesToCleanup = new TreeMap<>(); private static Long latestIntialTestDataSerialId; private static boolean countersInitialized = false; @@ -64,19 +64,19 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { private TestInfo testInfo; - public T refresh(final T entity) { + public T refresh(final T entity) { final var merged = em.merge(entity); em.refresh(merged); return merged; } - public UUID toCleanup(final Class entityClass, final UUID uuidToCleanup) { + public UUID toCleanup(final Class entityClass, final UUID uuidToCleanup) { out.println("toCleanup(" + entityClass.getSimpleName() + ", " + uuidToCleanup + ")"); entitiesToCleanup.put(uuidToCleanup, entityClass); return uuidToCleanup; } - public E toCleanup(final E entity) { + public E toCleanup(final E entity) { out.println("toCleanup(" + entity.getClass() + ", " + entity.getUuid()); if ( entity.getUuid() == null ) { throw new IllegalArgumentException("only persisted entities with valid uuid allowed"); @@ -85,7 +85,7 @@ public abstract class ContextBasedTestWithCleanup extends ContextBasedTest { return entity; } - protected void cleanupAllNew(final Class entityClass) { + protected void cleanupAllNew(final Class entityClass) { if (initialRbacObjects == null) { out.println("skipping cleanupAllNew: " + entityClass.getSimpleName()); return; // TODO: seems @AfterEach is called without any @BeforeEach diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/EntityList.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/EntityList.java index c504db61..42469ea7 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/EntityList.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/EntityList.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.rbac.test; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import java.util.List; @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class EntityList { - public static E one(final List entities) { + public static E one(final List entities) { assertThat(entities).hasSize(1); return entities.stream().findFirst().orElseThrow(); } diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/MapperUnitTest.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/MapperUnitTest.java index f1bc0cc3..0e01cd05 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/MapperUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/MapperUnitTest.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.rbac.test; import lombok.*; -import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.errors.DisplayAs; import net.hostsharing.hsadminng.mapper.Mapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -88,7 +88,7 @@ class MapperUnitTest { ); assertThat(exception).isInstanceOf(ValidationException.class) - .hasMessage("Unable to find SubTargetBean1 with uuid " + GIVEN_UUID); + .hasMessage("Unable to find SubTargetBean1 by uuid: " + GIVEN_UUID); } @Test @@ -101,7 +101,7 @@ class MapperUnitTest { ); assertThat(exception).isInstanceOf(ValidationException.class) - .hasMessage("Unable to find SomeDisplayName with uuid " + GIVEN_UUID); + .hasMessage("Unable to find SomeDisplayName by uuid: " + GIVEN_UUID); } @Test @@ -217,7 +217,7 @@ class MapperUnitTest { @Setter @NoArgsConstructor @AllArgsConstructor - @DisplayName("SomeDisplayName") + @DisplayAs("SomeDisplayName") public static class SubTargetBean2 { private UUID uuid; diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java index f2764386..d446258b 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java @@ -1,6 +1,6 @@ package net.hostsharing.hsadminng.rbac.test; -import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject; +import net.hostsharing.hsadminng.rbac.rbacobject.BaseEntity; import net.hostsharing.hsadminng.mapper.EntityPatcher; import org.junit.jupiter.api.Named; import org.junit.jupiter.api.Test; @@ -233,7 +233,7 @@ public abstract class PatchUnitTestBase { } } - protected static class JsonNullableProperty extends Property { + protected static class JsonNullableProperty extends Property { private final BiConsumer> resourceSetter; public final RV givenPatchValue; diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerControllerAcceptanceTest.java index 7d0d8e51..2d6d5a70 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/cust/TestCustomerControllerAcceptanceTest.java @@ -175,7 +175,8 @@ class TestCustomerControllerAcceptanceTest { .statusCode(403) .contentType(ContentType.JSON) .statusCode(403) - .body("message", containsString("insert into test_customer not allowed for current subjects {test_customer#xxx:ADMIN}")); + .body("message", containsString("ERROR: [403] insert into test_customer ")) + .body("message", containsString(" not allowed for current subjects {test_customer#xxx:ADMIN}")); // @formatter:on // finally, the new customer was not created @@ -204,7 +205,8 @@ class TestCustomerControllerAcceptanceTest { .statusCode(403) .contentType(ContentType.JSON) .statusCode(403) - .body("message", containsString("ERROR: [403] insert into test_customer not allowed for current subjects {customer-admin@yyy.example.com}")); + .body("message", containsString("ERROR: [403] insert into test_customer ")) + .body("message", containsString(" not allowed for current subjects")); // @formatter:on // finally, the new customer was not created