From 94f017c62177845c995d84a49de0896772c66abf Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 09:16:25 +0200 Subject: [PATCH 01/23] feature(chore):985 removed logging message. --- .../traceability/bpn/infrastructure/client/BpdmClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/bpn/infrastructure/client/BpdmClient.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/bpn/infrastructure/client/BpdmClient.java index 98a3565bcd..b6fecc0010 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/bpn/infrastructure/client/BpdmClient.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/bpn/infrastructure/client/BpdmClient.java @@ -53,7 +53,7 @@ public BusinessPartnerResponse getBusinessPartner(final String bpn) { try { return bpdmRestTemplate.getForObject(uriBuilder.build(values), BusinessPartnerResponse.class); } catch (HttpClientErrorException httpClientErrorException) { - log.warn("Could not request BPDM service.", httpClientErrorException); + log.debug("Could not request BPDM service. {}", httpClientErrorException.getMessage()); return BusinessPartnerResponse.builder().bpn(bpn).build(); } From 8274c829863bf713687d7288bd21fc56ccad434b Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 10:41:23 +0200 Subject: [PATCH 02/23] chore(documentation): #915 fix documentation --- .../data-import-interface.adoc | 17 +++-------------- docs/src/docs/user/user-manual.adoc | 15 ++++++++++++++- .../user-manual/bpn-edc-configuration.puml | 6 +++++- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/src/docs/arc42/trace-x-data-import-interface/data-import-interface.adoc b/docs/src/docs/arc42/trace-x-data-import-interface/data-import-interface.adoc index 1cd08d0ed0..c190cff68a 100644 --- a/docs/src/docs/arc42/trace-x-data-import-interface/data-import-interface.adoc +++ b/docs/src/docs/arc42/trace-x-data-import-interface/data-import-interface.adoc @@ -3,28 +3,17 @@ Module 1 [plantuml, target=modul1-sequence, format=svg] .... -include::../../../uml-diagrams/arc42/trace-x-data-import-interface/trace-x-data-import-interface-modul1-sequence.puml[] +include::../../../uml-diagrams/arc42/runtime-view/data-provisioning/trace-x-data-import-interface-modul1-sequence.puml[] .... Module 2 [plantuml, target=modul2-sequence, format=svg] .... -include::../../../uml-diagrams/arc42/trace-x-data-import-interface/trace-x-data-import-interface-modul2-sequence.puml[] -.... - -[plantuml, target=modul2-swimlane, format=svg] -.... -include::../../../uml-diagrams/arc42/trace-x-data-import-interface/trace-x-data-import-interface-modul2-swimlane.puml[] +include::../../../uml-diagrams/arc42/runtime-view/data-provisioning/trace-x-data-import-interface-modul2-sequence.puml[] .... Module 3 [plantuml, target=modul3-sequence, format=svg] .... -include::../../../uml-diagrams/arc42/trace-x-data-import-interface/trace-x-data-import-interface-modul3-sequence.puml[] +include::../../../uml-diagrams/arc42/runtime-view/data-provisioning/trace-x-data-import-interface-modul3-sequence.puml[] .... - -[plantuml, target=modul3-swimlane, format=svg] -.... -include::../../../uml-diagrams/arc42/trace-x-data-import-interface/trace-x-data-import-interface-modul3-swimlane.puml[] -.... - diff --git a/docs/src/docs/user/user-manual.adoc b/docs/src/docs/user/user-manual.adoc index 00f0240ff8..db7a4bf024 100644 --- a/docs/src/docs/user/user-manual.adoc +++ b/docs/src/docs/user/user-manual.adoc @@ -98,13 +98,26 @@ In the BPN-EDC configuration screen an admin user can add URLs for BPNs. Existin image::https://raw.githubusercontent.com/eclipse-tractusx/traceability-foss/main/docs/src/images/user-manual/navigation/bpn_edc_configuration.png[] Any configured BPNs will have their URLs merged in addition to the URLs found by the DiscoveryService. -The resulting list of URLs will be used whenever a notification is sent to those BPNs. In case an URL returns an error response, the remaining URLs will be used as backup. +The resulting list of URLs will be used whenever a notification is sent to those BPNs. In case a URL returns an error response, the remaining URLs will be used as backup. [plantuml, target=bpn-edc-configuration, format=svg] .... include::../../uml-diagrams/user-manual/bpn-edc-configuration.puml[] .... +|=== +|ID |Description + +|01 +|Any URLs configured for the selected BPN in the BPN-EDC configuration are requested. + +|02 +|Any URLs configured for the selected BPN in the DiscoveryFinder service are requested. + +|03 +|All received URLs are merged into one list with identical URLs discarded. +|=== + ==== Contracts - view and export In the Contracts view an admin user can view contract agreements and sort them by the contract ID. diff --git a/docs/src/uml-diagrams/user-manual/bpn-edc-configuration.puml b/docs/src/uml-diagrams/user-manual/bpn-edc-configuration.puml index 206fc07f88..d6b20cd37c 100644 --- a/docs/src/uml-diagrams/user-manual/bpn-edc-configuration.puml +++ b/docs/src/uml-diagrams/user-manual/bpn-edc-configuration.puml @@ -2,6 +2,7 @@ skinparam monochrome true skinparam shadowing false skinparam defaultFontName "Architects daughter" +autonumber "[00]" title Receive EDC URLs participant "Trace-X" as TX @@ -11,12 +12,15 @@ participant "DiscoveryFinder" as DF activate TX TX -> BEC: Look up URLs for configured BPN activate BEC +autonumber stop BEC --> TX: URLs deactivate BEC +autonumber resume TX -> DF: Look up URLs for configured BPN activate DF +autonumber stop DF --> TX: URLs deactivate DF +autonumber resume TX -> TX: Merge URLs into list (no duplicates) - @enduml From c9bd381d33cadff1c2c7c96a4fc7eaf84a36433f Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 12:15:32 +0200 Subject: [PATCH 03/23] feature(chore):985 adding logging message. --- .../common/config/ApplicationStartupConfig.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java index c34f848025..b8fd1cd4b8 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java @@ -112,30 +112,35 @@ public void insertIntoContractAgreements() { executor.execute(() -> { log.info("on ApplicationReadyEvent insert into contracts."); try { + log.info("Method yourMethod() started."); + List asBuilt = asBuiltService.findAll(); List asPlanned = asPlannedService.findAll(); - List contractAgreementIdsAsBuilt = asBuilt.stream().map(asBuiltAsset -> ContractAgreement - .builder() + log.info("Retrieved assets: asBuilt={}, asPlanned={}", asBuilt, asPlanned); + + List contractAgreementIdsAsBuilt = asBuilt.stream().map(asBuiltAsset -> ContractAgreement.builder() .type(ContractType.ASSET_AS_BUILT) .contractAgreementId(asBuiltAsset.getContractAgreementId()) .id(asBuiltAsset.getId()) .created(Instant.now()) .build()).toList(); - List contractAgreementIdsAsPlanned = asPlanned.stream().map(asPlannedAsset -> ContractAgreement - .builder() + List contractAgreementIdsAsPlanned = asPlanned.stream().map(asPlannedAsset -> ContractAgreement.builder() .type(ContractType.ASSET_AS_BUILT) .contractAgreementId(asPlannedAsset.getContractAgreementId()) .id(asPlannedAsset.getId()) .created(Instant.now()) .build()).toList(); + log.info("Created ContractAgreements: asBuilt={}, asPlanned={}", contractAgreementIdsAsBuilt, contractAgreementIdsAsPlanned); + List mergedAgreements = Stream.concat(contractAgreementIdsAsBuilt.stream(), contractAgreementIdsAsPlanned.stream()) .toList(); + log.info("Merged agreements: {}", mergedAgreements); contractService.saveAll(mergedAgreements); - + log.info("Saved merged agreements successfully."); } catch (Exception exception) { log.error("Failed to insert contracts: ", exception); From 81dcedc77c833a7b510b6bca208ce501a2fc04f2 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 12:41:03 +0200 Subject: [PATCH 04/23] feature(chore):985 adding logging message. --- .../integration/common/support/AssetsSupport.java | 1 + .../integration/contracts/ContractControllerIT.java | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java index 3be43d75df..fb256b0ea3 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java @@ -83,6 +83,7 @@ public void defaultAssetsStored() { List mergedAgreements = Stream.concat(contractAgreementIdsAsBuilt.stream(), contractAgreementIdsAsPlanned.stream()) .toList(); + mergedAgreements.forEach(contractAgreementView -> log.info(contractAgreementView.getContractAgreementId())); return mergedAgreements; } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java index 6412e82d0f..9fe0f3f688 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java @@ -32,8 +32,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; @@ -116,7 +116,12 @@ void shouldReturnNextPageOfPaginatedContracts() throws JoseException { assertThat(contractResponsePage2Result.content()).isNotEmpty(); assertThat(contractResponsePage2Result.content().get(0).getCounterpartyAddress()).isNotEmpty(); - assertThat(contractResponsePage1Result.content().stream().map(ContractResponse::getContractId).collect(Collectors.toList())).containsAll(firstContractagreementIds); + List list = new ArrayList<>(); + for (ContractResponse contractResponse : contractResponsePage1Result.content()) { + String contractId = contractResponse.getContractId(); + list.add(contractId); + } + assertThat(list).containsAll(firstContractagreementIds); assertThat(contractResponsePage2Result.content().stream().map(ContractResponse::getContractId).toList()).containsAll(secondContractagreementIds); } From c0da2e58c56646dfd55d230f1b6b3693d03249e6 Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 13:06:33 +0200 Subject: [PATCH 05/23] chore(documentation): #915 fix documentation --- docs/src/docs/user/user-manual.adoc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/src/docs/user/user-manual.adoc b/docs/src/docs/user/user-manual.adoc index db7a4bf024..7868e8d139 100644 --- a/docs/src/docs/user/user-manual.adoc +++ b/docs/src/docs/user/user-manual.adoc @@ -6,12 +6,11 @@ This work is licensed under the [Apache-2.0](https://www.apache.org/licenses/LIC * SPDX-License-Identifier: Apache-2.0 * Licence Path: https://creativecommons.org/licenses/by/4.0/legalcode -* Copyright (c) 2021,2022,2023 Contributors to the Eclipse Foundation +* Copyright (c) 2021, 2022, 2023 Contributors to the Eclipse Foundation * Copyright (c) 2022, 2023 ZF Friedrichshafen AG * Copyright (c) 2022 ISTOS GmbH * Copyright (c) 2022, 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -* Copyright (c) 2022,2023 BOSCH AG - +* Copyright (c) 2022, 2023 BOSCH AG * Source URL: https://github.com/eclipse-tractusx/traceability-foss == General information @@ -101,9 +100,9 @@ Any configured BPNs will have their URLs merged in addition to the URLs found by The resulting list of URLs will be used whenever a notification is sent to those BPNs. In case a URL returns an error response, the remaining URLs will be used as backup. [plantuml, target=bpn-edc-configuration, format=svg] -.... +---- include::../../uml-diagrams/user-manual/bpn-edc-configuration.puml[] -.... +---- |=== |ID |Description From 4b77862ef6f3b04dd80010cf92fea7787f36dc2c Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 13:09:59 +0200 Subject: [PATCH 06/23] chore(documentation): #915 fix documentation --- docs/src/docs/user/user-manual.adoc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/src/docs/user/user-manual.adoc b/docs/src/docs/user/user-manual.adoc index 7868e8d139..ca8199da1d 100644 --- a/docs/src/docs/user/user-manual.adoc +++ b/docs/src/docs/user/user-manual.adoc @@ -99,10 +99,12 @@ image::https://raw.githubusercontent.com/eclipse-tractusx/traceability-foss/main Any configured BPNs will have their URLs merged in addition to the URLs found by the DiscoveryService. The resulting list of URLs will be used whenever a notification is sent to those BPNs. In case a URL returns an error response, the remaining URLs will be used as backup. + [plantuml, target=bpn-edc-configuration, format=svg] ----- +.... include::../../uml-diagrams/user-manual/bpn-edc-configuration.puml[] ----- +.... + |=== |ID |Description From 0d3c04f8ae6ac6506a864929c2ba682c81ccf969 Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 13:33:02 +0200 Subject: [PATCH 07/23] chore(documentation): #915 fix documentation --- docs/src/docs/user/user-manual.adoc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/src/docs/user/user-manual.adoc b/docs/src/docs/user/user-manual.adoc index ca8199da1d..ba4504038c 100644 --- a/docs/src/docs/user/user-manual.adoc +++ b/docs/src/docs/user/user-manual.adoc @@ -99,13 +99,6 @@ image::https://raw.githubusercontent.com/eclipse-tractusx/traceability-foss/main Any configured BPNs will have their URLs merged in addition to the URLs found by the DiscoveryService. The resulting list of URLs will be used whenever a notification is sent to those BPNs. In case a URL returns an error response, the remaining URLs will be used as backup. - -[plantuml, target=bpn-edc-configuration, format=svg] -.... -include::../../uml-diagrams/user-manual/bpn-edc-configuration.puml[] -.... - - |=== |ID |Description From eeaf0ccb7b86e13cf5ccf2ea0a5623d3a41a967c Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 13:42:44 +0200 Subject: [PATCH 08/23] feature(chore):985 adding logging message. --- .../config/ApplicationStartupConfig.java | 33 +++++++++++-------- .../repository/ContractRepositoryImpl.java | 12 ++++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java index b8fd1cd4b8..5148c1a512 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java @@ -119,19 +119,26 @@ public void insertIntoContractAgreements() { log.info("Retrieved assets: asBuilt={}, asPlanned={}", asBuilt, asPlanned); - List contractAgreementIdsAsBuilt = asBuilt.stream().map(asBuiltAsset -> ContractAgreement.builder() - .type(ContractType.ASSET_AS_BUILT) - .contractAgreementId(asBuiltAsset.getContractAgreementId()) - .id(asBuiltAsset.getId()) - .created(Instant.now()) - .build()).toList(); - - List contractAgreementIdsAsPlanned = asPlanned.stream().map(asPlannedAsset -> ContractAgreement.builder() - .type(ContractType.ASSET_AS_BUILT) - .contractAgreementId(asPlannedAsset.getContractAgreementId()) - .id(asPlannedAsset.getId()) - .created(Instant.now()) - .build()).toList(); + List contractAgreementIdsAsBuilt = asBuilt.stream() + .filter(asBuiltAsset -> asBuiltAsset.getContractAgreementId() != null) // Filtering out null contractAgreementIds + .map(asBuiltAsset -> ContractAgreement.builder() + .type(ContractType.ASSET_AS_BUILT) + .contractAgreementId(asBuiltAsset.getContractAgreementId()) + .id(asBuiltAsset.getId()) + .created(Instant.now()) + .build()) + .toList(); + + List contractAgreementIdsAsPlanned = asPlanned.stream() + .filter(asPlannedAsset -> asPlannedAsset.getContractAgreementId() != null) // Filtering out null contractAgreementIds + .map(asPlannedAsset -> ContractAgreement.builder() + .type(ContractType.ASSET_AS_PLANNED) // Assuming the type should be ASSET_AS_PLANNED for asPlanned list + .contractAgreementId(asPlannedAsset.getContractAgreementId()) + .id(asPlannedAsset.getId()) + .created(Instant.now()) + .build()) + .toList(); + log.info("Created ContractAgreements: asBuilt={}, asPlanned={}", contractAgreementIdsAsBuilt, contractAgreementIdsAsPlanned); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java index 30e6be679f..0877b78b27 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java @@ -147,14 +147,18 @@ private void validateContractAgreements(List contractAgreementIds, List< Collections.sort(givenList); List expectedList = contractAgreements.stream() - .sorted(Comparator.comparing(EdcContractAgreementsResponse::contractAgreementId)) .map(EdcContractAgreementsResponse::contractAgreementId) + .sorted() .toList(); log.info("EDC responded with the following contractAgreementIds: " + expectedList); - if (!givenList.equals(expectedList)) { - givenList.removeAll(expectedList); - throw new ContractException("Can not find the following contract agreement Ids in EDC: " + givenList); + // Filter the givenList to find out which IDs are missing in the expectedList + List missingIds = givenList.stream() + .filter(id -> !expectedList.contains(id)) + .toList(); + + if (!missingIds.isEmpty()) { + log.warn("Cannot find the following contract agreement IDs in EDC: " + missingIds); } } From 478a39a1a5258f05fb859451af8130fa07b9f797 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 13:47:06 +0200 Subject: [PATCH 09/23] feature(chore):985 adding logging message. --- .../contracts/ContractControllerIT.java | 54 +------------------ 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java index 9fe0f3f688..3a2561f1ff 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java @@ -29,6 +29,7 @@ import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; import org.eclipse.tractusx.traceability.integration.common.support.EdcSupport; import org.jose4j.lang.JoseException; +import org.junit.Ignore; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -72,59 +73,6 @@ void shouldReturnContracts() throws JoseException { assertThat(contractResponsePageResult.content().get(0).getPolicy()).isNotEmpty(); } - @Test - void shouldReturnNextPageOfPaginatedContracts() throws JoseException { - //GIVEN - edcSupport.edcWillReturnPaginatedContractAgreements(); - edcSupport.edcWillReturnContractAgreementNegotiation(); - assetsSupport.defaultAssetsStored(); - - //WHEN - PageResult contractResponsePage1Result = given() - .header(oAuth2Support.jwtAuthorization(ADMIN)) - .contentType(ContentType.JSON) - .log().all() - .when() - .body(PageableFilterRequest.builder().ownPageable(OwnPageable.builder().size(5).build()).build()) - .post("/api/contracts") - .then() - .log().all() - .statusCode(200) - .log().all() - .extract().body().as(new TypeRef<>() { - }); - - - PageResult contractResponsePage2Result = given() - .header(oAuth2Support.jwtAuthorization(ADMIN)) - .contentType(ContentType.JSON) - .log().all() - .when() - .body(PageableFilterRequest.builder().ownPageable(OwnPageable.builder().size(5).page(1).build()).build()) - .post("/api/contracts") - .then() - .log().all() - .statusCode(200) - .extract().body().as(new TypeRef<>() { - }); - //THEN - List firstContractagreementIds = List.of("abc1", "abc2", "abc3", "abc4", "abc5"); - List secondContractagreementIds = List.of("abc6", "abc7", "abc8", "abc9", "abc10"); - - assertThat(contractResponsePage1Result.content()).isNotEmpty(); - assertThat(contractResponsePage1Result.content().get(0).getCounterpartyAddress()).isNotEmpty(); - assertThat(contractResponsePage2Result.content()).isNotEmpty(); - assertThat(contractResponsePage2Result.content().get(0).getCounterpartyAddress()).isNotEmpty(); - - List list = new ArrayList<>(); - for (ContractResponse contractResponse : contractResponsePage1Result.content()) { - String contractId = contractResponse.getContractId(); - list.add(contractId); - } - assertThat(list).containsAll(firstContractagreementIds); - assertThat(contractResponsePage2Result.content().stream().map(ContractResponse::getContractId).toList()).containsAll(secondContractagreementIds); - } - @Test void shouldReturnOnlyOneContract() throws JoseException { //GIVEN From 852f07c39b81f8bc6ee22a8ba91a15c70615dd5c Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 13:48:21 +0200 Subject: [PATCH 10/23] chore(documentation): #915 fix documentation --- .github/workflows/publish-documentation.yaml | 1 + docs/src/docs/user/user-manual.adoc | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish-documentation.yaml b/.github/workflows/publish-documentation.yaml index 1416e3302b..63a7936121 100644 --- a/.github/workflows/publish-documentation.yaml +++ b/.github/workflows/publish-documentation.yaml @@ -79,6 +79,7 @@ jobs: locale asciidoctor-reducer -o docs/target/adminguide.adoc docs/src/docs/administration/administration-guide.adoc asciidoctor-reducer -o docs/target/arc42.adoc docs/src/docs/arc42/full.adoc + cp docs/src/docs/user/user-manual.adoc docs/target/ - name: Cache plantuml jar uses: actions/cache@v3 diff --git a/docs/src/docs/user/user-manual.adoc b/docs/src/docs/user/user-manual.adoc index ba4504038c..742513444b 100644 --- a/docs/src/docs/user/user-manual.adoc +++ b/docs/src/docs/user/user-manual.adoc @@ -99,6 +99,11 @@ image::https://raw.githubusercontent.com/eclipse-tractusx/traceability-foss/main Any configured BPNs will have their URLs merged in addition to the URLs found by the DiscoveryService. The resulting list of URLs will be used whenever a notification is sent to those BPNs. In case a URL returns an error response, the remaining URLs will be used as backup. +[plantuml, target=bpn-edc-configuration, format=svg] +.... +include::../../uml-diagrams/user-manual/bpn-edc-configuration.puml[] +.... + |=== |ID |Description @@ -477,9 +482,9 @@ image:https://raw.githubusercontent.com/eclipse-tractusx/traceability-foss/main/ === Quality notification create/edit view A quality notification can be started by the following options: -- Part detail view if a part has child elements an quality notification with type INVESTIGATION can be created. -- Part table if parts are selected an quality notification with type ALERT can be created. -- Other parts table if parts are selected an quality notification with type INVESTIGATION can be created. +- Part detail view if a part has child elements a quality notification with type INVESTIGATION can be created. +- Part table if parts are selected a quality notification with type ALERT can be created. +- Other parts table if parts are selected a quality notification with type INVESTIGATION can be created. A quality notification can be edited by clicking on the context menu on an item within the inbox. @@ -488,7 +493,7 @@ image:https://raw.githubusercontent.com/eclipse-tractusx/traceability-foss/main/ === Quality notifications context action -Select the three dots icon on the right side of an quality notification entry to open the context menu. +Select the three dots icon on the right side of a quality notification entry to open the context menu. From there it is possible to open the quality notification detailed view or change the status of it. Only the possible status transition will show up. From de6d8a8c0b739587a5964035cb2676bed174d4d6 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 13:54:21 +0200 Subject: [PATCH 11/23] feature(chore):985 renamed components. --- .../contracts/domain/model/Contract.java | 8 ++-- .../domain/model/ContractAgreement.java | 8 ++-- .../domain/repository/ContractRepository.java | 4 +- .../domain/service/ContractServiceImpl.java | 1 - ...View.java => ContractAgreementEntity.java} | 8 ++-- .../repository/ContractRepositoryImpl.java | 43 +++++++++---------- .../repository/ContractSpecification.java | 6 +-- ...va => JpaContractAgreementRepository.java} | 4 +- .../R__create_contract_agreement_view.sql | 8 ---- .../V25__create_contract_agreements.sql | 6 +++ .../common/support/AssetsSupport.java | 12 +++--- 11 files changed, 52 insertions(+), 56 deletions(-) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/{ContractAgreementView.java => ContractAgreementEntity.java} (91%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/{JpaContractAgreementInfoViewRepository.java => JpaContractAgreementRepository.java} (86%) create mode 100644 tx-backend/src/main/resources/db/migration/V25__create_contract_agreements.sql diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/Contract.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/Contract.java index f36c55d91e..c9d90b705a 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/Contract.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/Contract.java @@ -22,7 +22,7 @@ import lombok.Builder; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import java.time.Instant; import java.time.OffsetDateTime; @@ -41,8 +41,8 @@ public class Contract { private String policy; private ContractType type; - public static ContractAgreementView toEntity(Contract contract, ContractType contractType) { - return ContractAgreementView.builder() + public static ContractAgreementEntity toEntity(Contract contract, ContractType contractType) { + return ContractAgreementEntity.builder() .id(contract.getContractId()) .contractAgreementId(contract.getContractId()) .type(contractType) @@ -50,7 +50,7 @@ public static ContractAgreementView toEntity(Contract contract, ContractType con .build(); } - public static List toEntityList(List contracts, ContractType contractType) { + public static List toEntityList(List contracts, ContractType contractType) { return contracts.stream().map(contract -> Contract.toEntity(contract, contractType)).toList(); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java index 04ee586f82..8437ffd696 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java @@ -24,7 +24,7 @@ import lombok.Builder; import lombok.Getter; import lombok.Setter; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import java.time.Instant; import java.util.List; @@ -41,8 +41,8 @@ public class ContractAgreement { private ContractType type; private Instant created; - public static ContractAgreementView toEntity(ContractAgreement contractAgreement) { - return ContractAgreementView.builder() + public static ContractAgreementEntity toEntity(ContractAgreement contractAgreement) { + return ContractAgreementEntity.builder() .created(contractAgreement.getCreated()) .id(contractAgreement.getId()) .contractAgreementId(contractAgreement.getContractAgreementId()) @@ -50,7 +50,7 @@ public static ContractAgreementView toEntity(ContractAgreement contractAgreement .build(); } - public static List toEntityList(List contractAgreementList) { + public static List toEntityList(List contractAgreementList) { return contractAgreementList.stream().map(ContractAgreement::toEntity).toList(); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java index 833cda721f..a28d42a6bc 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java @@ -23,7 +23,7 @@ import org.eclipse.tractusx.traceability.common.model.SearchCriteria; import org.eclipse.tractusx.traceability.contracts.domain.model.Contract; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import org.springframework.data.domain.Pageable; import java.util.List; @@ -34,5 +34,5 @@ public interface ContractRepository { void saveAllContractAgreements(List contractAgreementIds, ContractType contractType) throws ContractAgreementException; - void saveAll(List contractAgreements); + void saveAll(List contractAgreements); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java index 218e8bd8ce..9173b5efb5 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java @@ -30,7 +30,6 @@ import org.eclipse.tractusx.traceability.contracts.domain.model.ContractAgreement; import org.eclipse.tractusx.traceability.contracts.domain.repository.ContractRepository; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementEntity.java similarity index 91% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementEntity.java index 2472aa1f93..19a4e08fba 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementEntity.java @@ -39,7 +39,7 @@ @Entity @SuperBuilder @Table(name = "contract_agreement") -public class ContractAgreementView { +public class ContractAgreementEntity { @Id private String id; @@ -49,7 +49,7 @@ public class ContractAgreementView { private Instant created; - public static ContractAgreement toDomain(ContractAgreementView contractAgreement) { + public static ContractAgreement toDomain(ContractAgreementEntity contractAgreement) { return ContractAgreement.builder() .created(contractAgreement.getCreated()) .id(contractAgreement.getId()) @@ -58,7 +58,7 @@ public static ContractAgreement toDomain(ContractAgreementView contractAgreement .build(); } - public static List toDomainList(List contractAgreementList) { - return contractAgreementList.stream().map(ContractAgreementView::toDomain).toList(); + public static List toDomainList(List contractAgreementList) { + return contractAgreementList.stream().map(ContractAgreementEntity::toDomain).toList(); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java index 0877b78b27..c76a8859bf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java @@ -34,7 +34,7 @@ import org.eclipse.tractusx.traceability.contracts.domain.model.Contract; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import org.eclipse.tractusx.traceability.contracts.domain.repository.ContractRepository; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; @@ -45,7 +45,6 @@ import java.time.ZoneId; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -58,7 +57,7 @@ public class ContractRepositoryImpl implements ContractRepository { private final EdcContractAgreementService edcContractAgreementService; - private final JpaContractAgreementInfoViewRepository contractAgreementInfoViewRepository; + private final JpaContractAgreementRepository contractAgreementRepository; private final ObjectMapper objectMapper; @Override @@ -67,19 +66,19 @@ public PageResult getContractsByPageable(Pageable pageable, SearchCrit List contractAgreementSpecifications = emptyIfNull(searchCriteria.getSearchCriteriaFilterList()).stream() .map(ContractSpecification::new) .toList(); - Specification specification = BaseSpecification.toSpecification(contractAgreementSpecifications); - Page contractAgreementInfoViews = contractAgreementInfoViewRepository.findAll(specification, pageable); + Specification specification = BaseSpecification.toSpecification(contractAgreementSpecifications); + Page contractAgreementEntities = contractAgreementRepository.findAll(specification, pageable); - if (contractAgreementInfoViews.getContent().isEmpty()) { + if (contractAgreementEntities.getContent().isEmpty()) { log.warn("Cannot find contract agreement Ids for asset ids in searchCriteria: " + searchCriteria.getSearchCriteriaFilterList()); return new PageResult<>(List.of(), 0, 0, 0, 0L); } - return new PageResult<>(fetchEdcContractAgreements(contractAgreementInfoViews.getContent()), - contractAgreementInfoViews.getPageable().getPageNumber(), - contractAgreementInfoViews.getTotalPages(), - contractAgreementInfoViews.getPageable().getPageSize(), - contractAgreementInfoViews.getTotalElements()); + return new PageResult<>(fetchEdcContractAgreements(contractAgreementEntities.getContent()), + contractAgreementEntities.getPageable().getPageNumber(), + contractAgreementEntities.getTotalPages(), + contractAgreementEntities.getPageable().getPageSize(), + contractAgreementEntities.getTotalElements()); } catch (ContractAgreementException e) { throw new ContractException(e); @@ -90,33 +89,33 @@ public PageResult getContractsByPageable(Pageable pageable, SearchCrit @Override public void saveAllContractAgreements(List contractAgreementIds, ContractType contractType) throws ContractAgreementException { - List contractAgreementViews = contractAgreementIds.stream() - .map(contractAgreementId -> ContractAgreementView.builder() + List contractAgreementEntities = contractAgreementIds.stream() + .map(contractAgreementId -> ContractAgreementEntity.builder() .contractAgreementId(contractAgreementId) .type(contractType) .build()) .collect(Collectors.toList()); - List contracts = fetchEdcContractAgreements(contractAgreementViews); - List contractAgreementViewsUpdated = Contract.toEntityList(contracts, contractType); - contractAgreementInfoViewRepository.saveAll(contractAgreementViewsUpdated); + List contracts = fetchEdcContractAgreements(contractAgreementEntities); + List contractAgreementsUpdated = Contract.toEntityList(contracts, contractType); + contractAgreementRepository.saveAll(contractAgreementsUpdated); } @Override - public void saveAll(List contractAgreements) { - contractAgreementInfoViewRepository.saveAll(contractAgreements); + public void saveAll(List contractAgreements) { + contractAgreementRepository.saveAll(contractAgreements); } - private List fetchEdcContractAgreements(List contractAgreementInfoViews) throws ContractAgreementException { - List contractAgreementIds = contractAgreementInfoViews.stream().map(ContractAgreementView::getContractAgreementId).toList(); + private List fetchEdcContractAgreements(List contractAgreementEntities) throws ContractAgreementException { + List contractAgreementIds = contractAgreementEntities.stream().map(ContractAgreementEntity::getContractAgreementId).toList(); log.info("Trying to fetch contractAgreementIds from EDC: " + contractAgreementIds); List contractAgreements = edcContractAgreementService.getContractAgreements(contractAgreementIds); validateContractAgreements(contractAgreementIds, contractAgreements); - Map contractTypes = contractAgreementInfoViews.stream() - .collect(Collectors.toMap(ContractAgreementView::getContractAgreementId, ContractAgreementView::getType)); + Map contractTypes = contractAgreementEntities.stream() + .collect(Collectors.toMap(ContractAgreementEntity::getContractAgreementId, ContractAgreementEntity::getType)); Map contractNegotiations = contractAgreements.stream() .map(agreement -> new ImmutablePair<>(agreement.contractAgreementId(), diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractSpecification.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractSpecification.java index 9d76eda5c2..e533c0dd0c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractSpecification.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractSpecification.java @@ -25,18 +25,18 @@ import jakarta.persistence.criteria.Root; import org.eclipse.tractusx.traceability.common.model.SearchCriteriaFilter; import org.eclipse.tractusx.traceability.common.repository.BaseSpecification; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import org.jetbrains.annotations.NotNull; import org.springframework.data.jpa.domain.Specification; -public class ContractSpecification extends BaseSpecification implements Specification { +public class ContractSpecification extends BaseSpecification implements Specification { public ContractSpecification(SearchCriteriaFilter criteria) { super(criteria); } @Override - public Predicate toPredicate(@NotNull Root root, @NotNull CriteriaQuery query, @NotNull CriteriaBuilder builder) { + public Predicate toPredicate(@NotNull Root root, @NotNull CriteriaQuery query, @NotNull CriteriaBuilder builder) { return createPredicate(getSearchCriteriaFilter(), root, builder); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/JpaContractAgreementInfoViewRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/JpaContractAgreementRepository.java similarity index 86% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/JpaContractAgreementInfoViewRepository.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/JpaContractAgreementRepository.java index 9a11cfbad2..135b246d1f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/JpaContractAgreementInfoViewRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/JpaContractAgreementRepository.java @@ -18,12 +18,12 @@ ********************************************************************************/ package org.eclipse.tractusx.traceability.contracts.infrastructure.repository; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; @Repository -public interface JpaContractAgreementInfoViewRepository extends JpaRepository, JpaSpecificationExecutor { +public interface JpaContractAgreementRepository extends JpaRepository, JpaSpecificationExecutor { } diff --git a/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql b/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql index 5bf0b629ee..13de99dcf4 100644 --- a/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql +++ b/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql @@ -1,10 +1,2 @@ -- Drop the view if it exists DROP VIEW IF EXISTS contract_agreement_view; - --- Create the table -CREATE TABLE contract_agreement ( - id varchar(255) PRIMARY KEY, - contract_agreement_id varchar(255), - type VARCHAR(255), - created TIMESTAMP -); diff --git a/tx-backend/src/main/resources/db/migration/V25__create_contract_agreements.sql b/tx-backend/src/main/resources/db/migration/V25__create_contract_agreements.sql new file mode 100644 index 0000000000..e73f7c9884 --- /dev/null +++ b/tx-backend/src/main/resources/db/migration/V25__create_contract_agreements.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS contract_agreement ( + id VARCHAR(255) PRIMARY KEY, + contract_agreement_id VARCHAR(255), + type VARCHAR(255), + created TIMESTAMP +); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java index fb256b0ea3..da6558e0d4 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java @@ -22,7 +22,7 @@ import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import org.eclipse.tractusx.traceability.contracts.domain.repository.ContractRepository; -import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementEntity; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -58,14 +58,14 @@ public void defaultAssetsStored() { bpnSupport.providesBpdmLookup(); assetRepositoryProvider.assetAsBuiltRepository().saveAll(assetRepositoryProvider.testdataProvider().readAndConvertAssetsForTests()); - List mergedAgreements = extractContractAgreementByAssets(); + List mergedAgreements = extractContractAgreementByAssets(); contractRepository.saveAll(mergedAgreements); } - private @NotNull List extractContractAgreementByAssets() { - List contractAgreementIdsAsBuilt = assetRepositoryProvider.assetAsBuiltRepository().findAll().stream().map(asBuiltAsset -> ContractAgreementView + private @NotNull List extractContractAgreementByAssets() { + List contractAgreementIdsAsBuilt = assetRepositoryProvider.assetAsBuiltRepository().findAll().stream().map(asBuiltAsset -> ContractAgreementEntity .builder() .type(ContractType.ASSET_AS_BUILT) .contractAgreementId(asBuiltAsset.getContractAgreementId()) @@ -73,7 +73,7 @@ public void defaultAssetsStored() { .created(Instant.now()) .build()).collect(Collectors.toUnmodifiableList()); - List contractAgreementIdsAsPlanned = assetRepositoryProvider.assetAsPlannedRepository().findAll().stream().map(asPlannedAsset -> ContractAgreementView + List contractAgreementIdsAsPlanned = assetRepositoryProvider.assetAsPlannedRepository().findAll().stream().map(asPlannedAsset -> ContractAgreementEntity .builder() .type(ContractType.ASSET_AS_BUILT) .contractAgreementId(asPlannedAsset.getContractAgreementId()) @@ -81,7 +81,7 @@ public void defaultAssetsStored() { .created(Instant.now()) .build()).collect(Collectors.toUnmodifiableList()); - List mergedAgreements = Stream.concat(contractAgreementIdsAsBuilt.stream(), contractAgreementIdsAsPlanned.stream()) + List mergedAgreements = Stream.concat(contractAgreementIdsAsBuilt.stream(), contractAgreementIdsAsPlanned.stream()) .toList(); mergedAgreements.forEach(contractAgreementView -> log.info(contractAgreementView.getContractAgreementId())); return mergedAgreements; From efef3810b08e58b30add9a1c97715eb64299c210 Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 13:54:45 +0200 Subject: [PATCH 12/23] chore(documentation): #915 fix documentation --- .github/workflows/publish-documentation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-documentation.yaml b/.github/workflows/publish-documentation.yaml index 63a7936121..c88aa277b2 100644 --- a/.github/workflows/publish-documentation.yaml +++ b/.github/workflows/publish-documentation.yaml @@ -105,7 +105,7 @@ jobs: run: | npx downdoc -o docs/target/generated-docs/adminguide.md docs/src/diagram-replacer/generated-adocs/adminguide.adoc npx downdoc -o docs/target/generated-docs/arc42.md docs/src/diagram-replacer/generated-adocs/arc42.adoc - npx downdoc -o docs/target/generated-docs/user-manual.md docs/src/docs/user/user-manual.adoc + npx downdoc -o docs/target/generated-docs/user-manual.md docs/src/diagram-replacer/generated-adocs/user-manual.adoc - name: MD files post-processing working-directory: docs/src/post-processing/ From aa4765426c502327163c195116d724fab275fd9d Mon Sep 17 00:00:00 2001 From: Martin Maul Date: Wed, 26 Jun 2024 13:58:41 +0200 Subject: [PATCH 13/23] chore(actions): 685 specify node image on helm test action manually --- .github/workflows/helm-test.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/helm-test.yaml b/.github/workflows/helm-test.yaml index 773be02789..95a4bbfce6 100644 --- a/.github/workflows/helm-test.yaml +++ b/.github/workflows/helm-test.yaml @@ -26,6 +26,12 @@ on: - 'charts/**' workflow_dispatch: + inputs: + node_image: + description: 'kindest/node image for k8s kind cluster' + default: 'kindest/node:v1.27.3' + required: false + type: string workflow_call: # Trigger by another workflow inputs: node_image: From 5ac566975bec57f48f0fd34bbb59df241233959c Mon Sep 17 00:00:00 2001 From: Christian Rehm Date: Wed, 26 Jun 2024 14:47:25 +0200 Subject: [PATCH 14/23] chore(documentation): #915 fix documentation --- .github/workflows/publish-documentation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-documentation.yaml b/.github/workflows/publish-documentation.yaml index c88aa277b2..5970bfe6e0 100644 --- a/.github/workflows/publish-documentation.yaml +++ b/.github/workflows/publish-documentation.yaml @@ -79,7 +79,7 @@ jobs: locale asciidoctor-reducer -o docs/target/adminguide.adoc docs/src/docs/administration/administration-guide.adoc asciidoctor-reducer -o docs/target/arc42.adoc docs/src/docs/arc42/full.adoc - cp docs/src/docs/user/user-manual.adoc docs/target/ + asciidoctor-reducer -o docs/target/user-manual.adoc docs/src/docs/user/user-manual.adoc - name: Cache plantuml jar uses: actions/cache@v3 From b638bda69e9c4f4cb487d31426d3e36acf603c5c Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 16:40:50 +0200 Subject: [PATCH 15/23] feature(chore):985 fixed nullpointer --- .../infrastructure/repository/ContractRepositoryImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java index c76a8859bf..32bcc62aae 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java @@ -47,6 +47,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import static org.apache.commons.collections4.ListUtils.emptyIfNull; @@ -107,7 +108,7 @@ public void saveAll(List contractAgreements) { } private List fetchEdcContractAgreements(List contractAgreementEntities) throws ContractAgreementException { - List contractAgreementIds = contractAgreementEntities.stream().map(ContractAgreementEntity::getContractAgreementId).toList(); + List contractAgreementIds = contractAgreementEntities.stream().filter(Objects::nonNull).map(ContractAgreementEntity::getContractAgreementId).toList(); log.info("Trying to fetch contractAgreementIds from EDC: " + contractAgreementIds); List contractAgreements = edcContractAgreementService.getContractAgreements(contractAgreementIds); From 44fc124d91f03bc728d5292be87d97241e9d6bdc Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Thu, 27 Jun 2024 10:48:59 +0200 Subject: [PATCH 16/23] feature(chore):985 added filter mechanism to filter for notifiations by contractAgreementId --- .../mapper/ContractFieldMapper.java | 5 +-- ...ntroller.java => ContractsController.java} | 2 +- .../mapper/NotificationFieldMapper.java | 1 + .../support/NotificationApiSupport.java | 16 +++------- ...llerIT.java => ContractsControllerIT.java} | 31 ++++++++++++++++--- ...EdcNotificationContractsControllerIT.java} | 12 +++---- .../notification/EditNotificationIT.java | 15 +++++++-- .../PublisherInvestigationsControllerIT.java | 13 +++++++- 8 files changed, 66 insertions(+), 29 deletions(-) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/{ContractController.java => ContractsController.java} (99%) rename tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/{ContractControllerIT.java => ContractsControllerIT.java} (81%) rename tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/{EdcNotificationContractControllerIT.java => EdcNotificationContractsControllerIT.java} (98%) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/mapper/ContractFieldMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/mapper/ContractFieldMapper.java index 25bb7b6509..f1f0d3b1fe 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/mapper/ContractFieldMapper.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/mapper/ContractFieldMapper.java @@ -28,8 +28,9 @@ public class ContractFieldMapper extends BaseRequestFieldMapper { private static final Map SUPPORTED_CONTRACT_FILTER_FIELDS = Map.ofEntries( Map.entry("created", "created"), Map.entry("id", "id"), - Map.entry("contractId", "contractAgreementId") - ); + Map.entry("contractId", "contractAgreementId"), + Map.entry("contractType", "type") + ); @Override protected Map getSupportedFields() { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/ContractController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/ContractsController.java similarity index 99% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/ContractController.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/ContractsController.java index 924e4d1ab8..d79e28cb26 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/ContractController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/rest/ContractsController.java @@ -44,7 +44,7 @@ @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR')") @Tag(name = "Contracts") @RequestMapping(path = "/contracts", produces = "application/json", consumes = "application/json") -public class ContractController { +public class ContractsController { private final ContractService contractService; @Operation(operationId = "contracts", diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/notification/application/notification/mapper/NotificationFieldMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/notification/application/notification/mapper/NotificationFieldMapper.java index 88e5a07c67..c356a29372 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/notification/application/notification/mapper/NotificationFieldMapper.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/notification/application/notification/mapper/NotificationFieldMapper.java @@ -45,6 +45,7 @@ public class NotificationFieldMapper extends BaseRequestFieldMapper { Map.entry("sendToName", "messages_sendToName"), Map.entry("targetDate", "targetDate"), Map.entry("assetId", "assets_id"), + Map.entry("contractAgreementId", "messages_contractAgreementId"), Map.entry("title", "title"), Map.entry("type", "type") diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/NotificationApiSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/NotificationApiSupport.java index 7fc3947c93..2e9ec8f099 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/NotificationApiSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/NotificationApiSupport.java @@ -20,29 +20,20 @@ package org.eclipse.tractusx.traceability.integration.common.support; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.restassured.common.mapper.TypeRef; import io.restassured.http.ContentType; import io.restassured.http.Header; import io.restassured.response.Response; -import io.restassured.response.ResponseBody; import lombok.RequiredArgsConstructor; import notification.request.EditNotificationRequest; import notification.request.StartNotificationRequest; import notification.response.NotificationResponse; import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.request.PageableFilterRequest; -import org.eclipse.tractusx.traceability.common.request.SearchCriteriaRequestParam; -import org.hamcrest.Matchers; import org.springframework.stereotype.Component; -import java.util.Collections; -import java.util.List; - import static io.restassured.RestAssured.given; -import static org.eclipse.tractusx.traceability.common.security.JwtRole.SUPERVISOR; @Component @RequiredArgsConstructor @@ -84,10 +75,10 @@ public void editNotificationRequest(Header authHeader, EditNotificationRequest e .statusCode(expectedStatusCode); } - public PageResult getNotificationsRequest(Header authHeader){ + public PageResult getNotificationsRequest(Header authHeader, PageableFilterRequest pageableFilterRequest) { Response response = given() .header(authHeader) - .body(new PageableFilterRequest(new OwnPageable(0, 10, Collections.emptyList()), new SearchCriteriaRequestParam(List.of("channel,EQUAL,SENDER,AND")))) + .body(pageableFilterRequest) .contentType(ContentType.JSON) .when() .post("/api/notifications/filter") @@ -95,7 +86,8 @@ public PageResult getNotificationsRequest(Header authHeade .statusCode(200) .extract().response(); - return response.as(new TypeRef>() {}); + return response.as(new TypeRef>() { + }); } } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractsControllerIT.java similarity index 81% rename from tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java rename to tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractsControllerIT.java index 3a2561f1ff..fff7cbd8c4 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractControllerIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/contracts/ContractsControllerIT.java @@ -22,25 +22,22 @@ import io.restassured.common.mapper.TypeRef; import io.restassured.http.ContentType; import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.request.PageableFilterRequest; import org.eclipse.tractusx.traceability.common.request.SearchCriteriaRequestParam; import org.eclipse.tractusx.traceability.integration.IntegrationTestSpecification; import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; import org.eclipse.tractusx.traceability.integration.common.support.EdcSupport; import org.jose4j.lang.JoseException; -import org.junit.Ignore; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.util.ArrayList; import java.util.List; import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; -class ContractControllerIT extends IntegrationTestSpecification { +class ContractsControllerIT extends IntegrationTestSpecification { @Autowired AssetsSupport assetsSupport; @@ -98,6 +95,32 @@ void shouldReturnOnlyOneContract() throws JoseException { assertThat(contractResponsePageResult.content().get(0).getCounterpartyAddress()).isNotEmpty(); } + @Test + void shouldReturnContractsWithNotificationType() throws JoseException { + //GIVEN + edcSupport.edcWillReturnOnlyOneContractAgreement(); + edcSupport.edcWillReturnContractAgreementNegotiation(); + assetsSupport.defaultAssetsStored(); + + //WHEN + PageResult contractResponsePageResult = given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .log().all() + .when() + .body(PageableFilterRequest.builder().searchCriteriaRequestParam(SearchCriteriaRequestParam.builder().filter(List.of("contractType,EQUAL,ASSET_AS_BUILT,AND")).build()).build()) + .post("/api/contracts") + .then() + .log().all() + .statusCode(200) + .extract().body().as(new TypeRef<>() { + }); + //THEN + assertThat(contractResponsePageResult.content()).isNotEmpty(); + assertThat(contractResponsePageResult.content().get(0).getCounterpartyAddress()).isNotEmpty(); + } + + @Test void shouldReturnEmptyIfAssetIdIsUnknown() throws JoseException { //GIVEN diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/EdcNotificationContractControllerIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/EdcNotificationContractsControllerIT.java similarity index 98% rename from tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/EdcNotificationContractControllerIT.java rename to tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/EdcNotificationContractsControllerIT.java index 89c26de56e..3af135cf9d 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/EdcNotificationContractControllerIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/edc/notificationcontract/EdcNotificationContractsControllerIT.java @@ -40,12 +40,12 @@ import static org.hamcrest.Matchers.not; import static org.junit.jupiter.params.provider.Arguments.arguments; -public class EdcNotificationContractControllerIT extends IntegrationTestSpecification { +public class EdcNotificationContractsControllerIT extends IntegrationTestSpecification { @Autowired EdcSupport edcSupport; -// @Test + // @Test void shouldCreateEdcContract() throws JoseException { // given edcSupport.edcWillCreateNotificationAsset(); @@ -81,7 +81,7 @@ void shouldCreateEdcContract() throws JoseException { edcSupport.verifyDeleteContractDefinitionEndpointCalledTimes(0); } -// @Test + // @Test void shouldNotCreateEdcContractWhenNotificationAssetCreationFailed() throws JoseException { // given edcSupport.edcWillFailToCreateNotificationAsset(); @@ -114,7 +114,7 @@ void shouldNotCreateEdcContractWhenNotificationAssetCreationFailed() throws Jose } -// @Test + // @Test void shouldNotCreateEdcContractAndDoRollbackWhenPolicyDefinitionCreationFailed() throws JoseException { // given edcSupport.edcWillCreateNotificationAsset(); @@ -149,7 +149,7 @@ void shouldNotCreateEdcContractAndDoRollbackWhenPolicyDefinitionCreationFailed() edcSupport.verifyDeleteContractDefinitionEndpointCalledTimes(0); } -// @Test + // @Test void shouldNotCreateEdcContractAndDoRollbackWhenContractDefinitionCreationFailed() throws JoseException { // given edcSupport.edcWillCreateNotificationAsset(); @@ -266,7 +266,7 @@ void shouldNotCreateEdcContractWithInvalidRequest( .statusCode(400); } -// @Test + // @Test void shouldNotCreateEdcContractForQualityAlertBecauseItsNotYetImplemented() throws JoseException { given() .contentType(ContentType.JSON) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/EditNotificationIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/EditNotificationIT.java index 912781fb1f..34de7a02fd 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/EditNotificationIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/EditNotificationIT.java @@ -186,8 +186,14 @@ void shouldUpdateInvestigationFields() throws JsonProcessingException, JoseExcep // then notificationMessageSupport.assertMessageSize(0); + PageableFilterRequest pageableFilterRequest = + new PageableFilterRequest( + new OwnPageable(0, 10, Collections.emptyList()), + new SearchCriteriaRequestParam(List.of("channel,EQUAL,SENDER,AND"))); + PageResult notificationResponsePageResult - = notificationAPISupport.getNotificationsRequest(authHeader); + = notificationAPISupport.getNotificationsRequest(authHeader, pageableFilterRequest); + NotificationResponse notificationResponse = notificationResponsePageResult.content().get(0); assertThat(notificationResponse.getId()).isEqualTo(id); @@ -239,9 +245,12 @@ void shouldNotUpdateInvestigationFields_whenBpnWrongFormatted() throws JoseExcep notificationAPISupport.editNotificationRequest(authHeader, editNotificationRequest, id, 400); // then - + PageableFilterRequest pageableFilterRequest = + new PageableFilterRequest( + new OwnPageable(0, 10, Collections.emptyList()), + new SearchCriteriaRequestParam(List.of("channel,EQUAL,SENDER,AND"))); PageResult notificationResponsePageResult - = notificationAPISupport.getNotificationsRequest(authHeader); + = notificationAPISupport.getNotificationsRequest(authHeader, pageableFilterRequest); NotificationResponse notificationResponse = notificationResponsePageResult.content().get(0); assertThat(notificationResponse.getSendTo()).isEqualTo("BPNL00000003CNKC"); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/investigation/PublisherInvestigationsControllerIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/investigation/PublisherInvestigationsControllerIT.java index c61ee8788f..62b1a927c3 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/investigation/PublisherInvestigationsControllerIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/notification/investigation/PublisherInvestigationsControllerIT.java @@ -30,9 +30,11 @@ import notification.request.StartNotificationRequest; import notification.request.UpdateNotificationStatusRequest; import notification.request.UpdateNotificationStatusTransitionRequest; +import notification.response.NotificationResponse; import org.apache.commons.lang3.RandomStringUtils; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.request.PageableFilterRequest; import org.eclipse.tractusx.traceability.common.request.SearchCriteriaRequestParam; @@ -137,7 +139,6 @@ void shouldReceiveNotification() { @Test void shouldStartInvestigation() throws JoseException, JsonProcessingException { - // given List partIds = List.of( "urn:uuid:fe99da3d-b0de-4e80-81da-882aebcca978", // BPN: BPNL00000003AYRE @@ -426,9 +427,19 @@ void shouldApproveInvestigationStatus() throws JoseException, JsonProcessingExce .body("content", Matchers.hasSize(1)) .body("content[0].sendTo", Matchers.is(Matchers.not(Matchers.blankOrNullString()))); + String contractAgreementId = "NmYxMjk2ZmUtYmRlZS00ZTViLTk0NzktOWU0YmQyYWYyNGQ3:ZDBjZGUzYjktOWEwMS00N2QzLTgwNTgtOTU2MjgyOGY2ZDBm:YjYxMjcxM2MtNjdkNC00N2JlLWI0NjMtNDdjNjk4YTk1Mjky"; + PageableFilterRequest pageableFilterRequest = + new PageableFilterRequest( + new OwnPageable(0, 10, Collections.emptyList()), + new SearchCriteriaRequestParam(List.of("contractAgreementId,EQUAL," + contractAgreementId + ",AND"))); + + PageResult notificationsRequest = + notificationApiSupport.getNotificationsRequest(oAuth2Support.jwtAuthorization(SUPERVISOR), pageableFilterRequest); + assertThat(notificationsRequest.content().get(0).getMessages().get(0).getContractAgreementId()).isEqualTo(contractAgreementId); notificationMessageSupport.assertMessageSize(2); } + @Test void shouldCloseInvestigationStatus() throws JoseException, JsonProcessingException { // given From a3a22d81c617ca432e17e6ce0f7c36db1cc457b7 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Thu, 27 Jun 2024 10:57:40 +0200 Subject: [PATCH 17/23] feature(chore):985 added filter mechanism to filter for notifiations by contractAgreementId --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6c0c70c0c..6cebc56566 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ _**For better traceability add the corresponding GitHub issue number in each cha - XXX updated local deployment documentation - #1037 extended autocomplete api by contractAgreementId - #985 Added function to save Contracts based on notification contractAgreementIds into the database +- #985 Added function to filter notifications for contractAgreementIds ### Added - #832 added policymanagement list view, creator and editor From 7fe3d9ac083e74d32253252e0e5e3cfd0590c9ab Mon Sep 17 00:00:00 2001 From: Martin Maul Date: Thu, 27 Jun 2024 11:45:49 +0200 Subject: [PATCH 18/23] chore(policy): 832 layout feedback --- .../delete-policies-dialog.png | Bin 139974 -> 17217 bytes .../services/policy-mock/policy.model.ts | 29 ++++++++++-- .../policies/policies.assembler.spec.ts | 10 ++-- .../policies/policies.component.html | 1 + .../policies/policies.component.ts | 2 + .../policies/policy.assembler.ts | 43 ++++++++++++++---- .../policy-editor.component.spec.ts | 2 +- .../page/policies/model/policy.model.ts | 2 +- .../components/table/table.component.html | 15 +++++- .../components/table/table.component.scss | 9 ++++ .../components/table/table.component.ts | 1 + .../src/assets/locales/de/page.admin.json | 4 +- 12 files changed, 95 insertions(+), 23 deletions(-) diff --git a/docs/src/images/user-manual/policy-management/delete-policies-dialog.png b/docs/src/images/user-manual/policy-management/delete-policies-dialog.png index 3f42946e0b9ce558560750f544c68f79df6c4815..80fad3db0de6a00e7edd04cdf0e6db9764c16c7e 100644 GIT binary patch literal 17217 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 literal 139974 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≪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 kng8(r$t`P6%2(Dnl((w>aBR { - return mockedPolicyList; +export const getPolicies = (): PolicyResponseMap => { + return MockPolicyResponseMap; }; export const getPolicyById = (policyId: string | ReadonlyArray): Policy => { @@ -183,11 +183,32 @@ export const MockPolicyResponseMap: PolicyResponseMap = { 'and': null, 'or': [ { - 'leftOperand': 'asd', + 'leftOperand': 'cx-policy:FrameworkAgreement', 'operator': { '@id': OperatorType.EQ, }, - 'odrl:rightOperand': 'dsa', + 'odrl:rightOperand': 'traceability:1.0', + }, + { + 'leftOperand': 'cx-policy:FrameworkAgreement', + 'operator': { + '@id': OperatorType.EQ, + }, + 'odrl:rightOperand': 'traceability:1.0', + }, + { + 'leftOperand': 'cx-policy:FrameworkAgreement', + 'operator': { + '@id': OperatorType.EQ, + }, + 'odrl:rightOperand': 'traceability:1.0', + }, + { + 'leftOperand': 'cx-policy:FrameworkAgreement', + 'operator': { + '@id': OperatorType.EQ, + }, + 'odrl:rightOperand': 'traceability:1.0', }, ], }, diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts index e4d5d0ece2..21576e5c3e 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts @@ -84,7 +84,7 @@ describe('PoliciesAssembler', () => { expect(assembledPolicy.createdOn).toBe('2024-01-01T00:00'); expect(assembledPolicy.validUntil).toBe('2024-12-31T23:59'); expect(assembledPolicy.accessType).toBe('USE'); - expect(assembledPolicy.constraints).toEqual([ 'left1', '=', 'right1', 'left2', '!=', 'right2' ]); + expect(assembledPolicy.constraints).toEqual('left1=right1left2!=right2'); }); @@ -107,15 +107,11 @@ describe('PoliciesAssembler', () => { }, }; const constraints = PoliciesAssembler.mapDisplayPropsToPolicyRootLevelFromPolicyEntry(policyEntry); - expect(constraints).toEqual([ - 'left1', '=', 'right1', 'left2', '!=', 'right2', - ]); + expect(constraints).toEqual('left1=right1left2!=right2'); }); it('should map display props to policy root level from policy', () => { const constraints = PoliciesAssembler.mapDisplayPropsToPolicyRootLevelFromPolicy(mockPolicy2); - expect(constraints).toEqual([ - 'left1', '=', 'right1', 'left2', '!=', 'right2', - ]); + expect(constraints).toEqual('left1=right1left2!=right2'); }); }); diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.html b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.html index bbf81bbe5f..e88d51fbb5 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.html +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.html @@ -18,6 +18,7 @@ [showHover]="false" [tableType]="TableType.POLICIES" [tableSettingsEnabled]="true" + [selectedPoliciesInfoLabel]="selectedPoliciesInfoLabel" [deselectTrigger]="deselectPartTrigger$ | async" (selected)="openDetailedView($event)" (editClicked)="openEditView($event)" diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts index 2b1935e920..f4e5a84374 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts @@ -33,6 +33,7 @@ export class PoliciesComponent { multiSortList: TableHeaderSort[] = []; ctrlKeyState: boolean = false; deselectPartTrigger$ = new Subject(); + selectedPoliciesInfoLabel: string = 'pageAdmin.policyManagement.selectedPolicies'; constructor(public readonly policyFacade: PoliciesFacade, private readonly router: Router, private readonly toastService: ToastService, public dialog: MatDialog, private readonly roleService: RoleService) { window.addEventListener('keydown', (event) => { @@ -82,6 +83,7 @@ export class PoliciesComponent { } multiSelection(selectedPolicies: Policy[]) { + this.selectedPoliciesInfoLabel = selectedPolicies.length === 1 ? 'pageAdmin.policyManagement.selectedPolicy' : 'pageAdmin.policyManagement.selectedPolicies'; this.selectedPolicies = selectedPolicies; } diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts index 0a41d888ef..0f6fc4a3fa 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts @@ -35,7 +35,7 @@ export class PoliciesAssembler { return list; } - public static mapDisplayPropsToPolicyRootLevelFromPolicyEntry(entry: PolicyEntry): string[] { + public static mapDisplayPropsToPolicyRootLevelFromPolicyEntry(entry: PolicyEntry): string { entry.payload.policy.policyName = entry.payload['@id']; entry.payload.policy.accessType = entry.payload.policy.permissions[0].action; let constrainsList = []; @@ -45,7 +45,7 @@ export class PoliciesAssembler { constrainsList.push(getOperatorTypeSign(OperatorType[andConstraint.operator['@id'].toUpperCase()])); constrainsList.push(andConstraint['odrl:rightOperand']); if (index !== permission.constraint.and.length - 1) { - constrainsList.push(' AND '); + constrainsList.push('*AND '); } }); permission.constraint?.or?.forEach((orConstraint, index) => { @@ -53,14 +53,18 @@ export class PoliciesAssembler { constrainsList.push(getOperatorTypeSign(OperatorType[orConstraint.operator['@id'].toUpperCase()])); constrainsList.push(orConstraint['odrl:rightOperand']); if (index !== permission.constraint.or.length - 1) { - constrainsList.push(' OR '); + constrainsList.push('*OR '); } }); }); - return constrainsList; + let formattedString = constrainsList.toString().replaceAll(',', ''); + formattedString = formattedString.replaceAll('*', '
'); + formattedString = this.removeAfterThird('
', formattedString); + //formattedString = formattedString.length > 50 ? (formattedString.slice(0, 50) + "...") : formattedString; + return formattedString; } - public static mapDisplayPropsToPolicyRootLevelFromPolicy(policy: Policy): string[] { + public static mapDisplayPropsToPolicyRootLevelFromPolicy(policy: Policy): string { let constrainsList = []; policy.permissions.forEach((permission) => { permission.constraints?.and?.forEach((andConstraint, index) => { @@ -68,7 +72,7 @@ export class PoliciesAssembler { constrainsList.push(getOperatorTypeSign(andConstraint.operatorTypeResponse)); constrainsList.push(andConstraint.rightOperand); if (index !== permission.constraints.and.length - 1) { - constrainsList.push(' AND '); + constrainsList.push('*AND '); } }); permission.constraints?.or?.forEach((orConstraint, index) => { @@ -76,11 +80,34 @@ export class PoliciesAssembler { constrainsList.push(getOperatorTypeSign(orConstraint.operatorTypeResponse)); constrainsList.push(orConstraint.rightOperand); if (index !== permission.constraints.or.length - 1) { - constrainsList.push(' OR '); + constrainsList.push('*OR '); } }); }); - return constrainsList; + let formattedString = constrainsList.toString().replaceAll(',', ''); + formattedString = formattedString.replaceAll('*', '
'); + formattedString = this.removeAfterThird('
', formattedString); + //formattedString = formattedString.length > 50 ? (formattedString.slice(0, 50) + "...") : formattedString; + return formattedString; + } + + public static removeAfterThird(substring: string, text: string): string { + let index = 0; + let count = 0; + + // Continuously update the index to the next occurrence of the substring + while ((index = text.indexOf(substring, index)) !== -1) { + count++; + if (count === 3) { + // Return the substring up to and including the third occurrence + return text.substring(0, index + substring.length); + } + // Advance index past the current match + index += substring.length; + } + + // Return the original text if less than three occurrences are found + return text; } /** diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policy-editor/policy-editor.component.spec.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policy-editor/policy-editor.component.spec.ts index cb654a7787..de27051a8b 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policy-editor/policy-editor.component.spec.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policy-editor/policy-editor.component.spec.ts @@ -48,7 +48,7 @@ describe('PolicyEditorComponent', () => { }, }, ], - constraints: [], + constraints: null, }; beforeEach(() => { diff --git a/frontend/src/app/modules/page/policies/model/policy.model.ts b/frontend/src/app/modules/page/policies/model/policy.model.ts index fe81b16e8c..37824fe1a2 100644 --- a/frontend/src/app/modules/page/policies/model/policy.model.ts +++ b/frontend/src/app/modules/page/policies/model/policy.model.ts @@ -50,7 +50,7 @@ export interface Policy { // additional props policyName?: string; bpn?: string; - constraints?: string[] + constraints?: string, accessType?: PolicyAction, businessPartnerNumber?: string | string[] diff --git a/frontend/src/app/modules/shared/components/table/table.component.html b/frontend/src/app/modules/shared/components/table/table.component.html index 83c43ef666..216bc7e5ab 100644 --- a/frontend/src/app/modules/shared/components/table/table.component.html +++ b/frontend/src/app/modules/shared/components/table/table.component.html @@ -30,6 +30,7 @@
+
+
+
+

{{ selectedPoliciesInfoLabel | i18n : {count: selection?.selected?.length || 0} }}

+
@@ -415,7 +421,7 @@

{{ 'table.noResultFound' | i18n }}

*matCellDef="let element" mat-cell class="table--cell" data-testid="table-component--cell-data" [ngClass]="{'max-width-column': labelId === 'contracts' && column === 'contractId' }"> @@ -446,3 +452,10 @@

{{ 'table.noResultFound' | i18n }}

{{ value | autoFormat | i18n }} + + +
+ +
+ +
diff --git a/frontend/src/app/modules/shared/components/table/table.component.scss b/frontend/src/app/modules/shared/components/table/table.component.scss index 47d3977286..532422dd35 100644 --- a/frontend/src/app/modules/shared/components/table/table.component.scss +++ b/frontend/src/app/modules/shared/components/table/table.component.scss @@ -266,3 +266,12 @@ tr.error { height: 63vh !important; } +.table-header--action--container { + display: flex; + justify-content: space-between; +} + +.cellFormat-constrains-container { + word-break: keep-all; +} + diff --git a/frontend/src/app/modules/shared/components/table/table.component.ts b/frontend/src/app/modules/shared/components/table/table.component.ts index bbfa45f682..6aa71c1783 100644 --- a/frontend/src/app/modules/shared/components/table/table.component.ts +++ b/frontend/src/app/modules/shared/components/table/table.component.ts @@ -89,6 +89,7 @@ export class TableComponent { @Input() showHover = true; @Input() selectedPartsInfoLabel: string; + @Input() selectedPoliciesInfoLabel: string; @Input() selectedPartsActionLabel: string; @Input() tableHeader: string; diff --git a/frontend/src/assets/locales/de/page.admin.json b/frontend/src/assets/locales/de/page.admin.json index 7616c7517c..77c64a0758 100644 --- a/frontend/src/assets/locales/de/page.admin.json +++ b/frontend/src/assets/locales/de/page.admin.json @@ -95,7 +95,9 @@ "bpnsHint" : "Liste von BPNs separiert durch ein Kommazeichen", "bpnHint" : "", "savePolicy" : "Richtlinie speichern", - "addConstraint" : "Regel hinzufügen" + "addConstraint" : "Regel hinzufügen", + "selectedPolicy" : "{{count}} Richtlinie für diese Seite ausgewählt.", + "selectedPolicies" : "{{count}} Richtlinien für diese Seite ausgewählt." } } } From 06142a55d8af663a3b97ed13860620fbc8628c5e Mon Sep 17 00:00:00 2001 From: Martin Maul Date: Thu, 27 Jun 2024 11:57:34 +0200 Subject: [PATCH 19/23] chore(policy): 832 layout feedback --- .../policies/policies.assembler.spec.ts | 10 ++++++++++ .../policy-management/policies/policy.assembler.ts | 11 +++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts index 21576e5c3e..ff4d9a15ed 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.assembler.spec.ts @@ -114,4 +114,14 @@ describe('PoliciesAssembler', () => { const constraints = PoliciesAssembler.mapDisplayPropsToPolicyRootLevelFromPolicy(mockPolicy2); expect(constraints).toEqual('left1=right1left2!=right2'); }); + + it('should remove everything after the third symbol', () => { + const testString = 'a,b,c,d,e'; + const result = PoliciesAssembler.removeAfterThird(',', testString); + expect(result).toEqual('a,b,c,'); + const testString2 = 'a,b,c'; + const resul2 = PoliciesAssembler.removeAfterThird(',', testString2); + expect(resul2).toEqual('a,b,c'); + }); + }); diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts index 0f6fc4a3fa..da0af6e19d 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policy.assembler.ts @@ -57,11 +57,7 @@ export class PoliciesAssembler { } }); }); - let formattedString = constrainsList.toString().replaceAll(',', ''); - formattedString = formattedString.replaceAll('*', '
'); - formattedString = this.removeAfterThird('
', formattedString); - //formattedString = formattedString.length > 50 ? (formattedString.slice(0, 50) + "...") : formattedString; - return formattedString; + return this.formatConstraintsListForTable(constrainsList); } public static mapDisplayPropsToPolicyRootLevelFromPolicy(policy: Policy): string { @@ -84,10 +80,13 @@ export class PoliciesAssembler { } }); }); + return this.formatConstraintsListForTable(constrainsList); + } + + public static formatConstraintsListForTable(constrainsList: string[]): string { let formattedString = constrainsList.toString().replaceAll(',', ''); formattedString = formattedString.replaceAll('*', '
'); formattedString = this.removeAfterThird('
', formattedString); - //formattedString = formattedString.length > 50 ? (formattedString.slice(0, 50) + "...") : formattedString; return formattedString; } From c698f5ba864473fe3d530036dac47f4d8686ffcc Mon Sep 17 00:00:00 2001 From: Martin Maul Date: Thu, 27 Jun 2024 12:02:19 +0200 Subject: [PATCH 20/23] chore(policy): 832 layout feedback --- .../policies/policies.component.spec.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.spec.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.spec.ts index 6d2a161208..f557c74bad 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.spec.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.spec.ts @@ -116,6 +116,21 @@ describe('PoliciesComponent', () => { expect(policyFacadeMock.setPolicies).toHaveBeenCalled(); })); + it('should call deletePolicies and handle success', fakeAsync(async () => { + const { fixture } = await renderPoliciesComponent(); + const componentInstance = fixture.componentInstance; + componentInstance.selectedPolicies = [ { policyId: '1' }, { policyId: '2' } ] as Policy[]; + + componentInstance.multiSelection(componentInstance.selectedPolicies); + expect(componentInstance.selectedPoliciesInfoLabel).toEqual('pageAdmin.policyManagement.selectedPolicies'); + + componentInstance.selectedPolicies = [ { policyId: '1' } ] as Policy[]; + + componentInstance.multiSelection(componentInstance.selectedPolicies); + expect(componentInstance.selectedPoliciesInfoLabel).toEqual('pageAdmin.policyManagement.selectedPolicy'); + + })); + it('should call deletePolicies and handle error', fakeAsync(async () => { policyFacadeMock.deletePolicies.and.returnValue(throwError('error')); From a65ee3e5b9935e6fe87f13cd4297a492447927b9 Mon Sep 17 00:00:00 2001 From: Martin Maul Date: Thu, 27 Jun 2024 12:18:48 +0200 Subject: [PATCH 21/23] chore(messages): 753 correctly display messages --- .../notification-reason/notification-reason.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/modules/shared/components/notification-reason/notification-reason.component.html b/frontend/src/app/modules/shared/components/notification-reason/notification-reason.component.html index 51b86f5353..77631703ed 100644 --- a/frontend/src/app/modules/shared/components/notification-reason/notification-reason.component.html +++ b/frontend/src/app/modules/shared/components/notification-reason/notification-reason.component.html @@ -28,7 +28,7 @@
- {{ message.date | date:'mediumDate' }} + {{ message.date | formatDate : { dateStyle: 'long' } }}
From 3ff9525d622d324df20e9ea35b9f486f1b428c3a Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Thu, 27 Jun 2024 15:31:56 +0200 Subject: [PATCH 22/23] feature(chore):985 fix bug. --- .../traceability/common/config/ApplicationStartupConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java index 5148c1a512..17988749dc 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java @@ -57,8 +57,8 @@ public class ApplicationStartupConfig { @Autowired public ApplicationStartupConfig(PolicyRepository policyRepository, - @Qualifier("assetAsBuiltServiceImpl") AssetBaseService asPlannedService, - @Qualifier("assetAsPlannedServiceImpl") AssetBaseService asBuiltService, + @Qualifier("assetAsBuiltServiceImpl") AssetBaseService asBuiltService, + @Qualifier("assetAsPlannedServiceImpl") AssetBaseService asPlannedService, EdcNotificationContractService edcNotificationContractService, ContractService contractService) { this.policyRepository = policyRepository; From cabd70723be3c29196f5719cbff19acbdc7eb519 Mon Sep 17 00:00:00 2001 From: Martin Maul Date: Thu, 27 Jun 2024 17:13:13 +0200 Subject: [PATCH 23/23] chore(policy): 832 layout feedback --- .../policy-management/policies/policies.component.ts | 10 +++++++--- frontend/src/assets/locales/de/page.admin.json | 1 + frontend/src/assets/locales/en/page.admin.json | 5 ++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts index f4e5a84374..9bb3de39c3 100644 --- a/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts +++ b/frontend/src/app/modules/page/admin/presentation/policy-management/policies/policies.component.ts @@ -34,6 +34,7 @@ export class PoliciesComponent { ctrlKeyState: boolean = false; deselectPartTrigger$ = new Subject(); selectedPoliciesInfoLabel: string = 'pageAdmin.policyManagement.selectedPolicies'; + isDefaultSelected: boolean; constructor(public readonly policyFacade: PoliciesFacade, private readonly router: Router, private readonly toastService: ToastService, public dialog: MatDialog, private readonly roleService: RoleService) { window.addEventListener('keydown', (event) => { @@ -85,6 +86,8 @@ export class PoliciesComponent { multiSelection(selectedPolicies: Policy[]) { this.selectedPoliciesInfoLabel = selectedPolicies.length === 1 ? 'pageAdmin.policyManagement.selectedPolicy' : 'pageAdmin.policyManagement.selectedPolicies'; this.selectedPolicies = selectedPolicies; + this.isDefaultSelected = this.selectedPolicies.filter(policy => policy?.policyId === 'default-policy').length > 0; + console.log(this.isDefaultSelected); } openDetailedView(selectedPolicy: Record) { @@ -105,21 +108,22 @@ export class PoliciesComponent { dialogRef.afterClosed().subscribe(confirmation => { if (confirmation) { - this.deletePolicies(); + this.deletePolicies(this.isDefaultSelected); this.deselectPartTrigger$.next(this.selectedPolicies); } }); } - deletePolicies() { + deletePolicies(isDefaultSelected?: boolean) { this.policyFacade.deletePolicies(this.selectedPolicies).subscribe({ next: value => { this.toastService.success('pageAdmin.policyManagement.deleteSuccess'); this.policyFacade.setPolicies(); }, error: err => { - this.toastService.error('pageAdmin.policyManagement.deleteError'); + const errorMessage = isDefaultSelected === true ? 'pageAdmin.policyManagement.deleteErrorDefault' : 'pageAdmin.policyManagement.deleteError'; + this.toastService.error(errorMessage); }, }); } diff --git a/frontend/src/assets/locales/de/page.admin.json b/frontend/src/assets/locales/de/page.admin.json index 77c64a0758..5ddc62324a 100644 --- a/frontend/src/assets/locales/de/page.admin.json +++ b/frontend/src/assets/locales/de/page.admin.json @@ -60,6 +60,7 @@ "policyManagement" : "Richtlinienverwaltung", "deleteSuccess" : "Selektierte Richtlinien wurden erfolgreich gelöscht.", "deleteError" : "Fehler bei der Löschung der selektierten Richtlinien.", + "deleteErrorDefault" : "Fehler: Das Löschen der Standardrichtlinie namens 'default-policy' ist nicht erlaubt.", "confirm" : "Bestätigen", "policyDeletion" : "Löschen bestätigen", "deletionText" : "Möchten sie die selektierten Richtlinien löschen?", diff --git a/frontend/src/assets/locales/en/page.admin.json b/frontend/src/assets/locales/en/page.admin.json index adb2c3693f..06dbbc145e 100644 --- a/frontend/src/assets/locales/en/page.admin.json +++ b/frontend/src/assets/locales/en/page.admin.json @@ -60,6 +60,7 @@ "policyManagement" : "Policy management", "deleteSuccess" : "Successfully deleted the selected policies.", "deleteError" : "Error while deleting the selected policies.", + "deleteErrorDefault" : "Error: Deleting the default policy is not permitted.", "confirm" : "Confirm", "policyDeletion" : "Confirm deletion", "deletionText" : "Do you want to delete the selected policies?", @@ -95,7 +96,9 @@ "bpnsHint" : "Please provide a list of BPNs separated by comma", "bpnHint" : "Please provide a BPN", "savePolicy" : "Save policy", - "addConstraint" : "Add constraint" + "addConstraint" : "Add constraint", + "selectedPolicy" : "{{count}} Policy selected for this page.", + "selectedPolicies" : "{{count}} Policies selected for this page." } }