From 0c2685954182d30f55314470bdd1cc64deb89755 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 07:53:22 +0200 Subject: [PATCH 01/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../asbuilt/rest/AssetAsBuiltController.java | 6 +- .../rest/AssetAsPlannedController.java | 398 ++++++++++++++++++ .../request/GetDetailInformationRequest.java | 2 +- .../request/QualityTypeRequest.java | 2 +- .../request/SyncAssetsRequest.java | 2 +- .../request/UpdateAssetRequest.java | 2 +- .../asbuilt/service/AssetServiceImpl.java | 2 +- 7 files changed, 406 insertions(+), 8 deletions(-) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/{asbuilt => base}/request/GetDetailInformationRequest.java (94%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/{asbuilt => base}/request/QualityTypeRequest.java (96%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/{asbuilt => base}/request/SyncAssetsRequest.java (95%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/{asbuilt => base}/request/UpdateAssetRequest.java (94%) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java index 83327708a9..7f9a2999e4 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java @@ -34,9 +34,9 @@ import jakarta.ws.rs.QueryParam; import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.request.GetDetailInformationRequest; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.request.SyncAssetsRequest; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.request.UpdateAssetRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetService; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; import org.eclipse.tractusx.traceability.common.model.PageResult; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java new file mode 100644 index 0000000000..e4da91fce8 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -0,0 +1,398 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.application.asplanned.rest; + +import assets.response.AssetResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.ws.rs.QueryParam; +import lombok.RequiredArgsConstructor; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; +import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.common.request.OwnPageable; +import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") +@Tag(name = "Assets") +@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") +@RequiredArgsConstructor +public class AssetAsPlannedController { + + private final AssetService assetService; + + @Operation(operationId = "sync", + summary = "Synchronizes assets from IRS", + tags = {"Assets"}, + description = "The endpoint synchronizes the assets from irs.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), + @ApiResponse( + responseCode = "400", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "415", + description = "Unsupported media type", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @PostMapping("/sync") + public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { + assetService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); + } + + @Operation(operationId = "assets", + summary = "Get assets by pagination", + tags = {"Assets"}, + description = "The endpoint returns a paged result of assets.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the paged result found for Asset", content = @Content( + mediaType = "application/json", + array = @ArraySchema( + arraySchema = @Schema( + description = "Assets", + implementation = AssetResponse.class, + additionalProperties = Schema.AdditionalPropertiesValue.FALSE + ), + maxItems = Integer.MAX_VALUE, + minItems = 0) + )), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @GetMapping("") + public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { + return AssetAsBuiltResponseMapper.from(assetService.getAssets(OwnPageable.toPageable(pageable), owner)); + } + + @Operation(operationId = "assetsCountryMap", + summary = "Get map of assets", + tags = {"Assets"}, + description = "The endpoint returns a map for assets consumed by the map.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the assets found"), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @GetMapping("/countries") + public Map assetsCountryMap() { + return assetService.getAssetsCountryMap(); + } + + + @Operation(operationId = "assetById", + summary = "Get asset by id", + tags = {"Assets"}, + description = "The endpoint returns an asset filtered by id .", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the assets found", + content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @GetMapping("/{assetId}") + public AssetResponse asset(@PathVariable String assetId) { + return AssetAsBuiltResponseMapper.from(assetService.getAssetById(assetId)); + } + + + @Operation(operationId = "assetByChildId", + summary = "Get asset by child id", + tags = {"Assets"}, + description = "The endpoint returns an asset filtered by child id.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the asset by childId", + content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @GetMapping("/{assetId}/children/{childId}") + public AssetResponse asset(@PathVariable String assetId, @PathVariable String childId) { + return AssetAsBuiltResponseMapper.from(assetService.getAssetByChildId(assetId, childId)); + } + + @Operation(operationId = "updateAsset", + summary = "Updates asset", + tags = {"Assets"}, + description = "The endpoint updates asset by provided quality type.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the updated asset", + content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "415", + description = "Unsupported media type", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @PatchMapping("/{assetId}") + public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { + return AssetAsBuiltResponseMapper.from( + assetService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) + ); + } + + @Operation(operationId = "getDetailInformation", + summary = "Searches for assets by ids.", + tags = {"Assets"}, + description = "The endpoint searchs for assets by id and returns a list of them.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the paged result found for Asset", content = @Content( + mediaType = "application/json", + array = @ArraySchema( + arraySchema = @Schema( + description = "Assets", + implementation = AssetResponse.class, + additionalProperties = Schema.AdditionalPropertiesValue.FALSE + ), + maxItems = Integer.MAX_VALUE, + minItems = 0) + )), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "415", + description = "Unsupported media type", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @PostMapping("/detail-information") + public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { + return AssetAsBuiltResponseMapper.from( + assetService.getAssetsById(getDetailInformationRequest.assetIds()) + ); + } +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/GetDetailInformationRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/GetDetailInformationRequest.java similarity index 94% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/GetDetailInformationRequest.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/GetDetailInformationRequest.java index a9533d816d..1a159e09f4 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/GetDetailInformationRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/GetDetailInformationRequest.java @@ -19,7 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.application.asbuilt.request; +package org.eclipse.tractusx.traceability.assets.application.base.request; import io.swagger.annotations.ApiModelProperty; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/QualityTypeRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java similarity index 96% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/QualityTypeRequest.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java index 3b202dc7b3..b93eeb6c8a 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/QualityTypeRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java @@ -17,7 +17,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.application.asbuilt.request; +package org.eclipse.tractusx.traceability.assets.application.base.request; import assets.response.QualityTypeResponse; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/SyncAssetsRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/SyncAssetsRequest.java similarity index 95% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/SyncAssetsRequest.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/SyncAssetsRequest.java index 152997e309..b497ce0126 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/SyncAssetsRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/SyncAssetsRequest.java @@ -19,7 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.application.asbuilt.request; +package org.eclipse.tractusx.traceability.assets.application.base.request; import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.ArraySchema; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/UpdateAssetRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/UpdateAssetRequest.java similarity index 94% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/UpdateAssetRequest.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/UpdateAssetRequest.java index 5220a88eb1..46e8527397 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/request/UpdateAssetRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/UpdateAssetRequest.java @@ -19,7 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.application.asbuilt.request; +package org.eclipse.tractusx.traceability.assets.application.base.request; import io.swagger.annotations.ApiModelProperty; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java index 1549cdffff..f07ff0713d 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java @@ -50,7 +50,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class AssetServiceImpl implements AssetService { +public class AssetServiceImpl implements AssetService { private final AssetAsBuiltRepository assetAsBuiltRepository; private final AssetAsPlannedRepository assetAsPlannedRepository; From 65e6085678205abe633adc6bc9e8604a42249e11 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 08:21:15 +0200 Subject: [PATCH 02/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../mapper/AssetAsBuiltResponseMapper.java | 59 ++--------------- .../asbuilt/rest/AssetAsBuiltController.java | 24 +++---- .../rest/AssetAsPlannedController.java | 22 +++---- .../base/mapper/AssetBaseResponseMapper.java | 65 +++++++++++++++++++ .../asbuilt/service/AssetServiceImpl.java | 2 +- .../test/TraceabilityTestStepDefinition.java | 4 +- .../test/tooling/rest/RestProvider.java | 6 +- .../assets/response/AssetAsBuiltResponse.java | 31 +++++++++ .../response/AssetAsPlannedResponse.java | 32 +++++++++ ...etResponse.java => AssetBaseResponse.java} | 32 ++------- 10 files changed, 169 insertions(+), 108 deletions(-) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java create mode 100644 tx-models/src/main/java/assets/response/AssetAsBuiltResponse.java create mode 100644 tx-models/src/main/java/assets/response/AssetAsPlannedResponse.java rename tx-models/src/main/java/assets/response/{AssetResponse.java => AssetBaseResponse.java} (61%) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java index 4c1fd3e68c..ca52e0dc16 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java @@ -18,27 +18,17 @@ ********************************************************************************/ package org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper; -import assets.response.AssetResponse; -import assets.response.DescriptionsResponse; -import assets.response.OwnerResponse; -import assets.response.QualityTypeResponse; -import assets.response.SemanticDataModelResponse; -import assets.response.SemanticModelResponse; +import assets.response.AssetAsBuiltResponse; +import org.eclipse.tractusx.traceability.assets.application.base.mapper.AssetBaseResponseMapper; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.QualityType; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticDataModel; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticModel; import org.eclipse.tractusx.traceability.common.model.PageResult; import java.util.List; -public class AssetAsBuiltResponseMapper { +public class AssetAsBuiltResponseMapper extends AssetBaseResponseMapper { - - public static AssetResponse from(final Asset asset) { - return AssetResponse.builder() + public static AssetAsBuiltResponse from(final Asset asset) { + return AssetAsBuiltResponse.builder() .id(asset.getId()) .idShort(asset.getIdShort()) .classification(asset.getClassification()) @@ -65,7 +55,7 @@ public static AssetResponse from(final Asset asset) { .build(); } - public static PageResult from(final PageResult assetPageResult) { + public static PageResult from(final PageResult assetPageResult) { return new PageResult<>( assetPageResult.content().stream() .map(AssetAsBuiltResponseMapper::from).toList(), @@ -76,44 +66,9 @@ public static PageResult from(final PageResult assetPageRe ); } - public static List from(final List assets) { + public static List from(final List assets) { return assets.stream() .map(AssetAsBuiltResponseMapper::from) .toList(); } - - public static SemanticModelResponse from(final SemanticModel semanticModel) { - return SemanticModelResponse.builder() - .customerPartId(semanticModel.getCustomerPartId()) - .manufacturerPartId(semanticModel.getManufacturerPartId()) - .manufacturingCountry(semanticModel.getManufacturingCountry()) - .manufacturingDate(semanticModel.getManufacturingDate()) - .nameAtCustomer(semanticModel.getNameAtCustomer()) - .nameAtManufacturer(semanticModel.getNameAtManufacturer()) - .build(); - } - - - public static OwnerResponse from(final Owner owner) { - return OwnerResponse.valueOf(owner.name()); - } - - public static DescriptionsResponse from(final Descriptions descriptions) { - return new DescriptionsResponse( - descriptions.id(), - descriptions.idShort() - ); - } - - public static QualityTypeResponse from(final QualityType qualityType) { - return QualityTypeResponse.valueOf(qualityType.name()); - } - - - public static SemanticDataModelResponse from(final SemanticDataModel semanticDataModel) { - if (semanticDataModel == null) { - return SemanticDataModelResponse.UNKNOWN; - } - return SemanticDataModelResponse.valueOf(semanticDataModel.name()); - } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java index 7f9a2999e4..f129a0e884 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java @@ -21,7 +21,7 @@ package org.eclipse.tractusx.traceability.assets.application.asbuilt.rest; -import assets.response.AssetResponse; +import assets.response.AssetAsBuiltResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; @@ -71,7 +71,7 @@ public class AssetAsBuiltController { @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), @ApiResponse( responseCode = "400", - description = "Authorization failed.", + description = "Bad request.", content = @Content( mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))), @@ -121,7 +121,7 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { array = @ArraySchema( arraySchema = @Schema( description = "Assets", - implementation = AssetResponse.class, + implementation = AssetAsBuiltResponse.class, additionalProperties = Schema.AdditionalPropertiesValue.FALSE ), maxItems = Integer.MAX_VALUE, @@ -159,7 +159,7 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("") - public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { + public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { return AssetAsBuiltResponseMapper.from(assetService.getAssets(OwnPageable.toPageable(pageable), owner)); } @@ -212,7 +212,7 @@ public Map assetsCountryMap() { description = "The endpoint returns an asset filtered by id .", security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the assets found", - content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + content = {@Content(schema = @Schema(implementation = AssetAsBuiltResponse.class))}), @ApiResponse( responseCode = "400", description = "Bad request.", @@ -245,7 +245,7 @@ public Map assetsCountryMap() { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}") - public AssetResponse asset(@PathVariable String assetId) { + public AssetAsBuiltResponse asset(@PathVariable String assetId) { return AssetAsBuiltResponseMapper.from(assetService.getAssetById(assetId)); } @@ -256,7 +256,7 @@ public AssetResponse asset(@PathVariable String assetId) { description = "The endpoint returns an asset filtered by child id.", security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the asset by childId", - content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + content = {@Content(schema = @Schema(implementation = AssetAsBuiltResponse.class))}), @ApiResponse( responseCode = "400", description = "Bad request.", @@ -289,7 +289,7 @@ public AssetResponse asset(@PathVariable String assetId) { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}/children/{childId}") - public AssetResponse asset(@PathVariable String assetId, @PathVariable String childId) { + public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable String childId) { return AssetAsBuiltResponseMapper.from(assetService.getAssetByChildId(assetId, childId)); } @@ -299,7 +299,7 @@ public AssetResponse asset(@PathVariable String assetId, @PathVariable String ch description = "The endpoint updates asset by provided quality type.", security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the updated asset", - content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + content = {@Content(schema = @Schema(implementation = AssetAsBuiltResponse.class))}), @ApiResponse( responseCode = "400", description = "Bad request.", @@ -338,7 +338,7 @@ public AssetResponse asset(@PathVariable String assetId, @PathVariable String ch mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @PatchMapping("/{assetId}") - public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { + public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { return AssetAsBuiltResponseMapper.from( assetService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) ); @@ -354,7 +354,7 @@ public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBo array = @ArraySchema( arraySchema = @Schema( description = "Assets", - implementation = AssetResponse.class, + implementation = AssetAsBuiltResponse.class, additionalProperties = Schema.AdditionalPropertiesValue.FALSE ), maxItems = Integer.MAX_VALUE, @@ -398,7 +398,7 @@ public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBo mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @PostMapping("/detail-information") - public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { + public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { return AssetAsBuiltResponseMapper.from( assetService.getAssetsById(getDetailInformationRequest.assetIds()) ); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java index e4da91fce8..ea801600e0 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -19,7 +19,7 @@ package org.eclipse.tractusx.traceability.assets.application.asplanned.rest; -import assets.response.AssetResponse; +import assets.response.AssetAsBuiltResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; @@ -113,7 +113,7 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { array = @ArraySchema( arraySchema = @Schema( description = "Assets", - implementation = AssetResponse.class, + implementation = AssetAsBuiltResponse.class, additionalProperties = Schema.AdditionalPropertiesValue.FALSE ), maxItems = Integer.MAX_VALUE, @@ -151,7 +151,7 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("") - public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { + public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { return AssetAsBuiltResponseMapper.from(assetService.getAssets(OwnPageable.toPageable(pageable), owner)); } @@ -204,7 +204,7 @@ public Map assetsCountryMap() { description = "The endpoint returns an asset filtered by id .", security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the assets found", - content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + content = {@Content(schema = @Schema(implementation = AssetAsBuiltResponse.class))}), @ApiResponse( responseCode = "400", description = "Bad request.", @@ -237,7 +237,7 @@ public Map assetsCountryMap() { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}") - public AssetResponse asset(@PathVariable String assetId) { + public AssetAsBuiltResponse asset(@PathVariable String assetId) { return AssetAsBuiltResponseMapper.from(assetService.getAssetById(assetId)); } @@ -248,7 +248,7 @@ public AssetResponse asset(@PathVariable String assetId) { description = "The endpoint returns an asset filtered by child id.", security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the asset by childId", - content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + content = {@Content(schema = @Schema(implementation = AssetAsBuiltResponse.class))}), @ApiResponse( responseCode = "400", description = "Bad request.", @@ -281,7 +281,7 @@ public AssetResponse asset(@PathVariable String assetId) { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}/children/{childId}") - public AssetResponse asset(@PathVariable String assetId, @PathVariable String childId) { + public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable String childId) { return AssetAsBuiltResponseMapper.from(assetService.getAssetByChildId(assetId, childId)); } @@ -291,7 +291,7 @@ public AssetResponse asset(@PathVariable String assetId, @PathVariable String ch description = "The endpoint updates asset by provided quality type.", security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Returns the updated asset", - content = {@Content(schema = @Schema(implementation = AssetResponse.class))}), + content = {@Content(schema = @Schema(implementation = AssetAsBuiltResponse.class))}), @ApiResponse( responseCode = "400", description = "Bad request.", @@ -330,7 +330,7 @@ public AssetResponse asset(@PathVariable String assetId, @PathVariable String ch mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @PatchMapping("/{assetId}") - public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { + public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { return AssetAsBuiltResponseMapper.from( assetService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) ); @@ -346,7 +346,7 @@ public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBo array = @ArraySchema( arraySchema = @Schema( description = "Assets", - implementation = AssetResponse.class, + implementation = AssetAsBuiltResponse.class, additionalProperties = Schema.AdditionalPropertiesValue.FALSE ), maxItems = Integer.MAX_VALUE, @@ -390,7 +390,7 @@ public AssetResponse updateAsset(@PathVariable String assetId, @Valid @RequestBo mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @PostMapping("/detail-information") - public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { + public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { return AssetAsBuiltResponseMapper.from( assetService.getAssetsById(getDetailInformationRequest.assetIds()) ); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java new file mode 100644 index 0000000000..a0f8c94b06 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java @@ -0,0 +1,65 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.application.base.mapper; + +import assets.response.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.SuperBuilder; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.*; + +@AllArgsConstructor +@Data +@SuperBuilder +public class AssetBaseResponseMapper { + public static SemanticModelResponse from(final SemanticModel semanticModel) { + return SemanticModelResponse.builder() + .customerPartId(semanticModel.getCustomerPartId()) + .manufacturerPartId(semanticModel.getManufacturerPartId()) + .manufacturingCountry(semanticModel.getManufacturingCountry()) + .manufacturingDate(semanticModel.getManufacturingDate()) + .nameAtCustomer(semanticModel.getNameAtCustomer()) + .nameAtManufacturer(semanticModel.getNameAtManufacturer()) + .build(); + } + + + public static OwnerResponse from(final Owner owner) { + return OwnerResponse.valueOf(owner.name()); + } + + public static DescriptionsResponse from(final Descriptions descriptions) { + return new DescriptionsResponse( + descriptions.id(), + descriptions.idShort() + ); + } + + public static QualityTypeResponse from(final QualityType qualityType) { + return QualityTypeResponse.valueOf(qualityType.name()); + } + + + public static SemanticDataModelResponse from(final SemanticDataModel semanticDataModel) { + if (semanticDataModel == null) { + return SemanticDataModelResponse.UNKNOWN; + } + return SemanticDataModelResponse.valueOf(semanticDataModel.name()); + } +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java index f07ff0713d..119267681c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java @@ -50,7 +50,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class AssetServiceImpl implements AssetService { +public class AssetServiceImpl implements AssetService{ private final AssetAsBuiltRepository assetAsBuiltRepository; private final AssetAsPlannedRepository assetAsPlannedRepository; diff --git a/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/TraceabilityTestStepDefinition.java b/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/TraceabilityTestStepDefinition.java index 7a35cea330..c3d952de6e 100644 --- a/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/TraceabilityTestStepDefinition.java +++ b/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/TraceabilityTestStepDefinition.java @@ -19,7 +19,7 @@ package org.eclipse.tractusx.traceability.test; -import assets.response.AssetResponse; +import assets.response.AssetAsBuiltResponse; import io.cucumber.datatable.DataTable; import io.cucumber.java.Before; import io.cucumber.java.ParameterType; @@ -60,7 +60,7 @@ public class TraceabilityTestStepDefinition { private Long notificationID_TXA = null; private Long notificationID_TXB = null; private String notificationDescription = null; - private List requestedAssets; + private List requestedAssets; @ParameterType("TRACE_X_A|TRACE_X_B") diff --git a/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java b/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java index adc1c900e3..86af47afff 100644 --- a/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java +++ b/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java @@ -19,7 +19,7 @@ package org.eclipse.tractusx.traceability.test.tooling.rest; -import assets.response.AssetResponse; +import assets.response.AssetAsBuiltResponse; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @@ -212,7 +212,7 @@ private RequestSpecification getRequestSpecification() { return builder.build(); } - public List getAssets(String ownerFilter) { + public List getAssets(String ownerFilter) { return given().spec(getRequestSpecification()) .contentType(ContentType.JSON) .when() @@ -222,6 +222,6 @@ public List getAssets(String ownerFilter) { .extract() .body() .jsonPath() - .getList("pageResult.content", AssetResponse.class); + .getList("pageResult.content", AssetAsBuiltResponse.class); } } diff --git a/tx-models/src/main/java/assets/response/AssetAsBuiltResponse.java b/tx-models/src/main/java/assets/response/AssetAsBuiltResponse.java new file mode 100644 index 0000000000..cc095a255e --- /dev/null +++ b/tx-models/src/main/java/assets/response/AssetAsBuiltResponse.java @@ -0,0 +1,31 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package assets.response; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.experimental.SuperBuilder; + +@SuperBuilder +@ArraySchema(arraySchema = @Schema(description = "Assets", additionalProperties = Schema.AdditionalPropertiesValue.FALSE), maxItems = Integer.MAX_VALUE) +public class AssetAsBuiltResponse extends AssetBaseResponse { + + +} diff --git a/tx-models/src/main/java/assets/response/AssetAsPlannedResponse.java b/tx-models/src/main/java/assets/response/AssetAsPlannedResponse.java new file mode 100644 index 0000000000..2b421b01e3 --- /dev/null +++ b/tx-models/src/main/java/assets/response/AssetAsPlannedResponse.java @@ -0,0 +1,32 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package assets.response; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import lombok.experimental.SuperBuilder; + +@SuperBuilder +@Data +@ArraySchema(arraySchema = @Schema(description = "Assets", additionalProperties = Schema.AdditionalPropertiesValue.FALSE), maxItems = Integer.MAX_VALUE) +public class AssetAsPlannedResponse extends AssetBaseResponse { + +} diff --git a/tx-models/src/main/java/assets/response/AssetResponse.java b/tx-models/src/main/java/assets/response/AssetBaseResponse.java similarity index 61% rename from tx-models/src/main/java/assets/response/AssetResponse.java rename to tx-models/src/main/java/assets/response/AssetBaseResponse.java index 73cc8ee40a..90f8a1dcf6 100644 --- a/tx-models/src/main/java/assets/response/AssetResponse.java +++ b/tx-models/src/main/java/assets/response/AssetBaseResponse.java @@ -1,41 +1,20 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - package assets.response; import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; import java.util.List; -@AllArgsConstructor -@NoArgsConstructor -@Builder +@RequiredArgsConstructor @Data -@ArraySchema(arraySchema = @Schema(description = "Assets", additionalProperties = Schema.AdditionalPropertiesValue.FALSE), maxItems = Integer.MAX_VALUE) -public class AssetResponse { +@SuperBuilder +public class AssetBaseResponse { @ApiModelProperty(example = "urn:uuid:ceb6b964-5779-49c1-b5e9-0ee70528fcbd") @Size(max = 255) private String id; @@ -73,5 +52,4 @@ public class AssetResponse { @ApiModelProperty(example = "component") @Size(max = 255) private String classification; - } From 38b35d8b3a63fae21b45cf49a0640c5f8a4442eb Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 08:31:22 +0200 Subject: [PATCH 03/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../application/asplanned/rest/AssetAsPlannedController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java index ea801600e0..4ab0869008 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -49,7 +49,7 @@ @RestController @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Assets") -@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") +@RequestMapping(path = "/assets/as-planned", produces = "application/json", consumes = "application/json") @RequiredArgsConstructor public class AssetAsPlannedController { From eb7a8a52b8ceb15646f0b7195bf7a12d3f1c992b Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 10:14:12 +0200 Subject: [PATCH 04/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../common/support/AssetTestData.groovy | 4 +- .../rest/PublisherAlertsControllerIT.groovy | 6 +- ...PublisherInvestigationsControllerIT.groovy | 6 +- .../mapper/AssetAsBuiltResponseMapper.java | 8 +- .../asbuilt/rest/AssetAsBuiltController.java | 20 ++-- ...tService.java => AssetAsBuiltService.java} | 29 +---- .../rest/AssetAsPlannedController.java | 9 +- .../service/AssetAsPlannedService.java | 25 ++++ .../base/mapper/AssetBaseResponseMapper.java | 2 +- .../base/request/QualityTypeRequest.java | 2 +- .../base/rest/AssetBaseController.java | 110 ++++++++++++++++++ .../base/service/AssetBaseService.java | 33 ++++++ ...Impl.java => AssetAsBuiltServiceImpl.java} | 43 +++---- .../assets/domain/base/AssetRepository.java | 20 ++-- .../assets/domain/base/IrsRepository.java | 4 +- .../Asset.java => base/model/AssetBase.java} | 4 +- .../{asbuilt => base}/model/Descriptions.java | 2 +- .../domain/{asbuilt => base}/model/Owner.java | 2 +- .../{asbuilt => base}/model/QualityType.java | 2 +- .../model/SemanticDataModel.java | 2 +- .../model/SemanticModel.java | 2 +- .../service/DashboardServiceImpl.java | 2 +- .../asbuilt/model/AssetAsBuiltEntity.java | 16 +-- .../AssetAsBuiltRepositoryImpl.java | 22 ++-- .../repository/JpaAssetAsBuiltRepository.java | 2 +- .../asplanned/model/AssetAsPlannedEntity.java | 16 +-- .../AssetAsPlannedRepositoryImpl.java | 22 ++-- .../JpaAssetAsPlannedRepository.java | 2 +- .../infrastructure/base/irs/IrsService.java | 4 +- .../irs/model/response/JobDetailResponse.java | 32 ++--- .../semanticdatamodel/SemanticDataModel.java | 22 ++-- .../base/model/AssetBaseEntity.java | 4 +- .../base/model/SemanticDataModelEntity.java | 2 +- .../alert/service/AlertServiceImpl.java | 4 +- .../alert/service/AlertsReceiverService.java | 4 +- .../service/InvestigationServiceImpl.java | 4 +- .../InvestigationsReceiverService.java | 4 +- .../service/NotificationPublisherService.java | 18 +-- .../service/DecentralRegistryServiceImpl.java | 5 +- .../response/DescriptionsResponseTest.java | 2 +- ....java => AssetAsBuiltServiceImplTest.java} | 14 +-- ...PersistentAssetsAsBuiltRepositoryTest.java | 10 +- .../repository/rest/irs/IrsServiceTest.java | 8 +- .../rest/irs/model/JobDetailResponseTest.java | 10 +- .../common/support/AssetTestData.java | 4 +- .../common/support/AssetsSupport.java | 2 +- .../common/support/BpnSupport.java | 4 +- .../InvestigationsReceiverServiceTest.java | 4 +- .../NotificationPublisherServiceTest.java | 4 +- ...ntralDecentralRegistryServiceImplTest.java | 6 +- .../testdata/AssetTestDataFactory.java | 24 ++-- 51 files changed, 383 insertions(+), 229 deletions(-) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/{AssetService.java => AssetAsBuiltService.java} (59%) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/{AssetServiceImpl.java => AssetAsBuiltServiceImpl.java} (81%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/{asbuilt/model/Asset.java => base/model/AssetBase.java} (95%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/{asbuilt => base}/model/Descriptions.java (93%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/{asbuilt => base}/model/Owner.java (93%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/{asbuilt => base}/model/QualityType.java (94%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/{asbuilt => base}/model/SemanticDataModel.java (93%) rename tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/{asbuilt => base}/model/SemanticModel.java (98%) rename tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/{AssetServiceImplTest.java => AssetAsBuiltServiceImplTest.java} (86%) diff --git a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/AssetTestData.groovy b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/AssetTestData.groovy index f0b2c1baee..d9aa6f7e65 100644 --- a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/AssetTestData.groovy +++ b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/AssetTestData.groovy @@ -20,7 +20,7 @@ package org.eclipse.tractusx.traceability.common.support import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.JobDetailResponse class AssetTestData { @@ -29,7 +29,7 @@ class AssetTestData { .configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, false) .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - List readAndConvertAssetsForTests() { + List readAndConvertAssetsForTests() { try { InputStream file = AssetTestData.class.getResourceAsStream("/data/irs_assets_v4.json") JobDetailResponse response = mapper.readValue(file, JobDetailResponse.class) diff --git a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/alert/rest/PublisherAlertsControllerIT.groovy b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/alert/rest/PublisherAlertsControllerIT.groovy index c734906bfd..6ba8100715 100644 --- a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/alert/rest/PublisherAlertsControllerIT.groovy +++ b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/alert/rest/PublisherAlertsControllerIT.groovy @@ -22,7 +22,7 @@ package org.eclipse.tractusx.traceability.qualitynotification.alert.rest import io.restassured.http.ContentType import org.apache.commons.lang3.RandomStringUtils import org.eclipse.tractusx.traceability.IntegrationSpecification -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase import org.eclipse.tractusx.traceability.common.security.JwtRole import org.eclipse.tractusx.traceability.common.support.* import org.eclipse.tractusx.traceability.infrastructure.edc.blackbox.model.EDCNotification @@ -110,7 +110,7 @@ class PublisherAlertsControllerIT extends IntegrationSpecification implements Ir then: partIds.each { partId -> - Asset asset = assetAsBuiltRepository().getAssetById(partId) + AssetBase asset = assetAsBuiltRepository().getAssetById(partId) assert asset assert asset.isActiveAlert() } @@ -498,7 +498,7 @@ class PublisherAlertsControllerIT extends IntegrationSpecification implements Ir .body("id", Matchers.isA(Number.class)) then: partIds.each { partId -> - Asset asset = assetAsBuiltRepository().getAssetById(partId) + AssetBase asset = assetAsBuiltRepository().getAssetById(partId) assert asset assert asset.isActiveAlert() } diff --git a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/investigation/rest/PublisherInvestigationsControllerIT.groovy b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/investigation/rest/PublisherInvestigationsControllerIT.groovy index 7aa7581ca3..a94064f568 100644 --- a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/investigation/rest/PublisherInvestigationsControllerIT.groovy +++ b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/qualitynotification/investigation/rest/PublisherInvestigationsControllerIT.groovy @@ -24,7 +24,7 @@ package org.eclipse.tractusx.traceability.qualitynotification.investigation.rest import io.restassured.http.ContentType import org.apache.commons.lang3.RandomStringUtils import org.eclipse.tractusx.traceability.IntegrationSpecification -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase import org.eclipse.tractusx.traceability.common.security.JwtRole import org.eclipse.tractusx.traceability.common.support.* import org.eclipse.tractusx.traceability.infrastructure.edc.blackbox.model.EDCNotification @@ -110,7 +110,7 @@ class PublisherInvestigationsControllerIT extends IntegrationSpecification imple then: partIds.each { partId -> - Asset asset = assetAsBuiltRepository().getAssetById(partId) + AssetBase asset = assetAsBuiltRepository().getAssetById(partId) assert asset assert asset.isUnderInvestigation() } @@ -513,7 +513,7 @@ class PublisherInvestigationsControllerIT extends IntegrationSpecification imple .body("id", Matchers.isA(Number.class)) then: partIds.each { partId -> - Asset asset = assetAsBuiltRepository().getAssetById(partId) + AssetBase asset = assetAsBuiltRepository().getAssetById(partId) assert asset assert asset.isUnderInvestigation() } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java index ca52e0dc16..a07506a0ba 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/mapper/AssetAsBuiltResponseMapper.java @@ -20,14 +20,14 @@ import assets.response.AssetAsBuiltResponse; import org.eclipse.tractusx.traceability.assets.application.base.mapper.AssetBaseResponseMapper; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.eclipse.tractusx.traceability.common.model.PageResult; import java.util.List; public class AssetAsBuiltResponseMapper extends AssetBaseResponseMapper { - public static AssetAsBuiltResponse from(final Asset asset) { + public static AssetAsBuiltResponse from(final AssetBase asset) { return AssetAsBuiltResponse.builder() .id(asset.getId()) .idShort(asset.getIdShort()) @@ -55,7 +55,7 @@ public static AssetAsBuiltResponse from(final Asset asset) { .build(); } - public static PageResult from(final PageResult assetPageResult) { + public static PageResult from(final PageResult assetPageResult) { return new PageResult<>( assetPageResult.content().stream() .map(AssetAsBuiltResponseMapper::from).toList(), @@ -66,7 +66,7 @@ public static PageResult from(final PageResult asse ); } - public static List from(final List assets) { + public static List from(final List assets) { return assets.stream() .map(AssetAsBuiltResponseMapper::from) .toList(); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java index f129a0e884..42c3c15477 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java @@ -37,8 +37,8 @@ import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetService; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; @@ -61,7 +61,7 @@ @RequiredArgsConstructor public class AssetAsBuiltController { - private final AssetService assetService; + private final AssetAsBuiltService assetAsBuiltService; @Operation(operationId = "sync", summary = "Synchronizes assets from IRS", @@ -108,7 +108,7 @@ public class AssetAsBuiltController { schema = @Schema(implementation = ErrorResponse.class)))}) @PostMapping("/sync") public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { - assetService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); + assetAsBuiltService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); } @Operation(operationId = "assets", @@ -160,7 +160,7 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("") public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { - return AssetAsBuiltResponseMapper.from(assetService.getAssets(OwnPageable.toPageable(pageable), owner)); + return AssetAsBuiltResponseMapper.from(assetAsBuiltService.getAssets(OwnPageable.toPageable(pageable), owner)); } @Operation(operationId = "assetsCountryMap", @@ -202,7 +202,7 @@ public PageResult assets(OwnPageable pageable, @QueryParam schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/countries") public Map assetsCountryMap() { - return assetService.getAssetsCountryMap(); + return assetAsBuiltService.getAssetsCountryMap(); } @@ -246,7 +246,7 @@ public Map assetsCountryMap() { schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}") public AssetAsBuiltResponse asset(@PathVariable String assetId) { - return AssetAsBuiltResponseMapper.from(assetService.getAssetById(assetId)); + return AssetAsBuiltResponseMapper.from(assetAsBuiltService.getAssetById(assetId)); } @@ -290,7 +290,7 @@ public AssetAsBuiltResponse asset(@PathVariable String assetId) { schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}/children/{childId}") public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable String childId) { - return AssetAsBuiltResponseMapper.from(assetService.getAssetByChildId(assetId, childId)); + return AssetAsBuiltResponseMapper.from(assetAsBuiltService.getAssetByChildId(assetId, childId)); } @Operation(operationId = "updateAsset", @@ -340,7 +340,7 @@ public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable St @PatchMapping("/{assetId}") public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { return AssetAsBuiltResponseMapper.from( - assetService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) + assetAsBuiltService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) ); } @@ -400,7 +400,7 @@ public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @Re @PostMapping("/detail-information") public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { return AssetAsBuiltResponseMapper.from( - assetService.getAssetsById(getDetailInformationRequest.assetIds()) + assetAsBuiltService.getAssetsById(getDetailInformationRequest.assetIds()) ); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java similarity index 59% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetService.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java index 1bb85518a0..9800d217a1 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java @@ -18,9 +18,10 @@ ********************************************************************************/ package org.eclipse.tractusx.traceability.assets.application.asbuilt.service; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.QualityType; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; import org.springframework.data.domain.Pageable; @@ -28,26 +29,6 @@ import java.util.List; import java.util.Map; -public interface AssetService { - - void synchronizeAssetsAsync(List globalAssetIds); - - void synchronizeAssetsAsync(String globalAssetId); - - void setAssetsInvestigationStatus(QualityNotification investigation); - - void setAssetsAlertStatus(QualityNotification alert); - - Asset updateQualityType(String assetId, QualityType qualityType); - - Map getAssetsCountryMap(); - - PageResult getAssets(Pageable pageable, Owner owner); - - Asset getAssetById(String assetId); - - List getAssetsById(List assetIds); - - Asset getAssetByChildId(String assetId, String childId); +public interface AssetAsBuiltService extends AssetBaseService { } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java index 4ab0869008..9f8bfee35d 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -32,11 +32,12 @@ import jakarta.ws.rs.QueryParam; import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; +import org.eclipse.tractusx.traceability.assets.application.asplanned.service.AssetAsPlannedService; import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetService; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; @@ -53,7 +54,7 @@ @RequiredArgsConstructor public class AssetAsPlannedController { - private final AssetService assetService; + private final AssetAsPlannedService assetService; @Operation(operationId = "sync", summary = "Synchronizes assets from IRS", @@ -63,7 +64,7 @@ public class AssetAsPlannedController { @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), @ApiResponse( responseCode = "400", - description = "Authorization failed.", + description = "Bad request.", content = @Content( mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))), diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java new file mode 100644 index 0000000000..c474e6cf0b --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java @@ -0,0 +1,25 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.application.asplanned.service; + +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; + +public interface AssetAsPlannedService extends AssetBaseService { + +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java index a0f8c94b06..accc20b6cf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/mapper/AssetBaseResponseMapper.java @@ -22,7 +22,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.SuperBuilder; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.*; +import org.eclipse.tractusx.traceability.assets.domain.base.model.*; @AllArgsConstructor @Data diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java index b93eeb6c8a..f300899d59 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/request/QualityTypeRequest.java @@ -24,7 +24,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; @ApiModel(description = "Quality types") public enum QualityTypeRequest { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java new file mode 100644 index 0000000000..7754d6d488 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java @@ -0,0 +1,110 @@ +/******************************************************************************** + * Copyright (c) 2022, 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022, 2023 ZF Friedrichshafen AG + * Copyright (c) 2022, 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.application.base.rest; + +import assets.response.AssetAsBuiltResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.ws.rs.QueryParam; +import lombok.RequiredArgsConstructor; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.common.request.OwnPageable; +import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") +@Tag(name = "Assets") +@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") +@RequiredArgsConstructor +public class AssetBaseController { + + private final AssetBaseService assetBaseService; + + @Operation(operationId = "sync", + summary = "Synchronizes assets from IRS", + tags = {"Assets"}, + description = "The endpoint synchronizes the assets from irs.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "415", + description = "Unsupported media type", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @PostMapping("/sync") + public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { + assetBaseService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); + } + + +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java new file mode 100644 index 0000000000..14b1e921a0 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java @@ -0,0 +1,33 @@ +package org.eclipse.tractusx.traceability.assets.application.base.service; + +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +public interface AssetBaseService { + void synchronizeAssetsAsync(List globalAssetIds); + + void synchronizeAssetsAsync(String globalAssetId); + + void setAssetsInvestigationStatus(QualityNotification investigation); + + void setAssetsAlertStatus(QualityNotification alert); + + AssetBase updateQualityType(String assetId, QualityType qualityType); + + Map getAssetsCountryMap(); + + PageResult getAssets(Pageable pageable, Owner owner); + + AssetBase getAssetById(String assetId); + + List getAssetsById(List assetIds); + + AssetBase getAssetByChildId(String assetId, String childId); +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java similarity index 81% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java index 119267681c..3f154c05a2 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java @@ -21,14 +21,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetService; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; @@ -50,7 +51,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class AssetServiceImpl implements AssetService{ +public class AssetAsBuiltServiceImpl implements AssetBaseService { private final AssetAsBuiltRepository assetAsBuiltRepository; private final AssetAsPlannedRepository assetAsPlannedRepository; @@ -80,15 +81,15 @@ public void synchronizeAssetsAsync(String globalAssetId) { } private void syncAssetsAsPlanned(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); assetAsPlannedRepository.saveAll(downwardAssets); } private void syncAssetsAsBuilt(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); assetAsBuiltRepository.saveAll(downwardAssets); - List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); upwardAssets.forEach(asset -> { if (assetAsBuiltRepository.existsById(asset.getId())) { @@ -127,10 +128,10 @@ public void setAssetsAlertStatus(QualityNotification alert) { }); } - public Asset updateQualityType(String assetId, QualityType qualityType) { - Asset foundAsset = assetAsBuiltRepository.getAssetById(assetId); + public AssetBase updateQualityType(String assetId, QualityType qualityType) { + AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); if (foundAsset == null) { - Asset foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); + AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); foundAssetAsPlanned.setQualityType(qualityType); return assetAsPlannedRepository.save(foundAssetAsPlanned); } else { @@ -154,12 +155,12 @@ public Map getAssetsCountryMap() { return mergedMap; } - public PageResult getAssets(Pageable pageable, Owner owner) { + public PageResult getAssets(Pageable pageable, Owner owner) { Pageable halfPage = halfPageable(pageable); - PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); - PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); + PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); + PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); - List mergedContent = new ArrayList<>(assetsAsPlanned.content()); + List mergedContent = new ArrayList<>(assetsAsPlanned.content()); mergedContent.addAll(assetsAsBuilt.content()); return new PageResult<>(mergedContent, assetsAsBuilt.page(), @@ -177,7 +178,7 @@ private Pageable halfPageable(Pageable pageable) { return Pageable.unpaged(); } - public Asset getAssetById(String assetId) { + public AssetBase getAssetById(String assetId) { try { return assetAsBuiltRepository.getAssetById(assetId); } catch (AssetNotFoundException assetNotFoundException) { @@ -185,15 +186,15 @@ public Asset getAssetById(String assetId) { } } - public List getAssetsById(List assetIds) { - List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); - List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); - List mergedList = new ArrayList<>(assetAsBuiltIds); + public List getAssetsById(List assetIds) { + List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); + List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); + List mergedList = new ArrayList<>(assetAsBuiltIds); mergedList.addAll(assetAsPlannedIds); return mergedList; } - public Asset getAssetByChildId(String assetId, String childId) { + public AssetBase getAssetByChildId(String assetId, String childId) { try { return assetAsBuiltRepository.getAssetByChildId(assetId, childId); } catch (AssetNotFoundException assetNotFoundException) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java index 0513a09158..c31c70a27f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java @@ -19,33 +19,33 @@ package org.eclipse.tractusx.traceability.assets.domain.base; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.springframework.data.domain.Pageable; import java.util.List; public interface AssetRepository { - Asset getAssetById(String assetId); + AssetBase getAssetById(String assetId); boolean existsById(String globalAssetId); - List getAssetsById(List assetIds); + List getAssetsById(List assetIds); - Asset getAssetByChildId(String assetId, String childId); + AssetBase getAssetByChildId(String assetId, String childId); - PageResult getAssets(Pageable pageable, Owner owner); + PageResult getAssets(Pageable pageable, Owner owner); - List getAssets(); + List getAssets(); - Asset save(Asset asset); + AssetBase save(AssetBase asset); - List saveAll(List assets); + List saveAll(List assets); long countAssets(); - void updateParentDescriptionsAndOwner(final Asset asset); + void updateParentDescriptionsAndOwner(final AssetBase asset); long countAssetsByOwner(Owner owner); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/IrsRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/IrsRepository.java index 983ab7a0e2..c27b25ddf0 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/IrsRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/IrsRepository.java @@ -21,7 +21,7 @@ package org.eclipse.tractusx.traceability.assets.domain.base; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; @@ -36,7 +36,7 @@ public interface IrsRepository { * @param aspects the list of aspects * @return a list of assets that match the given global asset ID and direction, or an empty list if no assets are found */ - List findAssets(String globalAssetId, Direction direction, List aspects, BomLifecycle bomLifecycle); + List findAssets(String globalAssetId, Direction direction, List aspects, BomLifecycle bomLifecycle); void createIrsPolicyIfMissing(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Asset.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java similarity index 95% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Asset.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java index fb7139c34b..bec7b86d46 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Asset.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java @@ -19,7 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.domain.asbuilt.model; +package org.eclipse.tractusx.traceability.assets.domain.base.model; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,7 +33,7 @@ @AllArgsConstructor @Data @Builder -public class Asset { +public class AssetBase { private final String id; private final String idShort; private String semanticModelId; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Descriptions.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/Descriptions.java similarity index 93% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Descriptions.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/Descriptions.java index a79f3f4696..939494bb09 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Descriptions.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/Descriptions.java @@ -17,7 +17,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.domain.asbuilt.model; +package org.eclipse.tractusx.traceability.assets.domain.base.model; import lombok.Builder; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Owner.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/Owner.java similarity index 93% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Owner.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/Owner.java index 068b5173bd..dc1d70039f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/Owner.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/Owner.java @@ -19,7 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.domain.asbuilt.model; +package org.eclipse.tractusx.traceability.assets.domain.base.model; public enum Owner { SUPPLIER, CUSTOMER, OWN, UNKNOWN diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/QualityType.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/QualityType.java similarity index 94% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/QualityType.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/QualityType.java index d975fb0bed..d1302290f8 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/QualityType.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/QualityType.java @@ -19,7 +19,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.domain.asbuilt.model; +package org.eclipse.tractusx.traceability.assets.domain.base.model; public enum QualityType { OK, diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticDataModel.java similarity index 93% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/SemanticDataModel.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticDataModel.java index ee554951b6..92e25f48cf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticDataModel.java @@ -17,7 +17,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.domain.asbuilt.model; +package org.eclipse.tractusx.traceability.assets.domain.base.model; public enum SemanticDataModel { BATCH, SERIALPART, UNKNOWN, PARTASPLANNED, JUSTINSEQUENCE diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/SemanticModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java similarity index 98% rename from tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/SemanticModel.java rename to tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java index ff879108cd..bc1d3d1ec8 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/model/SemanticModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java @@ -16,7 +16,7 @@ * * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.domain.asbuilt.model; +package org.eclipse.tractusx.traceability.assets.domain.base.model; import lombok.Builder; import lombok.Data; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/dashboard/service/DashboardServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/dashboard/service/DashboardServiceImpl.java index dd40ed9cfc..bb8450dc23 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/dashboard/service/DashboardServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/dashboard/service/DashboardServiceImpl.java @@ -26,7 +26,7 @@ import org.eclipse.tractusx.traceability.assets.application.dashboard.service.DashboardService; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.repository.InvestigationRepository; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; import org.springframework.stereotype.Component; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/model/AssetAsBuiltEntity.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/model/AssetAsBuiltEntity.java index 6485c73e32..1288478599 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/model/AssetAsBuiltEntity.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/model/AssetAsBuiltEntity.java @@ -34,9 +34,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticModel; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticModel; import org.eclipse.tractusx.traceability.assets.infrastructure.base.model.AssetBaseEntity; import org.eclipse.tractusx.traceability.assets.infrastructure.base.model.SemanticDataModelEntity; import org.eclipse.tractusx.traceability.qualitynotification.infrastructure.alert.model.AlertNotificationEntity; @@ -75,7 +75,7 @@ public class AssetAsBuiltEntity extends AssetBaseEntity { private List alertNotificationEntities = new ArrayList<>(); - public static AssetAsBuiltEntity from(Asset asset) { + public static AssetAsBuiltEntity from(AssetBase asset) { return AssetAsBuiltEntity.builder() .id(asset.getId()) .idShort(asset.getIdShort()) @@ -104,8 +104,8 @@ public static AssetAsBuiltEntity from(Asset asset) { .build(); } - public static Asset toDomain(AssetAsBuiltEntity entity) { - return Asset.builder() + public static AssetBase toDomain(AssetAsBuiltEntity entity) { + return AssetBase.builder() .id(entity.getId()) .idShort(entity.getIdShort()) .semanticDataModel(SemanticDataModelEntity.toDomain(entity.getSemanticDataModel())) @@ -129,13 +129,13 @@ public static Asset toDomain(AssetAsBuiltEntity entity) { .build(); } - public static List toDomainList(List entities) { + public static List toDomainList(List entities) { return entities.stream() .map(AssetAsBuiltEntity::toDomain) .toList(); } - public static List fromList(List assets) { + public static List fromList(List assets) { return assets.stream() .map(AssetAsBuiltEntity::from) .toList(); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java index 5a1aa8ae9e..e6dfaaf664 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java @@ -25,8 +25,8 @@ import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.springframework.data.domain.Pageable; @@ -42,7 +42,7 @@ public class AssetAsBuiltRepositoryImpl implements AssetAsBuiltRepository { @Override @Transactional - public Asset getAssetById(String assetId) { + public AssetBase getAssetById(String assetId) { return jpaAssetAsBuiltRepository.findById(assetId) .map(AssetAsBuiltEntity::toDomain) .orElseThrow(() -> new AssetNotFoundException("Asset with id %s was not found.".formatted(assetId))); @@ -54,21 +54,21 @@ public boolean existsById(String globalAssetId) { } @Override - public List getAssetsById(List assetIds) { + public List getAssetsById(List assetIds) { return jpaAssetAsBuiltRepository.findByIdIn(assetIds).stream() .map(AssetAsBuiltEntity::toDomain) .toList(); } @Override - public Asset getAssetByChildId(String assetId, String childId) { + public AssetBase getAssetByChildId(String assetId, String childId) { return jpaAssetAsBuiltRepository.findById(childId) .map(AssetAsBuiltEntity::toDomain) .orElseThrow(() -> new AssetNotFoundException("Child Asset Not Found")); } @Override - public PageResult getAssets(Pageable pageable, Owner owner) { + public PageResult getAssets(Pageable pageable, Owner owner) { if (owner != null) { return new PageResult<>(jpaAssetAsBuiltRepository.findByOwner(pageable, owner), AssetAsBuiltEntity::toDomain); } @@ -77,26 +77,26 @@ public PageResult getAssets(Pageable pageable, Owner owner) { @Override @Transactional - public List getAssets() { + public List getAssets() { return AssetAsBuiltEntity.toDomainList(jpaAssetAsBuiltRepository.findAll()); } @Override - public Asset save(Asset asset) { + public AssetBase save(AssetBase asset) { return AssetAsBuiltEntity.toDomain(jpaAssetAsBuiltRepository.save(AssetAsBuiltEntity.from(asset))); } @Override @Transactional - public List saveAll(List assets) { + public List saveAll(List assets) { return AssetAsBuiltEntity.toDomainList(jpaAssetAsBuiltRepository.saveAll(AssetAsBuiltEntity.fromList(assets))); } @Transactional @Override - public void updateParentDescriptionsAndOwner(final Asset asset) { - Asset assetById = this.getAssetById(asset.getId()); + public void updateParentDescriptionsAndOwner(final AssetBase asset) { + AssetBase assetById = this.getAssetById(asset.getId()); if (assetById.getOwner().equals(Owner.UNKNOWN)) { assetById.setOwner(asset.getOwner()); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/JpaAssetAsBuiltRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/JpaAssetAsBuiltRepository.java index 868d28d833..6dfb4fa6d0 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/JpaAssetAsBuiltRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/JpaAssetAsBuiltRepository.java @@ -21,7 +21,7 @@ package org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.repository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/model/AssetAsPlannedEntity.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/model/AssetAsPlannedEntity.java index 9fe952e105..c8c4a28baf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/model/AssetAsPlannedEntity.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/model/AssetAsPlannedEntity.java @@ -31,9 +31,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticModel; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticModel; import org.eclipse.tractusx.traceability.assets.infrastructure.base.model.AssetBaseEntity; import org.eclipse.tractusx.traceability.assets.infrastructure.base.model.SemanticDataModelEntity; import org.eclipse.tractusx.traceability.qualitynotification.infrastructure.alert.model.AlertNotificationEntity; @@ -69,7 +69,7 @@ public static class ChildDescription { private String idShort; } - public static AssetAsPlannedEntity from(Asset asset) { + public static AssetAsPlannedEntity from(AssetBase asset) { return org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.model.AssetAsPlannedEntity.builder() .id(asset.getId()) .idShort(asset.getIdShort()) @@ -89,8 +89,8 @@ public static AssetAsPlannedEntity from(Asset asset) { .build(); } - public static Asset toDomain(AssetAsPlannedEntity entity) { - return Asset.builder() + public static AssetBase toDomain(AssetAsPlannedEntity entity) { + return AssetBase.builder() .id(entity.getId()) .classification(entity.getClassification()) .idShort(entity.getIdShort()) @@ -106,13 +106,13 @@ public static Asset toDomain(AssetAsPlannedEntity entity) { .build(); } - public static List toDomainList(List entities) { + public static List toDomainList(List entities) { return entities.stream() .map(org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.model.AssetAsPlannedEntity::toDomain) .toList(); } - public static List fromList(List assets) { + public static List fromList(List assets) { return assets.stream() .map(org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.model.AssetAsPlannedEntity::from) .toList(); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java index ef743ff61e..9021f0d308 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java @@ -22,8 +22,8 @@ import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.model.AssetAsPlannedEntity; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.springframework.data.domain.Pageable; @@ -40,7 +40,7 @@ public class AssetAsPlannedRepositoryImpl implements AssetAsPlannedRepository { @Override @Transactional - public Asset getAssetById(String assetId) { + public AssetBase getAssetById(String assetId) { return jpaAssetAsPlannedRepository.findById(assetId).map(AssetAsPlannedEntity::toDomain) .orElseThrow(() -> new AssetNotFoundException("Asset with id %s was not found.".formatted(assetId))); } @@ -51,19 +51,19 @@ public boolean existsById(String globalAssetId) { } @Override - public List getAssetsById(List assetIds) { + public List getAssetsById(List assetIds) { return jpaAssetAsPlannedRepository.findByIdIn(assetIds).stream().map(AssetAsPlannedEntity::toDomain) .toList(); } @Override - public Asset getAssetByChildId(String assetId, String childId) { + public AssetBase getAssetByChildId(String assetId, String childId) { return jpaAssetAsPlannedRepository.findById(childId).map(AssetAsPlannedEntity::toDomain) .orElseThrow(() -> new AssetNotFoundException("Child Asset Not Found")); } @Override - public PageResult getAssets(Pageable pageable, Owner owner) { + public PageResult getAssets(Pageable pageable, Owner owner) { if (owner != null) { return new PageResult<>(jpaAssetAsPlannedRepository.findByOwner(pageable, owner), AssetAsPlannedEntity::toDomain); } @@ -72,25 +72,25 @@ public PageResult getAssets(Pageable pageable, Owner owner) { @Override @Transactional - public List getAssets() { + public List getAssets() { return AssetAsPlannedEntity.toDomainList(jpaAssetAsPlannedRepository.findAll()); } @Override - public Asset save(Asset asset) { + public AssetBase save(AssetBase asset) { return AssetAsPlannedEntity.toDomain(jpaAssetAsPlannedRepository.save(AssetAsPlannedEntity.from(asset))); } @Override @Transactional - public List saveAll(List assets) { + public List saveAll(List assets) { return AssetAsPlannedEntity.toDomainList(jpaAssetAsPlannedRepository.saveAll(AssetAsPlannedEntity.fromList(assets))); } @Transactional @Override - public void updateParentDescriptionsAndOwner(final Asset asset) { - Asset assetById = this.getAssetById(asset.getId()); + public void updateParentDescriptionsAndOwner(final AssetBase asset) { + AssetBase assetById = this.getAssetById(asset.getId()); if (assetById.getOwner().equals(Owner.UNKNOWN)) { assetById.setOwner(asset.getOwner()); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/JpaAssetAsPlannedRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/JpaAssetAsPlannedRepository.java index 11c8177d50..7c0c59c869 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/JpaAssetAsPlannedRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/JpaAssetAsPlannedRepository.java @@ -18,7 +18,7 @@ ********************************************************************************/ package org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.repository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.model.AssetAsPlannedEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/IrsService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/IrsService.java index e3f2716c41..3ae3bc081a 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/IrsService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/IrsService.java @@ -26,7 +26,7 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.config.IrsPolicyConfig; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.RegisterJobRequest; @@ -57,7 +57,7 @@ public class IrsService implements IrsRepository { private final ObjectMapper objectMapper; @Override - public List findAssets(String globalAssetId, Direction direction, List aspects, BomLifecycle bomLifecycle) { + public List findAssets(String globalAssetId, Direction direction, List aspects, BomLifecycle bomLifecycle) { RegisterJobRequest registerJobRequest = RegisterJobRequest.buildJobRequest(globalAssetId, applicationBPN, direction, aspects, bomLifecycle); log.info("Build HTTP Request {}", registerJobRequest); try { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java index 3ded9f1462..afdbeb8120 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java @@ -26,9 +26,9 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Relationship; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.semanticdatamodel.SemanticDataModel; @@ -96,11 +96,11 @@ public boolean isCompleted() { return JOB_STATUS_COMPLETED.equals(jobStatus.state()); } - public List convertAssets() { + public List convertAssets() { return convertAssets(BomLifecycle.fromString(jobStatus().parameter().bomLifecycle())); } - private List convertAssets(BomLifecycle bomLifecycle) { + private List convertAssets(BomLifecycle bomLifecycle) { log.info(":: convertAssets(\"{}\")", bomLifecycle.getRealName()); log.info(":: relationships: {}", relationships.toString()); @@ -113,8 +113,8 @@ private List convertAssets(BomLifecycle bomLifecycle) { Map bpnMapping = bpns(); - List ownParts = new ArrayList<>(); - List otherParts = new ArrayList<>(); + List ownParts = new ArrayList<>(); + List otherParts = new ArrayList<>(); if (bomLifecycle.equals(BomLifecycle.AS_BUILT)) { ownParts = mapToOwnPartsAsBuilt(shortIds, bpnMapping); if (isSupplierDirection()) { @@ -130,7 +130,7 @@ private List convertAssets(BomLifecycle bomLifecycle) { } } - List convertedAssets = new ArrayList<>(); + List convertedAssets = new ArrayList<>(); convertedAssets.addAll(ownParts); convertedAssets.addAll(otherParts); return convertedAssets; @@ -140,12 +140,12 @@ private boolean isSupplierDirection() { return jobStatus().parameter().direction().equalsIgnoreCase(Direction.DOWNWARD.name()); } - private List mapToOtherPartsAsBuilt(Map shortIds, Owner owner, Map bpnMapping) { + private List mapToOtherPartsAsBuilt(Map shortIds, Owner owner, Map bpnMapping) { List otherParts = semanticDataModels().stream().filter(semanticDataModel -> !isOwnPart(semanticDataModel, jobStatus)).toList(); log.info(":: mapToOtherPartsAsBuilt()"); log.info(":: otherParts: {}", otherParts); - final List assets = otherParts + final List assets = otherParts .stream() .map(semanticDataModel -> semanticDataModel.toDomain(semanticDataModel.localIdentifiers(), shortIds, owner, bpnMapping, Collections.emptyList(), @@ -155,11 +155,11 @@ private List mapToOtherPartsAsBuilt(Map shortIds, Owner o return assets; } - private List mapToOtherPartsAsPlanned(Map shortIds, Owner owner, Map bpnMapping) { + private List mapToOtherPartsAsPlanned(Map shortIds, Owner owner, Map bpnMapping) { List otherParts = semanticDataModels().stream().filter(semanticDataModel -> !isOwnPart(semanticDataModel, jobStatus)).toList(); log.info(":: mapToOtherPartsAsPlanned()"); log.info(":: otherParts: {}", otherParts); - final List assets = otherParts + final List assets = otherParts .stream() .map(semanticDataModel -> semanticDataModel.toDomainAsPlanned(shortIds, owner, bpnMapping, Collections.emptyList(), @@ -169,7 +169,7 @@ private List mapToOtherPartsAsPlanned(Map shortIds, Owner return assets; } - private List mapToOwnPartsAsPlanned(Map shortIds, Map bpnMapping) { + private List mapToOwnPartsAsPlanned(Map shortIds, Map bpnMapping) { List ownPartsAsPlanned = semanticDataModels().stream() @@ -183,7 +183,7 @@ private List mapToOwnPartsAsPlanned(Map shortIds, Map assets = ownPartsAsPlanned + final List assets = ownPartsAsPlanned .stream() .map(semanticDataModel -> semanticDataModel.toDomainAsPlanned(shortIds, Owner.OWN, bpnMapping, Collections.emptyList(), @@ -193,7 +193,7 @@ private List mapToOwnPartsAsPlanned(Map shortIds, Map mapToOwnPartsAsBuilt(Map shortIds, Map bpnMapping) { + private List mapToOwnPartsAsBuilt(Map shortIds, Map bpnMapping) { List ownParts = semanticDataModels().stream().filter(semanticDataModel -> isOwnPart(semanticDataModel, jobStatus)).toList(); log.info(":: mapToOwnPartsAsBuilt()"); log.info(":: ownParts: {}", ownParts); @@ -207,7 +207,7 @@ private List mapToOwnPartsAsBuilt(Map shortIds, Map SINGLE_LEVEL_USAGE_AS_BUILT.equals(relationship.aspectType().getAspectName())) .collect(Collectors.groupingBy(Relationship::childCatenaXId, Collectors.toList())); - final List assets = ownParts + final List assets = ownParts .stream() .map(semanticDataModel -> semanticDataModel.toDomain(semanticDataModel.localIdentifiers(), shortIds, Owner.OWN, bpnMapping, getParentParts(customerPartsMap, shortIds, semanticDataModel.catenaXId()), diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java index b1f47d8ddf..0c7487811e 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java @@ -25,7 +25,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.*; +import org.eclipse.tractusx.traceability.assets.domain.base.model.*; import org.springframework.util.StringUtils; import java.util.*; @@ -78,33 +78,33 @@ public Optional getLocalIdByInput(LocalIdKey key, List localIds .map(LocalId::value); } - public Asset toDomain(List localIds, Map shortIds, Owner owner, Map bpns, List parentRelations, List childRelations) { + public AssetBase toDomain(List localIds, Map shortIds, Owner owner, Map bpns, List parentRelations, List childRelations) { final String manufacturerName = bpns.get(manufacturerId()); final AtomicReference semanticModelId = new AtomicReference<>(); - final AtomicReference semanticDataModel = new AtomicReference<>(); + final AtomicReference semanticDataModel = new AtomicReference<>(); getLocalIdByInput(LocalIdKey.PART_INSTANCE_ID, localIds).ifPresent(s -> { semanticModelId.set(s); - semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticDataModel.SERIALPART); + semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel.SERIALPART); }); getLocalIdByInput(LocalIdKey.BATCH_ID, localIds).ifPresent(s -> { semanticModelId.set(s); - semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticDataModel.BATCH); + semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel.BATCH); }); getLocalIdByInput(LocalIdKey.JIS_NUMBER, localIds).ifPresent(s -> { semanticModelId.set(s); - semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticDataModel.JUSTINSEQUENCE); + semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel.JUSTINSEQUENCE); }); if (semanticDataModel.get() == null) { - semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticDataModel.UNKNOWN); + semanticDataModel.set(org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel.UNKNOWN); } - return Asset.builder() + return AssetBase.builder() .id(catenaXId()) .idShort(defaultValue(shortIds.get(catenaXId()))) .semanticModelId(semanticModelId.get()) @@ -123,12 +123,12 @@ public Asset toDomain(List localIds, Map shortIds, Owne .build(); } - public Asset toDomainAsPlanned(Map shortIds, Owner owner, Map bpns, List parentRelations, List childRelations) { + public AssetBase toDomainAsPlanned(Map shortIds, Owner owner, Map bpns, List parentRelations, List childRelations) { final String manufacturerName = bpns.get(manufacturerId()); final String[] manufacturerId = {"--"}; bpns.values().stream().filter(s -> s.equals(manufacturerName)).findFirst().ifPresent(s -> manufacturerId[0] = s); - return Asset.builder() + return AssetBase.builder() .id(catenaXId()) .idShort(defaultValue(shortIds.get(catenaXId()))) .semanticModel(SemanticModel.from(partTypeInformation)) @@ -141,7 +141,7 @@ public Asset toDomainAsPlanned(Map shortIds, Owner owner, Map partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertsReceiverService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertsReceiverService.java index 9f63255884..7338f6f63c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertsReceiverService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertsReceiverService.java @@ -21,7 +21,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.mapper.NotificationMapper; import org.eclipse.tractusx.traceability.common.mapper.QualityNotificationMapper; import org.eclipse.tractusx.traceability.common.model.BPN; @@ -41,7 +41,7 @@ public class AlertsReceiverService { private final AlertRepository alertRepository; private final NotificationMapper notificationMapper; - private final AssetServiceImpl assetService; + private final AssetAsBuiltServiceImpl assetService; private final QualityNotificationMapper qualityNotificationMapper; public void handleNotificationReceive(EDCNotification edcNotification) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java index 7d7933fdb4..853d9940a5 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java @@ -21,7 +21,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.qualitynotification.application.investigation.service.InvestigationService; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.model.exception.InvestigationNotFoundException; @@ -49,7 +49,7 @@ public class InvestigationServiceImpl implements InvestigationService { private final InvestigationRepository investigationsRepository; - private final AssetServiceImpl assetService; + private final AssetAsBuiltServiceImpl assetService; @Override diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationsReceiverService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationsReceiverService.java index 237a7eb1bf..f2ba59a276 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationsReceiverService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationsReceiverService.java @@ -23,7 +23,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.mapper.NotificationMapper; import org.eclipse.tractusx.traceability.common.mapper.QualityNotificationMapper; import org.eclipse.tractusx.traceability.common.model.BPN; @@ -43,7 +43,7 @@ public class InvestigationsReceiverService { private final InvestigationRepository investigationsRepository; private final NotificationMapper notificationMapper; - private final AssetServiceImpl assetService; + private final AssetAsBuiltServiceImpl assetService; private final QualityNotificationMapper qualityNotificationMapper; public void handleNotificationReceive(EDCNotification edcNotification) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index 2c7d2038ce..79c359caa3 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -25,8 +25,8 @@ import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; @@ -60,7 +60,7 @@ public class NotificationPublisherService { private final EdcNotificationService edcNotificationService; private final AssetAsBuiltRepository assetRepository; private final AssetAsPlannedRepository assetAsPlannedRepository; - private final AssetServiceImpl assetService; + private final AssetAsBuiltServiceImpl assetService; private final BpnRepository bpnRepository; private final Clock clock; @@ -78,7 +78,7 @@ public QualityNotification startInvestigation(List assetIds, String desc BPN applicationBPN = traceabilityProperties.getBpn(); QualityNotification notification = QualityNotification.startNotification(clock.instant(), applicationBPN, description); - Map> assetsByBPN = assetRepository.getAssetsById(assetIds).stream().collect(groupingBy(Asset::getManufacturerId)); + Map> assetsByBPN = assetRepository.getAssetsById(assetIds).stream().collect(groupingBy(AssetBase::getManufacturerId)); assetsByBPN .entrySet() @@ -104,7 +104,7 @@ public QualityNotification startAlert(List assetIds, String description, BPN applicationBPN = traceabilityProperties.getBpn(); QualityNotification notification = QualityNotification.startNotification(clock.instant(), applicationBPN, description); - List assets = assetRepository.getAssetsById(assetIds); + List assets = assetRepository.getAssetsById(assetIds); QualityNotificationMessage qualityNotificationMessage = createAlert(applicationBPN, description, targetDate, severity, assets, receiverBpn); notification.addNotification(qualityNotificationMessage); @@ -113,7 +113,7 @@ public QualityNotification startAlert(List assetIds, String description, return notification; } - private QualityNotificationMessage createInvestigation(BPN applicationBpn, String description, Instant targetDate, QualityNotificationSeverity severity, Map.Entry> asset) { + private QualityNotificationMessage createInvestigation(BPN applicationBpn, String description, Instant targetDate, QualityNotificationSeverity severity, Map.Entry> asset) { final String notificationId = UUID.randomUUID().toString(); final String messageId = UUID.randomUUID().toString(); return QualityNotificationMessage.builder() @@ -125,7 +125,7 @@ private QualityNotificationMessage createInvestigation(BPN applicationBpn, Strin .receiverManufacturerName(getManufacturerName(asset.getKey())) .description(description) .notificationStatus(QualityNotificationStatus.CREATED) - .affectedParts(asset.getValue().stream().map(Asset::getId).map(QualityNotificationAffectedPart::new).toList()) + .affectedParts(asset.getValue().stream().map(AssetBase::getId).map(QualityNotificationAffectedPart::new).toList()) .targetDate(targetDate) .severity(severity) .edcNotificationId(notificationId) @@ -134,7 +134,7 @@ private QualityNotificationMessage createInvestigation(BPN applicationBpn, Strin .build(); } - private QualityNotificationMessage createAlert(BPN applicationBpn, String description, Instant targetDate, QualityNotificationSeverity severity, List affectedAssets, String targetBpn) { + private QualityNotificationMessage createAlert(BPN applicationBpn, String description, Instant targetDate, QualityNotificationSeverity severity, List affectedAssets, String targetBpn) { final String notificationId = UUID.randomUUID().toString(); final String messageId = UUID.randomUUID().toString(); return QualityNotificationMessage.builder() @@ -146,7 +146,7 @@ private QualityNotificationMessage createAlert(BPN applicationBpn, String descri .receiverManufacturerName(getManufacturerName(targetBpn)) .description(description) .notificationStatus(QualityNotificationStatus.CREATED) - .affectedParts(affectedAssets.stream().map(Asset::getId).map(QualityNotificationAffectedPart::new).toList()) + .affectedParts(affectedAssets.stream().map(AssetBase::getId).map(QualityNotificationAffectedPart::new).toList()) .targetDate(targetDate) .severity(severity) .edcNotificationId(notificationId) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java index 2b05de58a0..7ca347906f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java @@ -23,7 +23,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetService; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.shelldescriptor.application.DecentralRegistryService; @@ -41,7 +42,7 @@ public class DecentralRegistryServiceImpl implements DecentralRegistryService { private final ShellDescriptorService shellDescriptorsService; - private final AssetService assetService; + private final AssetBaseService assetService; private final TraceabilityProperties traceabilityProperties; private final DecentralRegistryRepository decentralRegistryRepository; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/application/rest/response/DescriptionsResponseTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/application/rest/response/DescriptionsResponseTest.java index ed51170ec5..468655d668 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/application/rest/response/DescriptionsResponseTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/application/rest/response/DescriptionsResponseTest.java @@ -22,7 +22,7 @@ import assets.response.DescriptionsResponse; import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java similarity index 86% rename from tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetServiceImplTest.java rename to tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java index c054eebede..154afeb5fb 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetServiceImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java @@ -20,11 +20,11 @@ package org.eclipse.tractusx.traceability.assets.domain.service; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; @@ -44,10 +44,10 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -class AssetServiceImplTest { +class AssetAsBuiltServiceImplTest { @InjectMocks - private AssetServiceImpl assetService; + private AssetAsBuiltServiceImpl assetService; @Mock private IrsRepository irsRepository; @@ -65,8 +65,8 @@ void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { List parentDescriptionsList = AssetTestDataFactory.provideParentRelations(); List childDescriptionList = AssetTestDataFactory.provideChildRelations(); String globalAssetId = "123"; - List downwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(Collections.emptyList(), childDescriptionList)); - List upwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(parentDescriptionsList, Collections.emptyList())); + List downwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(Collections.emptyList(), childDescriptionList)); + List upwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(parentDescriptionsList, Collections.emptyList())); when(irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT)) .thenReturn(downwardAssets); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/jpa/PersistentAssetsAsBuiltRepositoryTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/jpa/PersistentAssetsAsBuiltRepositoryTest.java index 23ae504c15..b5f6e78d27 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/jpa/PersistentAssetsAsBuiltRepositoryTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/jpa/PersistentAssetsAsBuiltRepositoryTest.java @@ -19,9 +19,9 @@ package org.eclipse.tractusx.traceability.assets.infrastructure.repository.jpa; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.repository.AssetAsBuiltRepositoryImpl; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.repository.JpaAssetAsBuiltRepository; @@ -90,11 +90,11 @@ void testToAsset() { // when - Asset asset = AssetAsBuiltEntity.toDomain(entity); + AssetBase asset = AssetAsBuiltEntity.toDomain(entity); // then - Asset expected = createAssetTestData(); + AssetBase expected = createAssetTestData(); Assertions.assertEquals(asset.getId(), expected.getId()); Assertions.assertEquals(asset.getIdShort(), expected.getIdShort()); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/IrsServiceTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/IrsServiceTest.java index e8bcfa318a..71308bbc0f 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/IrsServiceTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/IrsServiceTest.java @@ -20,8 +20,8 @@ package org.eclipse.tractusx.traceability.assets.infrastructure.repository.rest.irs; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.IRSApiClient; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.IrsService; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.config.IrsPolicyConfig; @@ -153,7 +153,7 @@ void testFindAssets_completedJob_returnsConvertedAssets(Direction direction) { when(irsClient.getJobDetails(jobId.id())).thenReturn(jobResponse); // When - List result = irsService.findAssets("1", direction, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + List result = irsService.findAssets("1", direction, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); // Then assertThat(result).hasSize(1); @@ -189,7 +189,7 @@ void testFindAssets_uncompletedJob_returnsEmptyListOfAssets(Direction direction) when(jobResponse.isCompleted()).thenReturn(false); // When - List result = irsService.findAssets("1", direction, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + List result = irsService.findAssets("1", direction, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); // Then assertThat(result).isEqualTo(Collections.EMPTY_LIST); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/model/JobDetailResponseTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/model/JobDetailResponseTest.java index 18ea4bb46c..45ac8feeda 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/model/JobDetailResponseTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/repository/rest/irs/model/JobDetailResponseTest.java @@ -21,8 +21,8 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.JobDetailResponse; import org.junit.jupiter.api.Test; @@ -45,9 +45,9 @@ void testAssetConverterAddsParentAssets() throws IOException { InputStream file = JobDetailResponseTest.class.getResourceAsStream("/data/irs_assets_v3_singleUsageAsBuilt.json"); JobDetailResponse response = mapper.readValue(file, JobDetailResponse.class); // when - List assets = response.convertAssets(); - Asset ownAsset = assets.get(0); - Asset parentAsset = assets.get(1); + List assets = response.convertAssets(); + AssetBase ownAsset = assets.get(0); + AssetBase parentAsset = assets.get(1); // then final String ownAssetId = "urn:uuid:8f9d8c7f-6d7a-48f1-9959-9fa3a1a7a891"; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java index 021f1a8c27..5a2813cd52 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.JobDetailResponse; import java.io.IOException; @@ -34,7 +34,7 @@ public class AssetTestData { .configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, false) .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - List readAndConvertAssetsForTests() { + List readAndConvertAssetsForTests() { try { InputStream file = AssetTestData.class.getResourceAsStream("/data/irs_assets_v4.json"); JobDetailResponse response = mapper.readValue(file, JobDetailResponse.class); 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 96235cf7bf..2aed18f7a4 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 @@ -19,7 +19,7 @@ package org.eclipse.tractusx.traceability.integration.common.support; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; import org.eclipse.tractusx.traceability.qualitynotification.infrastructure.investigation.model.InvestigationEntity; import org.eclipse.tractusx.traceability.qualitynotification.infrastructure.investigation.repository.JpaInvestigationRepository; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java index 201c2b52f7..c5bf02d738 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java @@ -18,7 +18,7 @@ ********************************************************************************/ package org.eclipse.tractusx.traceability.integration.common.support; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -39,7 +39,7 @@ public class BpnSupport { String bpn = null; public void cachedBpnsForDefaultAssets() { - List assetIds = assetRepositoryProvider.assetsConverter().readAndConvertAssetsForTests().stream().map(Asset::getManufacturerId).toList(); + List assetIds = assetRepositoryProvider.assetsConverter().readAndConvertAssetsForTests().stream().map(AssetBase::getManufacturerId).toList(); Map bpnMappings = new HashMap<>(); for (String assetId : assetIds) { diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/InvestigationsReceiverServiceTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/InvestigationsReceiverServiceTest.java index d64d94eda8..d8cf374e75 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/InvestigationsReceiverServiceTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/InvestigationsReceiverServiceTest.java @@ -19,7 +19,7 @@ package org.eclipse.tractusx.traceability.qualitynotification.domain.service; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.mapper.NotificationMapper; import org.eclipse.tractusx.traceability.common.mapper.QualityNotificationMapper; import org.eclipse.tractusx.traceability.common.model.BPN; @@ -65,7 +65,7 @@ class InvestigationsReceiverServiceTest { private QualityNotificationMapper mockQualityNotificationMapper; @Mock - private AssetServiceImpl assetService; + private AssetAsBuiltServiceImpl assetService; @InjectMocks private InvestigationsReceiverService service; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java index bd542fb353..f177b341ef 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java @@ -21,7 +21,7 @@ import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.repository.InvestigationRepository; @@ -69,7 +69,7 @@ class NotificationPublisherServiceTest { @Mock private AssetAsBuiltRepository assetRepository; @Mock - private AssetServiceImpl assetsService; + private AssetAsBuiltServiceImpl assetsService; @Mock private Clock clock; @Mock diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java index 63b60af044..562756cc94 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java @@ -19,7 +19,8 @@ package org.eclipse.tractusx.traceability.shelldescriptor.domain; import org.eclipse.tractusx.irs.registryclient.exceptions.RegistryServiceException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.shelldescriptor.domain.model.ShellDescriptor; @@ -51,7 +52,7 @@ class DecentralDecentralRegistryServiceImplTest { @Mock private TraceabilityProperties traceabilityProperties; @Mock - private AssetServiceImpl assetService; + private AssetBaseService assetService; @InjectMocks private DecentralRegistryServiceImpl registryFacade; @@ -67,6 +68,7 @@ void testUpdateShellDescriptorAndSynchronizeAssets() throws RegistryServiceExcep shellDescriptors.add(shellDescritor2); when(traceabilityProperties.getBpn()).thenReturn(BPN.of("test")); when(decentralRegistryRepository.retrieveShellDescriptorsByBpn(BPN.of("test").toString())).thenReturn(shellDescriptors); + when(shellDescriptorsService.determineExistingShellDescriptorsAndUpdate(shellDescriptors)).thenReturn(shellDescriptors); // When registryFacade.updateShellDescriptorAndSynchronizeAssets(); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/AssetTestDataFactory.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/AssetTestDataFactory.java index 42da07f11e..b3e02722a4 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/AssetTestDataFactory.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/AssetTestDataFactory.java @@ -19,12 +19,12 @@ package org.eclipse.tractusx.traceability.testdata; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Descriptions; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.QualityType; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticDataModel; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.SemanticModel; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel; +import org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticModel; import java.time.Instant; import java.util.ArrayList; @@ -33,14 +33,14 @@ public class AssetTestDataFactory { - public static Asset createAssetTestDataWithRelations(List parents, List childs) { - Asset assetTestData = createAssetTestData(); + public static AssetBase createAssetTestDataWithRelations(List parents, List childs) { + AssetBase assetTestData = createAssetTestData(); assetTestData.setParentRelations(parents); assetTestData.setChildRelations(childs); return assetTestData; } - public static Asset createAssetTestData() { + public static AssetBase createAssetTestData() { Instant manufacturingDate = Instant.now(); SemanticModel semanticModel = SemanticModel.builder() @@ -52,7 +52,7 @@ public static Asset createAssetTestData() { .nameAtCustomer("Customer Name") .build(); - return Asset.builder() + return AssetBase.builder() .id("1") .idShort("1234") .semanticModelId("456") @@ -70,7 +70,7 @@ public static Asset createAssetTestData() { .build(); } - public static Asset createAssetParentTestData() { + public static AssetBase createAssetParentTestData() { Instant manufacturingDate = Instant.now(); SemanticModel semanticModel = SemanticModel.builder() @@ -82,7 +82,7 @@ public static Asset createAssetParentTestData() { .nameAtCustomer("Customer Name") .build(); - return Asset.builder() + return AssetBase.builder() .id("2") .idShort("23456") .semanticModelId("456") From 9a7186fe73ffaef801cd14b419700410f8a88eb8 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 11:50:16 +0200 Subject: [PATCH 05/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../asbuilt/service/AssetAsBuiltService.java | 8 + .../service/AssetAsPlannedService.java | 15 ++ .../base/service/AssetBaseService.java | 14 -- .../service/AssetAsBuiltServiceImpl.java | 2 +- .../service/AssetAsPlannedServiceImpl.java | 205 ++++++++++++++++++ .../base/service/AssetBaseServiceImpl.java | 204 +++++++++++++++++ 6 files changed, 433 insertions(+), 15 deletions(-) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java index 9800d217a1..fc79cecf61 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java @@ -30,5 +30,13 @@ import java.util.Map; public interface AssetAsBuiltService extends AssetBaseService { + AssetBase getAssetById(String assetId); + List getAssetsById(List assetIds); + + AssetBase getAssetByChildId(String assetId, String childId); + + PageResult getAssets(Pageable pageable, Owner owner); + + AssetBase updateQualityType(String assetId, QualityType qualityType); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java index c474e6cf0b..7d477415ce 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java @@ -19,7 +19,22 @@ package org.eclipse.tractusx.traceability.assets.application.asplanned.service; import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.springframework.data.domain.Pageable; + +import java.util.List; public interface AssetAsPlannedService extends AssetBaseService { + AssetBase getAssetById(String assetId); + + List getAssetsById(List assetIds); + + AssetBase getAssetByChildId(String assetId, String childId); + + PageResult getAssets(Pageable pageable, Owner owner); + AssetBase updateQualityType(String assetId, QualityType qualityType); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java index 14b1e921a0..7c07f8db69 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java @@ -1,11 +1,6 @@ package org.eclipse.tractusx.traceability.assets.application.base.service; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; -import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.springframework.data.domain.Pageable; import java.util.List; import java.util.Map; @@ -19,15 +14,6 @@ public interface AssetBaseService { void setAssetsAlertStatus(QualityNotification alert); - AssetBase updateQualityType(String assetId, QualityType qualityType); - Map getAssetsCountryMap(); - PageResult getAssets(Pageable pageable, Owner owner); - - AssetBase getAssetById(String assetId); - - List getAssetsById(List assetIds); - - AssetBase getAssetByChildId(String assetId, String childId); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java index 3f154c05a2..c4bca4a963 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java @@ -51,7 +51,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class AssetAsBuiltServiceImpl implements AssetBaseService { +public class AssetAsBuiltServiceImpl implements AssetAsBuiltService { private final AssetAsBuiltRepository assetAsBuiltRepository; private final AssetAsPlannedRepository assetAsPlannedRepository; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java new file mode 100644 index 0000000000..743f17dfd8 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java @@ -0,0 +1,205 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.domain.asplanned.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.application.asplanned.service.AssetAsPlannedService; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; +import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AssetAsPlannedServiceImpl implements AssetAsPlannedService { + + private final AssetAsBuiltRepository assetAsBuiltRepository; + private final AssetAsPlannedRepository assetAsPlannedRepository; + private final IrsRepository irsRepository; + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(List globalAssetIds) { + for (String globalAssetId : globalAssetIds) { + try { + synchronizeAssetsAsync(globalAssetId); + } catch (Exception e) { + log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); + } + } + } + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(String globalAssetId) { + log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); + try { + syncAssetsAsBuilt(globalAssetId); + syncAssetsAsPlanned(globalAssetId); + + } catch (Exception e) { + log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); + } + } + + private void syncAssetsAsPlanned(String globalAssetId) { + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); + assetAsPlannedRepository.saveAll(downwardAssets); + } + + private void syncAssetsAsBuilt(String globalAssetId) { + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + assetAsBuiltRepository.saveAll(downwardAssets); + + List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + + upwardAssets.forEach(asset -> { + if (assetAsBuiltRepository.existsById(asset.getId())) { + log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); + assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); + } else { + log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); + assetAsBuiltRepository.save(asset); + } + }); + } + + public void setAssetsInvestigationStatus(QualityNotification investigation) { + assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + } + + public void setAssetsAlertStatus(QualityNotification alert) { + assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + } + + public AssetBase updateQualityType(String assetId, QualityType qualityType) { + AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); + if (foundAsset == null) { + AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); + foundAssetAsPlanned.setQualityType(qualityType); + return assetAsPlannedRepository.save(foundAssetAsPlanned); + } else { + foundAsset.setQualityType(qualityType); + return assetAsBuiltRepository.save(foundAsset); + } + + + } + + public Map getAssetsCountryMap() { + Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + + Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + + Map mergedMap = new HashMap<>(assetsCountryMap); + assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); + + return mergedMap; + } + + public PageResult getAssets(Pageable pageable, Owner owner) { + Pageable halfPage = halfPageable(pageable); + PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); + PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); + + List mergedContent = new ArrayList<>(assetsAsPlanned.content()); + mergedContent.addAll(assetsAsBuilt.content()); + return new PageResult<>(mergedContent, + assetsAsBuilt.page(), + assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), + assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), + (long) mergedContent.size()); + } + // TODO once asPlanned has own domain object this special pageable logic should be removed + private Pageable halfPageable(Pageable pageable) { + if (pageable != null) { + int pageSize = pageable.getPageSize(); + int pageNumber = pageable.getPageNumber(); + return PageRequest.of(pageNumber / 2, pageSize / 2); + } + return Pageable.unpaged(); + } + + public AssetBase getAssetById(String assetId) { + try { + return assetAsBuiltRepository.getAssetById(assetId); + } catch (AssetNotFoundException assetNotFoundException) { + return assetAsPlannedRepository.getAssetById(assetId); + } + } + + public List getAssetsById(List assetIds) { + List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); + List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); + List mergedList = new ArrayList<>(assetAsBuiltIds); + mergedList.addAll(assetAsPlannedIds); + return mergedList; + } + + public AssetBase getAssetByChildId(String assetId, String childId) { + try { + return assetAsBuiltRepository.getAssetByChildId(assetId, childId); + } catch (AssetNotFoundException assetNotFoundException) { + return assetAsPlannedRepository.getAssetByChildId(assetId, childId); + } + + } +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java new file mode 100644 index 0000000000..ba70d87c4f --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java @@ -0,0 +1,204 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.domain.base.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; +import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AssetBaseServiceImpl implements AssetBaseService { + + private final AssetAsBuiltRepository assetAsBuiltRepository; + private final AssetAsPlannedRepository assetAsPlannedRepository; + private final IrsRepository irsRepository; + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(List globalAssetIds) { + for (String globalAssetId : globalAssetIds) { + try { + synchronizeAssetsAsync(globalAssetId); + } catch (Exception e) { + log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); + } + } + } + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(String globalAssetId) { + log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); + try { + syncAssetsAsBuilt(globalAssetId); + syncAssetsAsPlanned(globalAssetId); + + } catch (Exception e) { + log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); + } + } + + private void syncAssetsAsPlanned(String globalAssetId) { + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); + assetAsPlannedRepository.saveAll(downwardAssets); + } + + private void syncAssetsAsBuilt(String globalAssetId) { + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + assetAsBuiltRepository.saveAll(downwardAssets); + + List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + + upwardAssets.forEach(asset -> { + if (assetAsBuiltRepository.existsById(asset.getId())) { + log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); + assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); + } else { + log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); + assetAsBuiltRepository.save(asset); + } + }); + } + + public void setAssetsInvestigationStatus(QualityNotification investigation) { + assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + } + + public void setAssetsAlertStatus(QualityNotification alert) { + assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + } + + public AssetBase updateQualityType(String assetId, QualityType qualityType) { + AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); + if (foundAsset == null) { + AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); + foundAssetAsPlanned.setQualityType(qualityType); + return assetAsPlannedRepository.save(foundAssetAsPlanned); + } else { + foundAsset.setQualityType(qualityType); + return assetAsBuiltRepository.save(foundAsset); + } + + + } + + public Map getAssetsCountryMap() { + Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + + Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + + Map mergedMap = new HashMap<>(assetsCountryMap); + assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); + + return mergedMap; + } + + public PageResult getAssets(Pageable pageable, Owner owner) { + Pageable halfPage = halfPageable(pageable); + PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); + PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); + + List mergedContent = new ArrayList<>(assetsAsPlanned.content()); + mergedContent.addAll(assetsAsBuilt.content()); + return new PageResult<>(mergedContent, + assetsAsBuilt.page(), + assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), + assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), + (long) mergedContent.size()); + } + // TODO once asPlanned has own domain object this special pageable logic should be removed + private Pageable halfPageable(Pageable pageable) { + if (pageable != null) { + int pageSize = pageable.getPageSize(); + int pageNumber = pageable.getPageNumber(); + return PageRequest.of(pageNumber / 2, pageSize / 2); + } + return Pageable.unpaged(); + } + + public AssetBase getAssetById(String assetId) { + try { + return assetAsBuiltRepository.getAssetById(assetId); + } catch (AssetNotFoundException assetNotFoundException) { + return assetAsPlannedRepository.getAssetById(assetId); + } + } + + public List getAssetsById(List assetIds) { + List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); + List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); + List mergedList = new ArrayList<>(assetAsBuiltIds); + mergedList.addAll(assetAsPlannedIds); + return mergedList; + } + + public AssetBase getAssetByChildId(String assetId, String childId) { + try { + return assetAsBuiltRepository.getAssetByChildId(assetId, childId); + } catch (AssetNotFoundException assetNotFoundException) { + return assetAsPlannedRepository.getAssetByChildId(assetId, childId); + } + + } +} From 3d785f8dcbc6b1c8516144c8e518436ef4af9a57 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 12:14:34 +0200 Subject: [PATCH 06/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../assets/application/base/rest/AssetBaseController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java index 7754d6d488..9d60717849 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java @@ -43,6 +43,7 @@ import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -56,6 +57,7 @@ @RequiredArgsConstructor public class AssetBaseController { + @Qualifier("assetBaseServiceImpl") private final AssetBaseService assetBaseService; @Operation(operationId = "sync", From 549754badf39dcfbc2330c0f51b731019e4a8086 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 12:18:17 +0200 Subject: [PATCH 07/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../base/rest/AssetBaseController.java | 112 ---------- .../base/service/AssetBaseServiceImpl.java | 204 ------------------ 2 files changed, 316 deletions(-) delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java deleted file mode 100644 index 9d60717849..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2022, 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * Copyright (c) 2022, 2023 ZF Friedrichshafen AG - * Copyright (c) 2022, 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -package org.eclipse.tractusx.traceability.assets.application.base.rest; - -import assets.response.AssetAsBuiltResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import jakarta.ws.rs.QueryParam; -import lombok.RequiredArgsConstructor; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; -import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; -import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; -import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.common.request.OwnPageable; -import org.eclipse.tractusx.traceability.common.response.ErrorResponse; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -@RestController -@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") -@Tag(name = "Assets") -@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") -@RequiredArgsConstructor -public class AssetBaseController { - - @Qualifier("assetBaseServiceImpl") - private final AssetBaseService assetBaseService; - - @Operation(operationId = "sync", - summary = "Synchronizes assets from IRS", - tags = {"Assets"}, - description = "The endpoint synchronizes the assets from irs.", - security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) - @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), - @ApiResponse( - responseCode = "400", - description = "Bad request.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "401", - description = "Authorization failed.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - - @ApiResponse( - responseCode = "403", - description = "Forbidden.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "415", - description = "Unsupported media type", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "429", - description = "Too many requests.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "500", - description = "Internal server error.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class)))}) - @PostMapping("/sync") - public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { - assetBaseService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); - } - - -} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java deleted file mode 100644 index ba70d87c4f..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java +++ /dev/null @@ -1,204 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -package org.eclipse.tractusx.traceability.assets.domain.base.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; -import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; -import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@Component -@RequiredArgsConstructor -public class AssetBaseServiceImpl implements AssetBaseService { - - private final AssetAsBuiltRepository assetAsBuiltRepository; - private final AssetAsPlannedRepository assetAsPlannedRepository; - private final IrsRepository irsRepository; - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(List globalAssetIds) { - for (String globalAssetId : globalAssetIds) { - try { - synchronizeAssetsAsync(globalAssetId); - } catch (Exception e) { - log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); - } - } - } - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(String globalAssetId) { - log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); - try { - syncAssetsAsBuilt(globalAssetId); - syncAssetsAsPlanned(globalAssetId); - - } catch (Exception e) { - log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); - } - } - - private void syncAssetsAsPlanned(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); - assetAsPlannedRepository.saveAll(downwardAssets); - } - - private void syncAssetsAsBuilt(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - assetAsBuiltRepository.saveAll(downwardAssets); - - List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - - upwardAssets.forEach(asset -> { - if (assetAsBuiltRepository.existsById(asset.getId())) { - log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); - assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); - } else { - log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); - assetAsBuiltRepository.save(asset); - } - }); - } - - public void setAssetsInvestigationStatus(QualityNotification investigation) { - assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } - - public void setAssetsAlertStatus(QualityNotification alert) { - assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } - - public AssetBase updateQualityType(String assetId, QualityType qualityType) { - AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); - if (foundAsset == null) { - AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); - foundAssetAsPlanned.setQualityType(qualityType); - return assetAsPlannedRepository.save(foundAssetAsPlanned); - } else { - foundAsset.setQualityType(qualityType); - return assetAsBuiltRepository.save(foundAsset); - } - - - } - - public Map getAssetsCountryMap() { - Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map mergedMap = new HashMap<>(assetsCountryMap); - assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); - - return mergedMap; - } - - public PageResult getAssets(Pageable pageable, Owner owner) { - Pageable halfPage = halfPageable(pageable); - PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); - PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); - - List mergedContent = new ArrayList<>(assetsAsPlanned.content()); - mergedContent.addAll(assetsAsBuilt.content()); - return new PageResult<>(mergedContent, - assetsAsBuilt.page(), - assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), - assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), - (long) mergedContent.size()); - } - // TODO once asPlanned has own domain object this special pageable logic should be removed - private Pageable halfPageable(Pageable pageable) { - if (pageable != null) { - int pageSize = pageable.getPageSize(); - int pageNumber = pageable.getPageNumber(); - return PageRequest.of(pageNumber / 2, pageSize / 2); - } - return Pageable.unpaged(); - } - - public AssetBase getAssetById(String assetId) { - try { - return assetAsBuiltRepository.getAssetById(assetId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetById(assetId); - } - } - - public List getAssetsById(List assetIds) { - List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); - List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); - List mergedList = new ArrayList<>(assetAsBuiltIds); - mergedList.addAll(assetAsPlannedIds); - return mergedList; - } - - public AssetBase getAssetByChildId(String assetId, String childId) { - try { - return assetAsBuiltRepository.getAssetByChildId(assetId, childId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetByChildId(assetId, childId); - } - - } -} From b5d0e95a2fa77d9b6a48d7fcc50cb45033825fd1 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 12:20:28 +0200 Subject: [PATCH 08/46] Revert "feature: TRACEFOSS-1730 preperation for new api assetAsPlanned" This reverts commit 549754badf39dcfbc2330c0f51b731019e4a8086. --- .../base/rest/AssetBaseController.java | 112 ++++++++++ .../base/service/AssetBaseServiceImpl.java | 204 ++++++++++++++++++ 2 files changed, 316 insertions(+) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java new file mode 100644 index 0000000000..9d60717849 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java @@ -0,0 +1,112 @@ +/******************************************************************************** + * Copyright (c) 2022, 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022, 2023 ZF Friedrichshafen AG + * Copyright (c) 2022, 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.application.base.rest; + +import assets.response.AssetAsBuiltResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.ws.rs.QueryParam; +import lombok.RequiredArgsConstructor; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; +import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; +import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.common.request.OwnPageable; +import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") +@Tag(name = "Assets") +@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") +@RequiredArgsConstructor +public class AssetBaseController { + + @Qualifier("assetBaseServiceImpl") + private final AssetBaseService assetBaseService; + + @Operation(operationId = "sync", + summary = "Synchronizes assets from IRS", + tags = {"Assets"}, + description = "The endpoint synchronizes the assets from irs.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "415", + description = "Unsupported media type", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @PostMapping("/sync") + public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { + assetBaseService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); + } + + +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java new file mode 100644 index 0000000000..ba70d87c4f --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java @@ -0,0 +1,204 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.domain.base.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; +import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AssetBaseServiceImpl implements AssetBaseService { + + private final AssetAsBuiltRepository assetAsBuiltRepository; + private final AssetAsPlannedRepository assetAsPlannedRepository; + private final IrsRepository irsRepository; + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(List globalAssetIds) { + for (String globalAssetId : globalAssetIds) { + try { + synchronizeAssetsAsync(globalAssetId); + } catch (Exception e) { + log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); + } + } + } + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(String globalAssetId) { + log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); + try { + syncAssetsAsBuilt(globalAssetId); + syncAssetsAsPlanned(globalAssetId); + + } catch (Exception e) { + log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); + } + } + + private void syncAssetsAsPlanned(String globalAssetId) { + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); + assetAsPlannedRepository.saveAll(downwardAssets); + } + + private void syncAssetsAsBuilt(String globalAssetId) { + List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + assetAsBuiltRepository.saveAll(downwardAssets); + + List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + + upwardAssets.forEach(asset -> { + if (assetAsBuiltRepository.existsById(asset.getId())) { + log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); + assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); + } else { + log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); + assetAsBuiltRepository.save(asset); + } + }); + } + + public void setAssetsInvestigationStatus(QualityNotification investigation) { + assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + } + + public void setAssetsAlertStatus(QualityNotification alert) { + assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + assetAsBuiltRepository.save(asset); + }); + } + + public AssetBase updateQualityType(String assetId, QualityType qualityType) { + AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); + if (foundAsset == null) { + AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); + foundAssetAsPlanned.setQualityType(qualityType); + return assetAsPlannedRepository.save(foundAssetAsPlanned); + } else { + foundAsset.setQualityType(qualityType); + return assetAsBuiltRepository.save(foundAsset); + } + + + } + + public Map getAssetsCountryMap() { + Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + + Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + + Map mergedMap = new HashMap<>(assetsCountryMap); + assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); + + return mergedMap; + } + + public PageResult getAssets(Pageable pageable, Owner owner) { + Pageable halfPage = halfPageable(pageable); + PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); + PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); + + List mergedContent = new ArrayList<>(assetsAsPlanned.content()); + mergedContent.addAll(assetsAsBuilt.content()); + return new PageResult<>(mergedContent, + assetsAsBuilt.page(), + assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), + assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), + (long) mergedContent.size()); + } + // TODO once asPlanned has own domain object this special pageable logic should be removed + private Pageable halfPageable(Pageable pageable) { + if (pageable != null) { + int pageSize = pageable.getPageSize(); + int pageNumber = pageable.getPageNumber(); + return PageRequest.of(pageNumber / 2, pageSize / 2); + } + return Pageable.unpaged(); + } + + public AssetBase getAssetById(String assetId) { + try { + return assetAsBuiltRepository.getAssetById(assetId); + } catch (AssetNotFoundException assetNotFoundException) { + return assetAsPlannedRepository.getAssetById(assetId); + } + } + + public List getAssetsById(List assetIds) { + List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); + List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); + List mergedList = new ArrayList<>(assetAsBuiltIds); + mergedList.addAll(assetAsPlannedIds); + return mergedList; + } + + public AssetBase getAssetByChildId(String assetId, String childId) { + try { + return assetAsBuiltRepository.getAssetByChildId(assetId, childId); + } catch (AssetNotFoundException assetNotFoundException) { + return assetAsPlannedRepository.getAssetByChildId(assetId, childId); + } + + } +} From 0005c5b4886490b7007c72a45a5446bf636f94ad Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 12:23:34 +0200 Subject: [PATCH 09/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../assets/application/base/rest/AssetBaseController.java | 2 +- .../domain/asbuilt/service/AssetAsBuiltServiceImpl.java | 4 ++-- .../domain/asplanned/service/AssetAsPlannedServiceImpl.java | 2 +- .../domain/service/DecentralRegistryServiceImpl.java | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java index 9d60717849..2ae8aa7f4b 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java @@ -53,7 +53,7 @@ @RestController @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Assets") -@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") +@RequestMapping(path = "/assets/base", produces = "application/json", consumes = "application/json") @RequiredArgsConstructor public class AssetBaseController { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java index c4bca4a963..5d615c0107 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java @@ -22,11 +22,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; @@ -168,6 +167,7 @@ public PageResult getAssets(Pageable pageable, Owner owner) { assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), (long) mergedContent.size()); } + // TODO once asPlanned has own domain object this special pageable logic should be removed private Pageable halfPageable(Pageable pageable) { if (pageable != null) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java index 743f17dfd8..4bbc7c513e 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java @@ -22,7 +22,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.application.asplanned.service.AssetAsPlannedService; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; @@ -168,6 +167,7 @@ public PageResult getAssets(Pageable pageable, Owner owner) { assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), (long) mergedContent.size()); } + // TODO once asPlanned has own domain object this special pageable logic should be removed private Pageable halfPageable(Pageable pageable) { if (pageable != null) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java index 7ca347906f..f9dac69a44 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java @@ -23,7 +23,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; @@ -31,6 +30,7 @@ import org.eclipse.tractusx.traceability.shelldescriptor.application.ShellDescriptorService; import org.eclipse.tractusx.traceability.shelldescriptor.domain.model.ShellDescriptor; import org.eclipse.tractusx.traceability.shelldescriptor.domain.repository.DecentralRegistryRepository; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -42,6 +42,7 @@ public class DecentralRegistryServiceImpl implements DecentralRegistryService { private final ShellDescriptorService shellDescriptorsService; + @Qualifier("assetBaseServiceImpl") private final AssetBaseService assetService; private final TraceabilityProperties traceabilityProperties; private final DecentralRegistryRepository decentralRegistryRepository; From 2a4f24249ff403121e7ea0695a34fd8efe3dec0e Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 13:28:30 +0200 Subject: [PATCH 10/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../common/support/EdcSupport.groovy | 2 +- .../asbuilt/rest/AssetAsBuiltController.java | 2 +- .../asbuilt/service/AssetAsBuiltService.java | 17 --- .../mapper/AssetAsPlannedResponseMapper.java | 75 ++++++++++++ .../rest/AssetAsPlannedController.java | 22 ++-- .../service/AssetAsPlannedService.java | 16 --- .../base/rest/AssetBaseController.java | 112 ------------------ .../base/service/AssetBaseService.java | 15 +++ .../assets/AssetAsBuiltControllerAllIT.java | 12 +- .../assets/AssetAsBuiltControllerByIdIT.java | 22 ++-- .../AssetAsBuiltControllerCountriesIT.java | 4 +- ...tAsBuiltControllerDetailInformationIT.java | 4 +- .../assets/AssetAsBuiltControllerSyncIT.java | 8 +- 13 files changed, 129 insertions(+), 182 deletions(-) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/mapper/AssetAsPlannedResponseMapper.java delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java diff --git a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy index 4f9c79d2e4..1d4e7d8bc0 100644 --- a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy +++ b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy @@ -36,7 +36,7 @@ trait EdcSupport implements RestitoProvider { void edcWillCreateNotificationAsset() { whenHttp(stubServer()).match( - post("/management/v2/assets"), + post("/management/v2/assets/"), EDC_API_KEY_HEADER ).then( status(HttpStatus.OK_200) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java index 42c3c15477..d8abe1dc36 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java @@ -57,7 +57,7 @@ @RestController @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Assets") -@RequestMapping(path = "/assets", produces = "application/json", consumes = "application/json") +@RequestMapping(path = "/assets/as-built", produces = "application/json", consumes = "application/json") @RequiredArgsConstructor public class AssetAsBuiltController { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java index fc79cecf61..af41bb6bb6 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java @@ -19,24 +19,7 @@ package org.eclipse.tractusx.traceability.assets.application.asbuilt.service; import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; public interface AssetAsBuiltService extends AssetBaseService { - AssetBase getAssetById(String assetId); - - List getAssetsById(List assetIds); - - AssetBase getAssetByChildId(String assetId, String childId); - - PageResult getAssets(Pageable pageable, Owner owner); - AssetBase updateQualityType(String assetId, QualityType qualityType); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/mapper/AssetAsPlannedResponseMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/mapper/AssetAsPlannedResponseMapper.java new file mode 100644 index 0000000000..033554e34d --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/mapper/AssetAsPlannedResponseMapper.java @@ -0,0 +1,75 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.application.asplanned.mapper; + +import assets.response.AssetAsBuiltResponse; +import assets.response.AssetAsPlannedResponse; +import org.eclipse.tractusx.traceability.assets.application.base.mapper.AssetBaseResponseMapper; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.common.model.PageResult; + +import java.util.List; + +public class AssetAsPlannedResponseMapper extends AssetBaseResponseMapper { + + public static AssetAsPlannedResponse from(final AssetBase asset) { + return AssetAsPlannedResponse.builder() + .id(asset.getId()) + .idShort(asset.getIdShort()) + .classification(asset.getClassification()) + .semanticModelId(asset.getSemanticModelId()) + .manufacturerId(asset.getManufacturerId()) + .manufacturerName(asset.getManufacturerName()) + .semanticModel(from(asset.getSemanticModel())) + .owner(from(asset.getOwner())) + .childRelations( + asset.getChildRelations().stream() + .map(AssetAsPlannedResponseMapper::from) + .toList()) + .parentRelations( + asset.getParentRelations().stream() + .map(AssetAsPlannedResponseMapper::from) + .toList()) + .underInvestigation(asset.isUnderInvestigation()) + .activeAlert(asset.isActiveAlert()) + .qualityType( + from(asset.getQualityType()) + ) + .van(asset.getVan()) + .semanticDataModel(from(asset.getSemanticDataModel())) + .build(); + } + + public static PageResult from(final PageResult assetPageResult) { + return new PageResult<>( + assetPageResult.content().stream() + .map(AssetAsPlannedResponseMapper::from).toList(), + assetPageResult.page(), + assetPageResult.pageCount(), + assetPageResult.pageSize(), + assetPageResult.totalItems() + ); + } + + public static List from(final List assets) { + return assets.stream() + .map(AssetAsPlannedResponseMapper::from) + .toList(); + } +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java index 9f8bfee35d..8fabc01a3c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -20,6 +20,7 @@ package org.eclipse.tractusx.traceability.assets.application.asplanned.rest; import assets.response.AssetAsBuiltResponse; +import assets.response.AssetAsPlannedResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; @@ -32,6 +33,7 @@ import jakarta.ws.rs.QueryParam; import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; +import org.eclipse.tractusx.traceability.assets.application.asplanned.mapper.AssetAsPlannedResponseMapper; import org.eclipse.tractusx.traceability.assets.application.asplanned.service.AssetAsPlannedService; import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; @@ -152,8 +154,8 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("") - public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { - return AssetAsBuiltResponseMapper.from(assetService.getAssets(OwnPageable.toPageable(pageable), owner)); + public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { + return AssetAsPlannedResponseMapper.from(assetService.getAssets(OwnPageable.toPageable(pageable), owner)); } @Operation(operationId = "assetsCountryMap", @@ -238,8 +240,8 @@ public Map assetsCountryMap() { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}") - public AssetAsBuiltResponse asset(@PathVariable String assetId) { - return AssetAsBuiltResponseMapper.from(assetService.getAssetById(assetId)); + public AssetAsPlannedResponse asset(@PathVariable String assetId) { + return AssetAsPlannedResponseMapper.from(assetService.getAssetById(assetId)); } @@ -282,8 +284,8 @@ public AssetAsBuiltResponse asset(@PathVariable String assetId) { mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}/children/{childId}") - public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable String childId) { - return AssetAsBuiltResponseMapper.from(assetService.getAssetByChildId(assetId, childId)); + public AssetAsPlannedResponse asset(@PathVariable String assetId, @PathVariable String childId) { + return AssetAsPlannedResponseMapper.from(assetService.getAssetByChildId(assetId, childId)); } @Operation(operationId = "updateAsset", @@ -331,8 +333,8 @@ public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable St mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @PatchMapping("/{assetId}") - public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { - return AssetAsBuiltResponseMapper.from( + public AssetAsPlannedResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { + return AssetAsPlannedResponseMapper.from( assetService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) ); } @@ -391,8 +393,8 @@ public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @Re mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))}) @PostMapping("/detail-information") - public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { - return AssetAsBuiltResponseMapper.from( + public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { + return AssetAsPlannedResponseMapper.from( assetService.getAssetsById(getDetailInformationRequest.assetIds()) ); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java index 7d477415ce..3e0d3be104 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java @@ -19,22 +19,6 @@ package org.eclipse.tractusx.traceability.assets.application.asplanned.service; import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.springframework.data.domain.Pageable; - -import java.util.List; public interface AssetAsPlannedService extends AssetBaseService { - AssetBase getAssetById(String assetId); - - List getAssetsById(List assetIds); - - AssetBase getAssetByChildId(String assetId, String childId); - - PageResult getAssets(Pageable pageable, Owner owner); - - AssetBase updateQualityType(String assetId, QualityType qualityType); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java deleted file mode 100644 index 2ae8aa7f4b..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/rest/AssetBaseController.java +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2022, 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * Copyright (c) 2022, 2023 ZF Friedrichshafen AG - * Copyright (c) 2022, 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -package org.eclipse.tractusx.traceability.assets.application.base.rest; - -import assets.response.AssetAsBuiltResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import jakarta.ws.rs.QueryParam; -import lombok.RequiredArgsConstructor; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; -import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; -import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; -import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.common.request.OwnPageable; -import org.eclipse.tractusx.traceability.common.response.ErrorResponse; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -@RestController -@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") -@Tag(name = "Assets") -@RequestMapping(path = "/assets/base", produces = "application/json", consumes = "application/json") -@RequiredArgsConstructor -public class AssetBaseController { - - @Qualifier("assetBaseServiceImpl") - private final AssetBaseService assetBaseService; - - @Operation(operationId = "sync", - summary = "Synchronizes assets from IRS", - tags = {"Assets"}, - description = "The endpoint synchronizes the assets from irs.", - security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) - @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Created."), - @ApiResponse( - responseCode = "400", - description = "Bad request.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "401", - description = "Authorization failed.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - - @ApiResponse( - responseCode = "403", - description = "Forbidden.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "415", - description = "Unsupported media type", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "429", - description = "Too many requests.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "500", - description = "Internal server error.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class)))}) - @PostMapping("/sync") - public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { - assetBaseService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); - } - - -} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java index 7c07f8db69..12ce7924bd 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java @@ -1,6 +1,11 @@ package org.eclipse.tractusx.traceability.assets.application.base.service; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.springframework.data.domain.Pageable; import java.util.List; import java.util.Map; @@ -16,4 +21,14 @@ public interface AssetBaseService { Map getAssetsCountryMap(); + AssetBase getAssetById(String assetId); + + List getAssetsById(List assetIds); + + AssetBase getAssetByChildId(String assetId, String childId); + + PageResult getAssets(Pageable pageable, Owner owner); + + AssetBase updateQualityType(String assetId, QualityType qualityType); + } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java index d159e30412..4da3cd8edb 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java @@ -66,7 +66,7 @@ void shouldReturnAssetsWithManufacturerName() throws JoseException { .contentType(ContentType.JSON) .log().all() .when() - .get("/api/assets") + .get("/api/assets/as-built") .then() .log().all() .statusCode(200) @@ -85,7 +85,7 @@ void shoulReturnSupplierAssets() throws JoseException { .contentType(ContentType.JSON) .queryParam("owner", "SUPPLIER") .when() - .get("/api/assets") + .get("/api/assets/as-built") .then() .statusCode(200) .body("totalItems", equalTo(12)); @@ -103,7 +103,7 @@ void shouldReturnOwnAssets() throws JoseException { .contentType(ContentType.JSON) .queryParam("owner", "OWN") .when() - .get("/api/assets") + .get("/api/assets/as-built") .then() .statusCode(200) .body("totalItems", equalTo(1)); @@ -119,7 +119,7 @@ void shouldReturnAllAssets() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets") + .get("/api/assets/as-built") .then() .statusCode(200) .body("totalItems", equalTo(13)) @@ -152,7 +152,7 @@ void shouldReturnAssetsByOwnerFiltering(String ownerValue, int totalItemsValue) .contentType(ContentType.JSON) .queryParam("owner", ownerValue) .when() - .get("/api/assets") + .get("/api/assets/as-built") .then() .statusCode(200) .body("totalItems", equalTo(totalItemsValue)); @@ -170,7 +170,7 @@ void shouldGetPageOfAssets() throws JoseException { .param("page", "2") .param("size", "2") .when() - .get("/api/assets") + .get("/api/assets/as-built") .then() .statusCode(200) .body("page", Matchers.is(1)) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerByIdIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerByIdIT.java index b1a215f2d8..ed9eaafb80 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerByIdIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerByIdIT.java @@ -62,7 +62,7 @@ void shouldReturnAssetsForAuthenticatedUserWithRole() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb") + .get("/api/assets/as-built/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb") .then() .statusCode(200); } @@ -77,7 +77,7 @@ void shouldReturnAssetWithoutUnderInvestigationMark() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb") + .get("/api/assets/as-built/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb") .then() .statusCode(200) .body("underInvestigation", equalTo(false)); @@ -93,7 +93,7 @@ void shouldReturnAssetWithUnderInvestigationMark() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb") + .get("/api/assets/as-built/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb") .then() .statusCode(200) .body("underInvestigation", equalTo(true)); @@ -104,7 +104,7 @@ void shouldNotReturnAssetsWhenUserIsNotAuthenticated() { given() .contentType(ContentType.JSON) .when() - .get("/api/assets/1234") + .get("/api/assets/as-built/1234") .then() .statusCode(401); } @@ -119,7 +119,7 @@ void shouldGetChildrenAsset() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb/children/urn:uuid:587cfb38-7149-4f06-b1e0-0e9b6e98be2a") + .get("/api/assets/as-built/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb/children/urn:uuid:587cfb38-7149-4f06-b1e0-0e9b6e98be2a") .then() .statusCode(200) .body("id", Matchers.is("urn:uuid:587cfb38-7149-4f06-b1e0-0e9b6e98be2a")); @@ -135,7 +135,7 @@ void shouldReturn404WhenChildrenAssetIsNotFound() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb/children/unknown") + .get("/api/assets/as-built/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb/children/unknown") .then() .statusCode(404); } @@ -147,7 +147,7 @@ void shouldNotUpdateQualityTypeForNotExistingAsset() throws JoseException { .contentType(ContentType.JSON) .body(asJson(Map.of("qualityType", "Critical"))) .when() - .patch("/api/assets/1234") + .patch("/api/assets/as-built/1234") .then() .statusCode(404) .body("message", equalTo("Asset with id 1234 was not found.")); @@ -161,7 +161,7 @@ void shouldNotUpdateQualityTypeWithInvalidRequestBody(Map reques .contentType(ContentType.JSON) .body(asJson(requestBody)) .when() - .patch("/api/assets/1234") + .patch("/api/assets/as-built/1234") .then() .statusCode(400) .body("message", equalTo(errorMessage)); @@ -178,7 +178,7 @@ void shouldUpdateQualityTypeForExistingAsset() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/" + existingAssetId) + .get("/api/assets/as-built/" + existingAssetId) .then() .statusCode(200) .body("qualityType", equalTo("Ok")); @@ -188,7 +188,7 @@ void shouldUpdateQualityTypeForExistingAsset() throws JoseException { .contentType(ContentType.JSON) .body(Map.of("qualityType", "Critical")) .when() - .patch("/api/assets/" + existingAssetId) + .patch("/api/assets/as-built/" + existingAssetId) .then() .statusCode(200) .body("qualityType", equalTo("Critical")); @@ -197,7 +197,7 @@ void shouldUpdateQualityTypeForExistingAsset() throws JoseException { .header(oAuth2Support.jwtAuthorization(ADMIN)) .contentType(ContentType.JSON) .when() - .get("/api/assets/" + existingAssetId) + .get("/api/assets/as-built/" + existingAssetId) .then() .statusCode(200) .body("qualityType", equalTo("Critical")); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerCountriesIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerCountriesIT.java index 73344985a8..5701974731 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerCountriesIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerCountriesIT.java @@ -55,7 +55,7 @@ void shouldReturnAssetsCountryMap(JwtRole role) throws JoseException { .header(oAuth2Support.jwtAuthorization(role)) .contentType(ContentType.JSON) .when() - .get("/api/assets/countries") + .get("/api/assets/as-built/countries") .then() .statusCode(200); @@ -66,7 +66,7 @@ void shouldNotReturnAssetsCountryMapWhenUserIsNotAuthenticated() { given() .contentType(ContentType.JSON) .when() - .get("/api/assets/countries") + .get("/api/assets/as-built/countries") .then() .statusCode(401); } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerDetailInformationIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerDetailInformationIT.java index b8ca4139c1..9142348cbb 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerDetailInformationIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerDetailInformationIT.java @@ -56,7 +56,7 @@ void shouldNotReturnAassetsDetailInformationWhenUserIsNotAuthenticated() { ) ) .when() - .post("/api/assets/detail-information") + .post("/api/assets/as-built/detail-information") .then() .statusCode(401); } @@ -78,7 +78,7 @@ void shouldReturnAssetsDetailInformation() throws JoseException { ) .header(oAuth2Support.jwtAuthorization(ADMIN)) .when() - .post("/api/assets/detail-information") + .post("/api/assets/as-built/detail-information") .then() .statusCode(200) .body("", hasSize(3)); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java index bf1ba4b619..c7383f31ea 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java @@ -56,7 +56,7 @@ void shouldSynchronizeAssets() throws JoseException, InterruptedException { ) .header(oAuth2Support.jwtAuthorization(ADMIN)) .when() - .post("/api/assets/sync") + .post("/api/assets/as-built/sync") .then() .statusCode(200); @@ -88,7 +88,7 @@ void shouldSynchronizeAssetsUsingRetry() throws JoseException, InterruptedExcept ) .header(oAuth2Support.jwtAuthorization(ADMIN)) .when() - .post("/api/assets/sync") + .post("/api/assets/as-built/sync") .then() .statusCode(200); @@ -117,7 +117,7 @@ void shouldNotSynchronizeAssetsWhenIrsFailedToReturnJobDetails() throws JoseExce ) .header(oAuth2Support.jwtAuthorization(ADMIN)) .when() - .post("/api/assets/sync") + .post("/api/assets/as-built/sync") .then() .statusCode(200); @@ -146,7 +146,7 @@ void shouldNotSynchronizeAssetsWhenIrsKeepsReturningJobInRunningState() throws J ) .header(oAuth2Support.jwtAuthorization(ADMIN)) .when() - .post("/api/assets/sync") + .post("/api/assets/as-built/sync") .then() .statusCode(200); From a6db5363cf61505e4abc4d32cfc956bce1f063d3 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 13:42:01 +0200 Subject: [PATCH 11/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../tractusx/traceability/common/support/EdcSupport.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy index 1d4e7d8bc0..4f9c79d2e4 100644 --- a/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy +++ b/tx-backend/src/integration/groovy/org/eclipse/tractusx/traceability/common/support/EdcSupport.groovy @@ -36,7 +36,7 @@ trait EdcSupport implements RestitoProvider { void edcWillCreateNotificationAsset() { whenHttp(stubServer()).match( - post("/management/v2/assets/"), + post("/management/v2/assets"), EDC_API_KEY_HEADER ).then( status(HttpStatus.OK_200) From 00662fa8c2c81c64e481a458ff53f79881b3541d Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 15:13:55 +0200 Subject: [PATCH 12/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../asbuilt/rest/AssetAsBuiltController.java | 21 +- .../asbuilt/service/AssetAsBuiltService.java | 25 --- .../rest/AssetAsPlannedController.java | 9 +- .../service/AssetAsPlannedService.java | 24 --- .../repository/AssetAsBuiltRepository.java | 2 + .../service/AssetAsBuiltServiceImpl.java | 181 ++-------------- .../repository/AssetAsPlannedRepository.java | 2 + .../service/AssetAsPlannedServiceImpl.java | 182 ++-------------- .../service/AbstractAssetBaseService.java | 137 ++++++++++++ .../base/service/AssetBaseServiceImpl.java | 204 ------------------ .../service/AssetAsBuiltServiceImplTest.java | 2 +- 11 files changed, 203 insertions(+), 586 deletions(-) delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java index d8abe1dc36..2da6b12208 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java @@ -37,11 +37,12 @@ import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; @@ -60,8 +61,8 @@ @RequestMapping(path = "/assets/as-built", produces = "application/json", consumes = "application/json") @RequiredArgsConstructor public class AssetAsBuiltController { - - private final AssetAsBuiltService assetAsBuiltService; + @Qualifier("assetAsBuiltServiceImpl") + private final AssetBaseService assetBaseService; @Operation(operationId = "sync", summary = "Synchronizes assets from IRS", @@ -108,7 +109,7 @@ public class AssetAsBuiltController { schema = @Schema(implementation = ErrorResponse.class)))}) @PostMapping("/sync") public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { - assetAsBuiltService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); + assetBaseService.synchronizeAssetsAsync(syncAssetsRequest.globalAssetIds()); } @Operation(operationId = "assets", @@ -160,7 +161,7 @@ public void sync(@Valid @RequestBody SyncAssetsRequest syncAssetsRequest) { schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("") public PageResult assets(OwnPageable pageable, @QueryParam("owner") Owner owner) { - return AssetAsBuiltResponseMapper.from(assetAsBuiltService.getAssets(OwnPageable.toPageable(pageable), owner)); + return AssetAsBuiltResponseMapper.from(assetBaseService.getAssets(OwnPageable.toPageable(pageable), owner)); } @Operation(operationId = "assetsCountryMap", @@ -202,7 +203,7 @@ public PageResult assets(OwnPageable pageable, @QueryParam schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/countries") public Map assetsCountryMap() { - return assetAsBuiltService.getAssetsCountryMap(); + return assetBaseService.getAssetsCountryMap(); } @@ -246,7 +247,7 @@ public Map assetsCountryMap() { schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}") public AssetAsBuiltResponse asset(@PathVariable String assetId) { - return AssetAsBuiltResponseMapper.from(assetAsBuiltService.getAssetById(assetId)); + return AssetAsBuiltResponseMapper.from(assetBaseService.getAssetById(assetId)); } @@ -290,7 +291,7 @@ public AssetAsBuiltResponse asset(@PathVariable String assetId) { schema = @Schema(implementation = ErrorResponse.class)))}) @GetMapping("/{assetId}/children/{childId}") public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable String childId) { - return AssetAsBuiltResponseMapper.from(assetAsBuiltService.getAssetByChildId(assetId, childId)); + return AssetAsBuiltResponseMapper.from(assetBaseService.getAssetByChildId(assetId, childId)); } @Operation(operationId = "updateAsset", @@ -340,7 +341,7 @@ public AssetAsBuiltResponse asset(@PathVariable String assetId, @PathVariable St @PatchMapping("/{assetId}") public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @RequestBody UpdateAssetRequest updateAssetRequest) { return AssetAsBuiltResponseMapper.from( - assetAsBuiltService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) + assetBaseService.updateQualityType(assetId, updateAssetRequest.qualityType().toDomain()) ); } @@ -400,7 +401,7 @@ public AssetAsBuiltResponse updateAsset(@PathVariable String assetId, @Valid @Re @PostMapping("/detail-information") public List getDetailInformation(@Valid @RequestBody GetDetailInformationRequest getDetailInformationRequest) { return AssetAsBuiltResponseMapper.from( - assetAsBuiltService.getAssetsById(getDetailInformationRequest.assetIds()) + assetBaseService.getAssetsById(getDetailInformationRequest.assetIds()) ); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java deleted file mode 100644 index af41bb6bb6..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/service/AssetAsBuiltService.java +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.application.asbuilt.service; - -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; - -public interface AssetAsBuiltService extends AssetBaseService { - -} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java index 8fabc01a3c..a84d7ae6cc 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -32,17 +32,16 @@ import jakarta.validation.Valid; import jakarta.ws.rs.QueryParam; import lombok.RequiredArgsConstructor; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.mapper.AssetAsBuiltResponseMapper; import org.eclipse.tractusx.traceability.assets.application.asplanned.mapper.AssetAsPlannedResponseMapper; -import org.eclipse.tractusx.traceability.assets.application.asplanned.service.AssetAsPlannedService; import org.eclipse.tractusx.traceability.assets.application.base.request.GetDetailInformationRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.SyncAssetsRequest; import org.eclipse.tractusx.traceability.assets.application.base.request.UpdateAssetRequest; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -56,7 +55,9 @@ @RequiredArgsConstructor public class AssetAsPlannedController { - private final AssetAsPlannedService assetService; + + @Qualifier("assetAsPlannedServiceImpl") + private final AssetBaseService assetService; @Operation(operationId = "sync", summary = "Synchronizes assets from IRS", diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java deleted file mode 100644 index 3e0d3be104..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/service/AssetAsPlannedService.java +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ -package org.eclipse.tractusx.traceability.assets.application.asplanned.service; - -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; - -public interface AssetAsPlannedService extends AssetBaseService { -} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java index afd793ccc0..8e13f9e007 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java @@ -20,7 +20,9 @@ package org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; +import org.springframework.stereotype.Component; +@Component("assetAsBuiltRepository") public interface AssetAsBuiltRepository extends AssetRepository { } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java index 5d615c0107..19e9393cf0 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java @@ -21,185 +21,48 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.asbuilt.service.AssetAsBuiltService; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; -import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.service.AbstractAssetBaseService; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; -import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Async; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor -public class AssetAsBuiltServiceImpl implements AssetAsBuiltService { +public class AssetAsBuiltServiceImpl extends AbstractAssetBaseService { - private final AssetAsBuiltRepository assetAsBuiltRepository; - private final AssetAsPlannedRepository assetAsPlannedRepository; - private final IrsRepository irsRepository; - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(List globalAssetIds) { - for (String globalAssetId : globalAssetIds) { - try { - synchronizeAssetsAsync(globalAssetId); - } catch (Exception e) { - log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); - } - } - } - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(String globalAssetId) { - log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); - try { - syncAssetsAsBuilt(globalAssetId); - syncAssetsAsPlanned(globalAssetId); - - } catch (Exception e) { - log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); - } - } - - private void syncAssetsAsPlanned(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); - assetAsPlannedRepository.saveAll(downwardAssets); - } - - private void syncAssetsAsBuilt(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - assetAsBuiltRepository.saveAll(downwardAssets); - - List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - - upwardAssets.forEach(asset -> { - if (assetAsBuiltRepository.existsById(asset.getId())) { - log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); - assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); - } else { - log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); - assetAsBuiltRepository.save(asset); - } - }); - } - - public void setAssetsInvestigationStatus(QualityNotification investigation) { - assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } + @Qualifier("assetAsBuiltRepository") + private final AssetRepository assetAsBuiltRepository; - public void setAssetsAlertStatus(QualityNotification alert) { - assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } - - public AssetBase updateQualityType(String assetId, QualityType qualityType) { - AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); - if (foundAsset == null) { - AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); - foundAssetAsPlanned.setQualityType(qualityType); - return assetAsPlannedRepository.save(foundAssetAsPlanned); - } else { - foundAsset.setQualityType(qualityType); - return assetAsBuiltRepository.save(foundAsset); - } - - - } - - public Map getAssetsCountryMap() { - Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map mergedMap = new HashMap<>(assetsCountryMap); - assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); - - return mergedMap; - } - - public PageResult getAssets(Pageable pageable, Owner owner) { - Pageable halfPage = halfPageable(pageable); - PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); - PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); + private final IrsRepository irsRepository; - List mergedContent = new ArrayList<>(assetsAsPlanned.content()); - mergedContent.addAll(assetsAsBuilt.content()); - return new PageResult<>(mergedContent, - assetsAsBuilt.page(), - assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), - assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), - (long) mergedContent.size()); + @Override + protected AssetRepository getAssetRepository() { + return assetAsBuiltRepository; } - // TODO once asPlanned has own domain object this special pageable logic should be removed - private Pageable halfPageable(Pageable pageable) { - if (pageable != null) { - int pageSize = pageable.getPageSize(); - int pageNumber = pageable.getPageNumber(); - return PageRequest.of(pageNumber / 2, pageSize / 2); - } - return Pageable.unpaged(); + @Override + protected List getDownwardAspects() { + return Aspect.downwardAspectsForAssetsAsBuilt(); } - public AssetBase getAssetById(String assetId) { - try { - return assetAsBuiltRepository.getAssetById(assetId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetById(assetId); - } + @Override + protected List getUpwardAspects() { + return Aspect.upwardAspectsForAssetsAsBuilt(); } - public List getAssetsById(List assetIds) { - List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); - List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); - List mergedList = new ArrayList<>(assetAsBuiltIds); - mergedList.addAll(assetAsPlannedIds); - return mergedList; + @Override + protected BomLifecycle getBomLifecycle() { + return BomLifecycle.AS_BUILT; } - public AssetBase getAssetByChildId(String assetId, String childId) { - try { - return assetAsBuiltRepository.getAssetByChildId(assetId, childId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetByChildId(assetId, childId); - } - + @Override + protected IrsRepository getIrsRepository() { + return irsRepository; } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java index 73bec57e48..54924164c0 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java @@ -20,7 +20,9 @@ package org.eclipse.tractusx.traceability.assets.domain.asplanned.repository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; +import org.springframework.stereotype.Component; +@Component("assetAsPlannedRepository") public interface AssetAsPlannedRepository extends AssetRepository { } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java index 4bbc7c513e..84af7c523c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java @@ -21,185 +21,49 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.asplanned.service.AssetAsPlannedService; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; -import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.service.AbstractAssetBaseService; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; -import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Async; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor -public class AssetAsPlannedServiceImpl implements AssetAsPlannedService { +public class AssetAsPlannedServiceImpl extends AbstractAssetBaseService { - private final AssetAsBuiltRepository assetAsBuiltRepository; - private final AssetAsPlannedRepository assetAsPlannedRepository; - private final IrsRepository irsRepository; - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(List globalAssetIds) { - for (String globalAssetId : globalAssetIds) { - try { - synchronizeAssetsAsync(globalAssetId); - } catch (Exception e) { - log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); - } - } - } - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(String globalAssetId) { - log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); - try { - syncAssetsAsBuilt(globalAssetId); - syncAssetsAsPlanned(globalAssetId); - - } catch (Exception e) { - log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); - } - } - - private void syncAssetsAsPlanned(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); - assetAsPlannedRepository.saveAll(downwardAssets); - } - - private void syncAssetsAsBuilt(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - assetAsBuiltRepository.saveAll(downwardAssets); - - List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - - upwardAssets.forEach(asset -> { - if (assetAsBuiltRepository.existsById(asset.getId())) { - log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); - assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); - } else { - log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); - assetAsBuiltRepository.save(asset); - } - }); - } - - public void setAssetsInvestigationStatus(QualityNotification investigation) { - assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } + @Qualifier("assetAsPlannedRepository") + private final AssetRepository assetAsPlannedRepository; - public void setAssetsAlertStatus(QualityNotification alert) { - assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } - - public AssetBase updateQualityType(String assetId, QualityType qualityType) { - AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); - if (foundAsset == null) { - AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); - foundAssetAsPlanned.setQualityType(qualityType); - return assetAsPlannedRepository.save(foundAssetAsPlanned); - } else { - foundAsset.setQualityType(qualityType); - return assetAsBuiltRepository.save(foundAsset); - } - - - } - - public Map getAssetsCountryMap() { - Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map mergedMap = new HashMap<>(assetsCountryMap); - assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); - - return mergedMap; - } - - public PageResult getAssets(Pageable pageable, Owner owner) { - Pageable halfPage = halfPageable(pageable); - PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); - PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); + private final IrsRepository irsRepository; - List mergedContent = new ArrayList<>(assetsAsPlanned.content()); - mergedContent.addAll(assetsAsBuilt.content()); - return new PageResult<>(mergedContent, - assetsAsBuilt.page(), - assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), - assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), - (long) mergedContent.size()); + @Override + protected AssetRepository getAssetRepository() { + return assetAsPlannedRepository; } - // TODO once asPlanned has own domain object this special pageable logic should be removed - private Pageable halfPageable(Pageable pageable) { - if (pageable != null) { - int pageSize = pageable.getPageSize(); - int pageNumber = pageable.getPageNumber(); - return PageRequest.of(pageNumber / 2, pageSize / 2); - } - return Pageable.unpaged(); + @Override + protected List getDownwardAspects() { + return Aspect.downwardAspectsForAssetsAsPlanned(); } - public AssetBase getAssetById(String assetId) { - try { - return assetAsBuiltRepository.getAssetById(assetId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetById(assetId); - } + @Override + protected List getUpwardAspects() { + return Collections.emptyList(); } - public List getAssetsById(List assetIds) { - List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); - List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); - List mergedList = new ArrayList<>(assetAsBuiltIds); - mergedList.addAll(assetAsPlannedIds); - return mergedList; + @Override + protected BomLifecycle getBomLifecycle() { + return BomLifecycle.AS_PLANNED; } - public AssetBase getAssetByChildId(String assetId, String childId) { - try { - return assetAsBuiltRepository.getAssetByChildId(assetId, childId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetByChildId(assetId, childId); - } - + @Override + protected IrsRepository getIrsRepository() { + return irsRepository; } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java new file mode 100644 index 0000000000..95760d6d45 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java @@ -0,0 +1,137 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.domain.base.service; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; +import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; +import org.eclipse.tractusx.traceability.common.model.PageResult; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +public abstract class AbstractAssetBaseService implements AssetBaseService { + + protected abstract AssetRepository getAssetRepository(); + + protected abstract IrsRepository getIrsRepository(); + + protected abstract List getDownwardAspects(); + + protected abstract List getUpwardAspects(); + + protected abstract BomLifecycle getBomLifecycle(); + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(String globalAssetId) { + log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); + try { + if (!getDownwardAspects().isEmpty()) { + List downwardAssets = getIrsRepository().findAssets(globalAssetId, Direction.DOWNWARD, getDownwardAspects(), getBomLifecycle()); + getAssetRepository().saveAll(downwardAssets); + } + + if (!getUpwardAspects().isEmpty()) { + + List upwardAssets = getIrsRepository().findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); + + upwardAssets.forEach(asset -> { + if (getAssetRepository().existsById(asset.getId())) { + getAssetRepository().updateParentDescriptionsAndOwner(asset); + } else { + getAssetRepository().save(asset); + } + }); + + } + + } catch (Exception e) { + log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); + } + } + + @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) + public void synchronizeAssetsAsync(List globalAssetIds) { + for (String globalAssetId : globalAssetIds) { + try { + synchronizeAssetsAsync(globalAssetId); + } catch (Exception e) { + log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); + } + } + } + + + public void setAssetsInvestigationStatus(QualityNotification investigation) { + getAssetRepository().getAssetsById(investigation.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + getAssetRepository().save(asset); + }); + } + + public void setAssetsAlertStatus(QualityNotification alert) { + getAssetRepository().getAssetsById(alert.getAssetIds()).forEach(asset -> { + // Assets in status closed will be false, others true + asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); + getAssetRepository().save(asset); + }); + } + + public Map getAssetsCountryMap() { + return getAssetRepository().getAssets().stream() + .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); + } + + public AssetBase updateQualityType(String assetId, QualityType qualityType) { + AssetBase foundAsset = getAssetRepository().getAssetById(assetId); + foundAsset.setQualityType(qualityType); + return getAssetRepository().save(foundAsset); + } + + public PageResult getAssets(Pageable pageable, Owner owner) { + return getAssetRepository().getAssets(pageable, owner); + } + + public AssetBase getAssetById(String assetId) { + return getAssetRepository().getAssetById(assetId); + } + + public List getAssetsById(List assetIds) { + return getAssetRepository().getAssetsById(assetIds); + } + + public AssetBase getAssetByChildId(String assetId, String childId) { + return getAssetRepository().getAssetByChildId(assetId, childId); + } +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java deleted file mode 100644 index ba70d87c4f..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AssetBaseServiceImpl.java +++ /dev/null @@ -1,204 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -package org.eclipse.tractusx.traceability.assets.domain.base.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.exception.AssetNotFoundException; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; -import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; -import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; -import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; -import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; -import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@Component -@RequiredArgsConstructor -public class AssetBaseServiceImpl implements AssetBaseService { - - private final AssetAsBuiltRepository assetAsBuiltRepository; - private final AssetAsPlannedRepository assetAsPlannedRepository; - private final IrsRepository irsRepository; - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(List globalAssetIds) { - for (String globalAssetId : globalAssetIds) { - try { - synchronizeAssetsAsync(globalAssetId); - } catch (Exception e) { - log.warn("Cannot fetch assets for id: {}. Error: {}", globalAssetId, e.getMessage()); - } - } - } - - @Async(value = AssetsAsyncConfig.SYNCHRONIZE_ASSETS_EXECUTOR) - public void synchronizeAssetsAsync(String globalAssetId) { - log.info("Synchronizing assets for globalAssetId: {}", globalAssetId); - try { - syncAssetsAsBuilt(globalAssetId); - syncAssetsAsPlanned(globalAssetId); - - } catch (Exception e) { - log.warn("Exception during assets synchronization for globalAssetId: {}. Message: {}.", globalAssetId, e.getMessage(), e); - } - } - - private void syncAssetsAsPlanned(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); - assetAsPlannedRepository.saveAll(downwardAssets); - } - - private void syncAssetsAsBuilt(String globalAssetId) { - List downwardAssets = irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - assetAsBuiltRepository.saveAll(downwardAssets); - - List upwardAssets = irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - - upwardAssets.forEach(asset -> { - if (assetAsBuiltRepository.existsById(asset.getId())) { - log.info(asset.getId() + "isUpwardAsset 1 - asBuilt"); - assetAsBuiltRepository.updateParentDescriptionsAndOwner(asset); - } else { - log.info(asset.getId() + "isUpwardAsset 2 - asBuilt"); - assetAsBuiltRepository.save(asset); - } - }); - } - - public void setAssetsInvestigationStatus(QualityNotification investigation) { - assetAsBuiltRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(investigation.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setUnderInvestigation(!investigation.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } - - public void setAssetsAlertStatus(QualityNotification alert) { - assetAsBuiltRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - assetAsPlannedRepository.getAssetsById(alert.getAssetIds()).forEach(asset -> { - // Assets in status closed will be false, others true - asset.setActiveAlert(!alert.getNotificationStatus().equals(QualityNotificationStatus.CLOSED)); - assetAsBuiltRepository.save(asset); - }); - } - - public AssetBase updateQualityType(String assetId, QualityType qualityType) { - AssetBase foundAsset = assetAsBuiltRepository.getAssetById(assetId); - if (foundAsset == null) { - AssetBase foundAssetAsPlanned = assetAsPlannedRepository.getAssetById(assetId); - foundAssetAsPlanned.setQualityType(qualityType); - return assetAsPlannedRepository.save(foundAssetAsPlanned); - } else { - foundAsset.setQualityType(qualityType); - return assetAsBuiltRepository.save(foundAsset); - } - - - } - - public Map getAssetsCountryMap() { - Map assetsCountryMap = assetAsBuiltRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map assetsAsPlannedCountryMap = assetAsPlannedRepository.getAssets().stream() - .collect(Collectors.groupingBy(asset -> asset.getSemanticModel().getManufacturingCountry(), Collectors.counting())); - - Map mergedMap = new HashMap<>(assetsCountryMap); - assetsAsPlannedCountryMap.forEach((country, count) -> mergedMap.merge(country, count, Long::sum)); - - return mergedMap; - } - - public PageResult getAssets(Pageable pageable, Owner owner) { - Pageable halfPage = halfPageable(pageable); - PageResult assetsAsPlanned = assetAsPlannedRepository.getAssets(halfPage, owner); - PageResult assetsAsBuilt = assetAsBuiltRepository.getAssets(halfPage, owner); - - List mergedContent = new ArrayList<>(assetsAsPlanned.content()); - mergedContent.addAll(assetsAsBuilt.content()); - return new PageResult<>(mergedContent, - assetsAsBuilt.page(), - assetsAsBuilt.pageCount() + assetsAsPlanned.pageCount(), - assetsAsBuilt.pageSize() + assetsAsBuilt.pageSize(), - (long) mergedContent.size()); - } - // TODO once asPlanned has own domain object this special pageable logic should be removed - private Pageable halfPageable(Pageable pageable) { - if (pageable != null) { - int pageSize = pageable.getPageSize(); - int pageNumber = pageable.getPageNumber(); - return PageRequest.of(pageNumber / 2, pageSize / 2); - } - return Pageable.unpaged(); - } - - public AssetBase getAssetById(String assetId) { - try { - return assetAsBuiltRepository.getAssetById(assetId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetById(assetId); - } - } - - public List getAssetsById(List assetIds) { - List assetAsBuiltIds = assetAsBuiltRepository.getAssetsById(assetIds); - List assetAsPlannedIds = assetAsPlannedRepository.getAssetsById(assetIds); - List mergedList = new ArrayList<>(assetAsBuiltIds); - mergedList.addAll(assetAsPlannedIds); - return mergedList; - } - - public AssetBase getAssetByChildId(String assetId, String childId) { - try { - return assetAsBuiltRepository.getAssetByChildId(assetId, childId); - } catch (AssetNotFoundException assetNotFoundException) { - return assetAsPlannedRepository.getAssetByChildId(assetId, childId); - } - - } -} diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java index 154afeb5fb..ddb660fd9d 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java @@ -84,7 +84,7 @@ void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { verify(irsRepository).findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); verify(irsRepository).findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); verify(irsRepository).findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); - verify(assetRepository, times(1)).saveAll(any()); + verify(assetRepository, times(2)).saveAll(any()); } From 8d5fb217c1c96ef52f5ccc0b05e0bc6aabbf38cc Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 15:25:41 +0200 Subject: [PATCH 13/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../service/AssetAsBuiltServiceImplTest.java | 9 +-- .../AssetAsPlannedServiceImplTest.java | 77 +++++++++++++++++++ 2 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java index ddb660fd9d..1caa96d90d 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsBuiltServiceImplTest.java @@ -55,9 +55,6 @@ class AssetAsBuiltServiceImplTest { @Mock private AssetAsBuiltRepository assetRepository; - @Mock - private AssetAsPlannedRepository assetAsPlannedRepository; - @Test void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { @@ -73,9 +70,6 @@ void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { when(irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT)) .thenReturn(upwardAssets); - when(irsRepository.findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT)) - .thenReturn(Collections.emptyList()); - // when assetService.synchronizeAssetsAsync(globalAssetId); @@ -83,8 +77,7 @@ void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { // then verify(irsRepository).findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); verify(irsRepository).findAssets(globalAssetId, Direction.UPWARD, Aspect.upwardAspectsForAssetsAsBuilt(), BomLifecycle.AS_BUILT); - verify(irsRepository).findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); - verify(assetRepository, times(2)).saveAll(any()); + verify(assetRepository, times(1)).saveAll(any()); } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java new file mode 100644 index 0000000000..f65d86c56b --- /dev/null +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java @@ -0,0 +1,77 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.traceability.assets.domain.service; + +import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.service.AssetAsPlannedServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.Direction; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; +import org.eclipse.tractusx.traceability.testdata.AssetTestDataFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class AssetAsPlannedServiceImplTest { + + @InjectMocks + private AssetAsPlannedServiceImpl assetService; + + @Mock + private IrsRepository irsRepository; + + @Mock + private AssetAsPlannedRepository assetRepository; + + @Test + void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { + // given + List parentDescriptionsList = AssetTestDataFactory.provideParentRelations(); + List childDescriptionList = AssetTestDataFactory.provideChildRelations(); + String globalAssetId = "123"; + List downwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(Collections.emptyList(), childDescriptionList)); + List upwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(parentDescriptionsList, Collections.emptyList())); + + when(irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED)) + .thenReturn(downwardAssets); + + // when + assetService.synchronizeAssetsAsync(globalAssetId); + + // then + verify(irsRepository).findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED); + verify(assetRepository, times(1)).saveAll(any()); + } + + +} + From 94d7160953ed13daa36b880ad14acda415d74a24 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 15:37:04 +0200 Subject: [PATCH 14/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../domain/asbuilt/repository/AssetAsBuiltRepository.java | 3 +-- .../domain/asbuilt/service/AssetAsBuiltServiceImpl.java | 4 ++-- .../asplanned/repository/AssetAsPlannedRepository.java | 3 +-- .../domain/asplanned/service/AssetAsPlannedServiceImpl.java | 5 +++-- .../domain/alert/service/AlertServiceImpl.java | 1 + .../investigation/service/InvestigationServiceImpl.java | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java index 8e13f9e007..e5d168786c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/repository/AssetAsBuiltRepository.java @@ -20,9 +20,8 @@ package org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; -import org.springframework.stereotype.Component; -@Component("assetAsBuiltRepository") + public interface AssetAsBuiltRepository extends AssetRepository { } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java index 19e9393cf0..d685c42d42 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java @@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; import org.eclipse.tractusx.traceability.assets.domain.base.service.AbstractAssetBaseService; @@ -36,8 +37,7 @@ @RequiredArgsConstructor public class AssetAsBuiltServiceImpl extends AbstractAssetBaseService { - @Qualifier("assetAsBuiltRepository") - private final AssetRepository assetAsBuiltRepository; + private final AssetAsBuiltRepository assetAsBuiltRepository; private final IrsRepository irsRepository; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java index 54924164c0..c136c46010 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/repository/AssetAsPlannedRepository.java @@ -20,9 +20,8 @@ package org.eclipse.tractusx.traceability.assets.domain.asplanned.repository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; -import org.springframework.stereotype.Component; -@Component("assetAsPlannedRepository") + public interface AssetAsPlannedRepository extends AssetRepository { } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java index 84af7c523c..07c0738d90 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java @@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; import org.eclipse.tractusx.traceability.assets.domain.base.service.AbstractAssetBaseService; @@ -37,8 +39,7 @@ @RequiredArgsConstructor public class AssetAsPlannedServiceImpl extends AbstractAssetBaseService { - @Qualifier("assetAsPlannedRepository") - private final AssetRepository assetAsPlannedRepository; + private final AssetAsPlannedRepository assetAsPlannedRepository; private final IrsRepository irsRepository; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java index b5fa5e432b..25a0188c3b 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java @@ -40,6 +40,7 @@ import java.time.Instant; import java.util.List; +// TODO as this is duplicated with InvestigationServiceImpl it should be done like assetAsPlanned / assetAsBuilt with an abstract class / interface @Slf4j @Service @RequiredArgsConstructor diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java index 853d9940a5..efbcdcb2f6 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java @@ -39,7 +39,7 @@ import java.time.Instant; import java.util.List; - +// TODO as this is duplicated with InvestigationServiceImpl it should be done like assetAsPlanned / assetAsBuilt with an abstract class / interface @Slf4j @RequiredArgsConstructor @Service From b27dda9a90388079ac2845dcf3b07399c8ffbb39 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 15:49:08 +0200 Subject: [PATCH 15/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../service/DecentralRegistryServiceImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java index f9dac69a44..2e9410e6bf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java @@ -23,14 +23,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.service.AssetAsPlannedServiceImpl; import org.eclipse.tractusx.traceability.common.config.AssetsAsyncConfig; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.shelldescriptor.application.DecentralRegistryService; import org.eclipse.tractusx.traceability.shelldescriptor.application.ShellDescriptorService; import org.eclipse.tractusx.traceability.shelldescriptor.domain.model.ShellDescriptor; import org.eclipse.tractusx.traceability.shelldescriptor.domain.repository.DecentralRegistryRepository; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -42,8 +42,8 @@ public class DecentralRegistryServiceImpl implements DecentralRegistryService { private final ShellDescriptorService shellDescriptorsService; - @Qualifier("assetBaseServiceImpl") - private final AssetBaseService assetService; + private final AssetAsBuiltServiceImpl assetAsBuiltService; + private final AssetAsPlannedServiceImpl assetAsPlannedService; private final TraceabilityProperties traceabilityProperties; private final DecentralRegistryRepository decentralRegistryRepository; @@ -54,7 +54,10 @@ public void updateShellDescriptorAndSynchronizeAssets() { List updatedShellDescriptorList = shellDescriptorsService.determineExistingShellDescriptorsAndUpdate(shellDescriptorList); updatedShellDescriptorList.stream() .map(ShellDescriptor::getGlobalAssetId) - .forEach(assetService::synchronizeAssetsAsync); + .forEach(globalAssetId -> { + assetAsPlannedService.synchronizeAssetsAsync(globalAssetId); + assetAsBuiltService.synchronizeAssetsAsync(globalAssetId); + }); } } From 71f786f48528550acfe48c00cbf3a0df7acda7ac Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 15:50:55 +0200 Subject: [PATCH 16/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../domain/asbuilt/service/AssetAsBuiltServiceImpl.java | 1 - .../domain/asplanned/service/AssetAsPlannedServiceImpl.java | 2 -- .../domain/DecentralDecentralRegistryServiceImplTest.java | 5 ++++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java index d685c42d42..1400fb2874 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asbuilt/service/AssetAsBuiltServiceImpl.java @@ -27,7 +27,6 @@ import org.eclipse.tractusx.traceability.assets.domain.base.service.AbstractAssetBaseService; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.List; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java index 07c0738d90..ac5683bfe2 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/service/AssetAsPlannedServiceImpl.java @@ -21,14 +21,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.AssetRepository; import org.eclipse.tractusx.traceability.assets.domain.base.IrsRepository; import org.eclipse.tractusx.traceability.assets.domain.base.service.AbstractAssetBaseService; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.Collections; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java index 562756cc94..9014a17e9e 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/DecentralDecentralRegistryServiceImplTest.java @@ -21,6 +21,7 @@ import org.eclipse.tractusx.irs.registryclient.exceptions.RegistryServiceException; import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.service.AssetAsPlannedServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.shelldescriptor.domain.model.ShellDescriptor; @@ -52,8 +53,10 @@ class DecentralDecentralRegistryServiceImplTest { @Mock private TraceabilityProperties traceabilityProperties; @Mock - private AssetBaseService assetService; + private AssetAsBuiltServiceImpl assetService; + @Mock + private AssetAsPlannedServiceImpl assetAsPlannedService; @InjectMocks private DecentralRegistryServiceImpl registryFacade; From b26fb0ced7cd321f39d318f8eaf51226b88f0b8a Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 16:34:44 +0200 Subject: [PATCH 17/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../request/StartQualityAlertRequest.java | 2 + .../alert/rest/AlertController.java | 3 +- .../alert/service/AlertService.java | 2 +- .../rest/InvestigationsController.java | 10 +-- .../service/InvestigationService.java | 2 +- .../StartQualityNotificationRequest.java | 2 + .../alert/service/AlertServiceImpl.java | 4 +- .../service/InvestigationServiceImpl.java | 5 +- .../service/NotificationPublisherService.java | 71 +++++++++++-------- .../assets/AssetAsBuiltControllerAllIT.java | 2 +- .../alert/rest/AlertControllerTest.java | 2 +- .../NotificationPublisherServiceTest.java | 4 +- 12 files changed, 61 insertions(+), 48 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/request/StartQualityAlertRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/request/StartQualityAlertRequest.java index 903396e526..8a3c10fd07 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/request/StartQualityAlertRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/request/StartQualityAlertRequest.java @@ -52,4 +52,6 @@ public class StartQualityAlertRequest { @NotNull @ApiModelProperty(example = "BPN00001123123AS") private String bpn; + @ApiModelProperty(example = "true") + private boolean isAsBuilt = true; } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java index 8eb3287049..9219489502 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java @@ -128,7 +128,8 @@ public QualityNotificationIdResponse alertAssets(@RequestBody @Valid StartQualit request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain(), - request.getBpn() + request.getBpn(), + request.isAsBuilt() ).value()); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java index 64ea8e0860..eb3c952a7f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java @@ -27,5 +27,5 @@ import java.util.List; public interface AlertService extends QualityNotificationService { - QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn); + QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn, boolean isAsBuilt); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java index d89e9f63dc..57ee51f249 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java @@ -47,13 +47,7 @@ import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import qualitynotification.base.response.QualityNotificationIdResponse; import qualitynotification.investigation.response.InvestigationResponse; @@ -121,7 +115,7 @@ public class InvestigationsController { public QualityNotificationIdResponse investigateAssets(@RequestBody @Valid StartQualityNotificationRequest request) { log.info(API_LOG_START + " with params: {}", request); return new QualityNotificationIdResponse(investigationService.start( - request.getPartIds(), request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain()).value()); + request.getPartIds(), request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain(), request.isAsBuilt()).value()); } @Operation(operationId = "getCreatedInvestigations", diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java index c4296a503a..4a94dced70 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java @@ -26,6 +26,6 @@ import java.util.List; public interface InvestigationService extends QualityNotificationService { - QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity); + QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, boolean isAsBuilt); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java index 53f2509304..fa2d58b2e1 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java @@ -50,4 +50,6 @@ public class StartQualityNotificationRequest { @NotNull @ApiModelProperty(example = "MINOR") private QualityNotificationSeverityRequest severity; + @ApiModelProperty(example = "true") + private boolean isAsBuilt = true; } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java index 25a0188c3b..c4fe7efcb2 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java @@ -53,8 +53,8 @@ public class AlertServiceImpl implements AlertService { private final AssetAsBuiltServiceImpl assetService; @Override - public QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn) { - QualityNotification notification = notificationPublisherService.startAlert(partIds, description, targetDate, severity, targetBpn); + public QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn, boolean isAsBuilt) { + QualityNotification notification = notificationPublisherService.startAlert(partIds, description, targetDate, severity, targetBpn, isAsBuilt); QualityNotificationId createdAlertId = alertRepository.saveQualityNotificationEntity(notification); log.info("Start Alert {}", notification); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java index efbcdcb2f6..2ecaf5ad08 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java @@ -51,10 +51,9 @@ public class InvestigationServiceImpl implements InvestigationService { private final AssetAsBuiltServiceImpl assetService; - @Override - public QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity) { - QualityNotification notification = notificationPublisherService.startInvestigation(partIds, description, targetDate, severity); + public QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, boolean isAsBuilt) { + QualityNotification notification = notificationPublisherService.startInvestigation(partIds, description, targetDate, severity,isAsBuilt); QualityNotificationId createdInvestigationId = investigationsRepository.saveQualityNotificationEntity(notification); log.info("Start Investigation {}", notification); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index 79c359caa3..a113528ca2 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -23,31 +23,21 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.service.AssetAsPlannedServiceImpl; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationAffectedPart; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationMessage; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSeverity; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSide; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.*; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.exception.QualityNotificationIllegalUpdate; import org.springframework.stereotype.Service; import java.time.Clock; import java.time.Instant; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import static java.util.stream.Collectors.groupingBy; @@ -58,9 +48,11 @@ public class NotificationPublisherService { private final TraceabilityProperties traceabilityProperties; private final EdcNotificationService edcNotificationService; - private final AssetAsBuiltRepository assetRepository; + private final AssetAsBuiltRepository assetAsBuiltRepository; private final AssetAsPlannedRepository assetAsPlannedRepository; - private final AssetAsBuiltServiceImpl assetService; + private final AssetAsBuiltServiceImpl assetAsBuiltService; + private final AssetAsPlannedServiceImpl assetAsPlannedService; + private final BpnRepository bpnRepository; private final Clock clock; @@ -72,24 +64,38 @@ public class NotificationPublisherService { * @param description the description of the investigation * @param targetDate the targetDate of the investigation * @param severity the severity of the investigation + * @param isAsBuilt the isAsBuilt of the investigation * @return the ID of the newly created investigation */ - public QualityNotification startInvestigation(List assetIds, String description, Instant targetDate, QualityNotificationSeverity severity) { + public QualityNotification startInvestigation(List assetIds, String description, Instant targetDate, QualityNotificationSeverity severity, boolean isAsBuilt) { BPN applicationBPN = traceabilityProperties.getBpn(); QualityNotification notification = QualityNotification.startNotification(clock.instant(), applicationBPN, description); + if (isAsBuilt) { + Map> assetsAsBuiltBPNMap = assetAsBuiltRepository.getAssetsById(assetIds).stream().collect(groupingBy(AssetBase::getManufacturerId)); - Map> assetsByBPN = assetRepository.getAssetsById(assetIds).stream().collect(groupingBy(AssetBase::getManufacturerId)); + assetsAsBuiltBPNMap + .entrySet() + .stream() + .map(it -> createInvestigation(applicationBPN, description, targetDate, severity, it)) + .forEach(notification::addNotification); + assetAsBuiltService.setAssetsInvestigationStatus(notification); + return notification; + } else { + Map> assetsAsPlannedBPNMap = assetAsPlannedRepository.getAssetsById(assetIds).stream().collect(groupingBy(AssetBase::getManufacturerId)); + + assetsAsPlannedBPNMap + .entrySet() + .stream() + .map(it -> createInvestigation(applicationBPN, description, targetDate, severity, it)) + .forEach(notification::addNotification); + assetAsPlannedService.setAssetsInvestigationStatus(notification); + return notification; + } - assetsByBPN - .entrySet() - .stream() - .map(it -> createInvestigation(applicationBPN, description, targetDate, severity, it)) - .forEach(notification::addNotification); - assetService.setAssetsInvestigationStatus(notification); - return notification; } + /** * Starts a new alert with the given BPN, asset IDs and description. * @@ -100,16 +106,25 @@ public QualityNotification startInvestigation(List assetIds, String desc * @param receiverBpn the bpn of the receiver * @return the ID of the newly created alert */ - public QualityNotification startAlert(List assetIds, String description, Instant targetDate, QualityNotificationSeverity severity, String receiverBpn) { + public QualityNotification startAlert(List assetIds, String description, Instant targetDate, QualityNotificationSeverity severity, String receiverBpn, boolean isAsBuilt) { BPN applicationBPN = traceabilityProperties.getBpn(); QualityNotification notification = QualityNotification.startNotification(clock.instant(), applicationBPN, description); + List assets = new ArrayList<>(); + if (isAsBuilt) { + assets.addAll(assetAsBuiltRepository.getAssetsById(assetIds)); + } else { + assets.addAll(assetAsPlannedRepository.getAssetsById(assetIds)); + } - List assets = assetRepository.getAssetsById(assetIds); QualityNotificationMessage qualityNotificationMessage = createAlert(applicationBPN, description, targetDate, severity, assets, receiverBpn); notification.addNotification(qualityNotificationMessage); - assetService.setAssetsAlertStatus(notification); + if (isAsBuilt) { + assetAsBuiltService.setAssetsAlertStatus(notification); + } else { + assetAsPlannedService.setAssetsAlertStatus(notification); + } return notification; } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java index 4da3cd8edb..39215b6dcf 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java @@ -106,7 +106,7 @@ void shouldReturnOwnAssets() throws JoseException { .get("/api/assets/as-built") .then() .statusCode(200) - .body("totalItems", equalTo(1)); + .body("totalItems", equalTo(2)); } @Test diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java index 17b8b54043..c201712ea8 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java @@ -77,7 +77,7 @@ void givenRequestBody_whenAlertAssets_thenResponse() { request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain(), - request.getBpn() + request.getBpn(), true )).thenReturn(notificationId); // when diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java index f177b341ef..39332b79ee 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java @@ -88,7 +88,7 @@ void testStartInvestigationSuccessful() { when(traceabilityProperties.getBpn()).thenReturn(BPN.of("bpn-123")); // When - QualityNotification result = notificationPublisherService.startInvestigation(Arrays.asList("asset-1", "asset-2"), description, Instant.parse("2022-03-01T12:00:00Z"), QualityNotificationSeverity.MINOR); + QualityNotification result = notificationPublisherService.startInvestigation(Arrays.asList("asset-1", "asset-2"), description, Instant.parse("2022-03-01T12:00:00Z"), QualityNotificationSeverity.MINOR, true); // Then assertThat(result.getNotificationStatus()).isEqualTo(QualityNotificationStatus.CREATED); @@ -108,7 +108,7 @@ void testStartAlertSuccessful() { when(assetRepository.getAssetsById(Arrays.asList("asset-1", "asset-2"))).thenReturn(List.of(AssetTestDataFactory.createAssetTestData())); // When - QualityNotification result = notificationPublisherService.startAlert(Arrays.asList("asset-1", "asset-2"), description, Instant.parse("2022-03-01T12:00:00Z"), QualityNotificationSeverity.MINOR, receiverBPN); + QualityNotification result = notificationPublisherService.startAlert(Arrays.asList("asset-1", "asset-2"), description, Instant.parse("2022-03-01T12:00:00Z"), QualityNotificationSeverity.MINOR, receiverBPN, true); // Then assertThat(result.getNotificationStatus()).isEqualTo(QualityNotificationStatus.CREATED); From c47938b7ced95bbed13b6a7b8504cbce526f5d35 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 16:39:04 +0200 Subject: [PATCH 18/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../application/alert/rest/AlertControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java index c201712ea8..33df970d9c 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java @@ -77,7 +77,7 @@ void givenRequestBody_whenAlertAssets_thenResponse() { request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain(), - request.getBpn(), true + request.getBpn(), request.isAsBuilt() )).thenReturn(notificationId); // when From b95ee8fc318649ee7f4ccef5c74dcd54fc2afb52 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 16:50:28 +0200 Subject: [PATCH 19/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../tractusx/traceability/common/config/AssetsAsyncConfig.java | 2 +- .../integration/assets/AssetAsBuiltControllerSyncIT.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java index 11281a11b8..75aeb21fae 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java @@ -29,7 +29,7 @@ public class AssetsAsyncConfig { public static final String SYNCHRONIZE_ASSETS_EXECUTOR = "synchronize-assets-executor"; - public static final String LOAD_SHELL_DESCRIPTORS_EXECUTOR = "load-shell-descriptors-executor"; + public static final String LOAD_SHELL_DESCRIPTORS_EXECUTOR = "load-shell-descriptors-executor"; public static final String UPDATE_NOTIFICATION_EXECUTOR = "update-notification-executor"; @Bean(name = SYNCHRONIZE_ASSETS_EXECUTOR) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java index c7383f31ea..001549e83d 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerSyncIT.java @@ -95,7 +95,7 @@ void shouldSynchronizeAssetsUsingRetry() throws JoseException, InterruptedExcept //THEN eventually(() -> { assetsSupport.assertAssetAsBuiltSize(15); - irsApiSupport.verifyIrsApiTriggerJobCalledTimes(3); + irsApiSupport.verifyIrsApiTriggerJobCalledTimes(2); return true; }); } From 28a0c4f4ccfa83082a58c20f30352793b0b65dc9 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 16:56:34 +0200 Subject: [PATCH 20/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../integration/assets/AssetAsBuiltControllerAllIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java index 39215b6dcf..c588ded326 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsBuiltControllerAllIT.java @@ -106,7 +106,7 @@ void shouldReturnOwnAssets() throws JoseException { .get("/api/assets/as-built") .then() .statusCode(200) - .body("totalItems", equalTo(2)); + .body("totalItems", equalTo(1)); } @Test @@ -173,7 +173,7 @@ void shouldGetPageOfAssets() throws JoseException { .get("/api/assets/as-built") .then() .statusCode(200) - .body("page", Matchers.is(1)) + .body("page", Matchers.is(2)) .body("pageSize", Matchers.is(2)); } From ca5e5794524e28b0cbe764cb1649e7972da92b76 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Fri, 25 Aug 2023 20:27:44 +0200 Subject: [PATCH 21/46] feature: TRACEFOSS-1730 preperation for new api assetAsPlanned --- .../application/asbuilt/rest/AssetAsBuiltController.java | 7 +++++-- .../asplanned/rest/AssetAsPlannedController.java | 7 +++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java index 2da6b12208..250ab20b24 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asbuilt/rest/AssetAsBuiltController.java @@ -59,11 +59,14 @@ @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Assets") @RequestMapping(path = "/assets/as-built", produces = "application/json", consumes = "application/json") -@RequiredArgsConstructor public class AssetAsBuiltController { - @Qualifier("assetAsBuiltServiceImpl") + private final AssetBaseService assetBaseService; + public AssetAsBuiltController(@Qualifier("assetAsBuiltServiceImpl") AssetBaseService assetService) { + this.assetBaseService = assetService; + } + @Operation(operationId = "sync", summary = "Synchronizes assets from IRS", tags = {"Assets"}, diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java index a84d7ae6cc..0a685e553c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/asplanned/rest/AssetAsPlannedController.java @@ -52,13 +52,12 @@ @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Assets") @RequestMapping(path = "/assets/as-planned", produces = "application/json", consumes = "application/json") -@RequiredArgsConstructor public class AssetAsPlannedController { - - @Qualifier("assetAsPlannedServiceImpl") private final AssetBaseService assetService; - + public AssetAsPlannedController(@Qualifier("assetAsPlannedServiceImpl") AssetBaseService assetService) { + this.assetService = assetService; + } @Operation(operationId = "sync", summary = "Synchronizes assets from IRS", tags = {"Assets"}, From dbc88233b563ce7fc26a3381bb45d9b57811d612 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 28 Aug 2023 13:25:42 +0200 Subject: [PATCH 22/46] feature: TRACEFOSS-1735 add optional receiver bpn parameter to investigations endpoint --- .../rest/InvestigationsController.java | 7 ++++++- .../investigation/service/InvestigationService.java | 2 +- .../request/StartQualityNotificationRequest.java | 2 ++ .../service/InvestigationServiceImpl.java | 5 +++-- .../service/NotificationPublisherService.java | 13 +++++++------ .../service/NotificationPublisherServiceTest.java | 5 +++-- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java index d89e9f63dc..840f981f00 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java @@ -121,7 +121,12 @@ public class InvestigationsController { public QualityNotificationIdResponse investigateAssets(@RequestBody @Valid StartQualityNotificationRequest request) { log.info(API_LOG_START + " with params: {}", request); return new QualityNotificationIdResponse(investigationService.start( - request.getPartIds(), request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain()).value()); + request.getPartIds(), + request.getDescription(), + request.getTargetDate(), + request.getSeverity().toDomain(), + request.getBpn()) + .value()); } @Operation(operationId = "getCreatedInvestigations", diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java index c4296a503a..e8263d6c95 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java @@ -26,6 +26,6 @@ import java.util.List; public interface InvestigationService extends QualityNotificationService { - QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity); + QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String receiverBpn); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java index 53f2509304..ba0ab1b3ee 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java @@ -50,4 +50,6 @@ public class StartQualityNotificationRequest { @NotNull @ApiModelProperty(example = "MINOR") private QualityNotificationSeverityRequest severity; + @ApiModelProperty(example = "BPN00001123123AS") + private String ReceiverBpn; } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java index 7d7933fdb4..074d61174c 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java @@ -53,8 +53,9 @@ public class InvestigationServiceImpl implements InvestigationService { @Override - public QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity) { - QualityNotification notification = notificationPublisherService.startInvestigation(partIds, description, targetDate, severity); + public QualityNotificationId start(List partIds, String description, Instant targetDate, + QualityNotificationSeverity severity, String receiverBpn) { + QualityNotification notification = notificationPublisherService.startInvestigation(partIds, description, targetDate, severity, receiverBpn); QualityNotificationId createdInvestigationId = investigationsRepository.saveQualityNotificationEntity(notification); log.info("Start Investigation {}", notification); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index 2c7d2038ce..fb23874d40 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -22,11 +22,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; @@ -74,7 +75,7 @@ public class NotificationPublisherService { * @param severity the severity of the investigation * @return the ID of the newly created investigation */ - public QualityNotification startInvestigation(List assetIds, String description, Instant targetDate, QualityNotificationSeverity severity) { + public QualityNotification startInvestigation(List assetIds, String description, Instant targetDate, QualityNotificationSeverity severity, String receiverBpn) { BPN applicationBPN = traceabilityProperties.getBpn(); QualityNotification notification = QualityNotification.startNotification(clock.instant(), applicationBPN, description); @@ -83,7 +84,7 @@ public QualityNotification startInvestigation(List assetIds, String desc assetsByBPN .entrySet() .stream() - .map(it -> createInvestigation(applicationBPN, description, targetDate, severity, it)) + .map(it -> createInvestigation(applicationBPN, receiverBpn, description, targetDate, severity, it)) .forEach(notification::addNotification); assetService.setAssetsInvestigationStatus(notification); @@ -113,7 +114,7 @@ public QualityNotification startAlert(List assetIds, String description, return notification; } - private QualityNotificationMessage createInvestigation(BPN applicationBpn, String description, Instant targetDate, QualityNotificationSeverity severity, Map.Entry> asset) { + private QualityNotificationMessage createInvestigation(BPN applicationBpn, String receiverBpn, String description, Instant targetDate, QualityNotificationSeverity severity, Map.Entry> asset) { final String notificationId = UUID.randomUUID().toString(); final String messageId = UUID.randomUUID().toString(); return QualityNotificationMessage.builder() @@ -121,7 +122,7 @@ private QualityNotificationMessage createInvestigation(BPN applicationBpn, Strin .created(LocalDateTime.now()) .senderBpnNumber(applicationBpn.value()) .senderManufacturerName(getManufacturerName(applicationBpn.value())) - .receiverBpnNumber(asset.getKey()) + .receiverBpnNumber(Strings.isBlank(receiverBpn) ? asset.getKey() : receiverBpn) .receiverManufacturerName(getManufacturerName(asset.getKey())) .description(description) .notificationStatus(QualityNotificationStatus.CREATED) diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java index bd542fb353..3e21d326de 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java @@ -20,8 +20,8 @@ package org.eclipse.tractusx.traceability.qualitynotification.domain.service; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; -import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; +import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.repository.InvestigationRepository; @@ -86,9 +86,10 @@ void testStartInvestigationSuccessful() { when(assetRepository.getAssetsById(Arrays.asList("asset-1", "asset-2"))).thenReturn(List.of(AssetTestDataFactory.createAssetTestData())); when(bpnRepository.findManufacturerName(anyString())).thenReturn(Optional.empty()); when(traceabilityProperties.getBpn()).thenReturn(BPN.of("bpn-123")); + String receiverBpn = "someReceiverBpn"; // When - QualityNotification result = notificationPublisherService.startInvestigation(Arrays.asList("asset-1", "asset-2"), description, Instant.parse("2022-03-01T12:00:00Z"), QualityNotificationSeverity.MINOR); + QualityNotification result = notificationPublisherService.startInvestigation(Arrays.asList("asset-1", "asset-2"), description, Instant.parse("2022-03-01T12:00:00Z"), QualityNotificationSeverity.MINOR, receiverBpn); // Then assertThat(result.getNotificationStatus()).isEqualTo(QualityNotificationStatus.CREATED); From 15367933911cbb8705c75c79521f8dd5c70cbb37 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 28 Aug 2023 13:26:30 +0200 Subject: [PATCH 23/46] feature: TRACEFOSS-1735 update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1eb443b75..52cbcff647 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - ErrorMessage field to investigation and alerts - Cucumber tests for quality investigations - Refactored asset structure to allow new API for assets-as-planned +- Optional parameter "receiverBpn" to /investigations endpoint ### Changed From b87e6872d02b1419743e710de945beb5c4e737b3 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 28 Aug 2023 13:36:26 +0200 Subject: [PATCH 24/46] feature: TRACEFOSS-1735 fix typo --- .../investigation/rest/InvestigationsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java index 840f981f00..81b9bba1f4 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java @@ -125,7 +125,7 @@ public QualityNotificationIdResponse investigateAssets(@RequestBody @Valid Start request.getDescription(), request.getTargetDate(), request.getSeverity().toDomain(), - request.getBpn()) + request.getReceiverBpn()) .value()); } From 204c1347d1415d6d03dd055eaccdee7295c578ef Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 28 Aug 2023 14:20:34 +0200 Subject: [PATCH 25/46] feature: TRACEFOSS-1735 fix typo --- .../application/request/StartQualityNotificationRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java index ba0ab1b3ee..15c2859abf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/request/StartQualityNotificationRequest.java @@ -51,5 +51,5 @@ public class StartQualityNotificationRequest { @ApiModelProperty(example = "MINOR") private QualityNotificationSeverityRequest severity; @ApiModelProperty(example = "BPN00001123123AS") - private String ReceiverBpn; + private String receiverBpn; } From c2527971ce1f4e971c61633d51b301c907de18f8 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Mon, 28 Aug 2023 14:24:39 +0200 Subject: [PATCH 26/46] feature: TRACEFOSS-1735 refactor --- .../domain/service/NotificationPublisherService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index fb23874d40..eada0b10fa 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -22,11 +22,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.util.Strings; +import org.eclipse.jetty.util.StringUtil; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; -import org.eclipse.tractusx.traceability.assets.domain.asplanned.repository.AssetAsPlannedRepository; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; @@ -60,7 +59,6 @@ public class NotificationPublisherService { private final TraceabilityProperties traceabilityProperties; private final EdcNotificationService edcNotificationService; private final AssetAsBuiltRepository assetRepository; - private final AssetAsPlannedRepository assetAsPlannedRepository; private final AssetServiceImpl assetService; private final BpnRepository bpnRepository; private final Clock clock; @@ -122,7 +120,7 @@ private QualityNotificationMessage createInvestigation(BPN applicationBpn, Strin .created(LocalDateTime.now()) .senderBpnNumber(applicationBpn.value()) .senderManufacturerName(getManufacturerName(applicationBpn.value())) - .receiverBpnNumber(Strings.isBlank(receiverBpn) ? asset.getKey() : receiverBpn) + .receiverBpnNumber(StringUtil.isBlank(receiverBpn) ? asset.getKey() : receiverBpn) .receiverManufacturerName(getManufacturerName(asset.getKey())) .description(description) .notificationStatus(QualityNotificationStatus.CREATED) @@ -249,7 +247,7 @@ private List getAllLatestNotificationForEdcNotificat notificationGroup.add(notificationMessage); } else { Optional latestNotification = notificationGroup.stream().max(Comparator.comparing(QualityNotificationMessage::getCreated)); - if (latestNotification.isEmpty() || notificationMessage.getCreated().isAfter(latestNotification.get().getCreated())) { + if (notificationMessage.getCreated().isAfter(latestNotification.get().getCreated())) { notificationGroup.clear(); notificationGroup.add(notificationMessage); } else if (notificationMessage.getCreated().isEqual(latestNotification.get().getCreated())) { From c9efe50cbb6665d2d8a2cac8753e447791e486be Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Mon, 28 Aug 2023 14:38:36 +0200 Subject: [PATCH 27/46] feature: TRACEFOSS-1735 added stringutils --- .../domain/service/NotificationPublisherService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index eada0b10fa..a6da5084d9 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -22,7 +22,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.util.StringUtil; +import org.apache.commons.lang3.StringUtils; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.model.Asset; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; @@ -120,7 +120,7 @@ private QualityNotificationMessage createInvestigation(BPN applicationBpn, Strin .created(LocalDateTime.now()) .senderBpnNumber(applicationBpn.value()) .senderManufacturerName(getManufacturerName(applicationBpn.value())) - .receiverBpnNumber(StringUtil.isBlank(receiverBpn) ? asset.getKey() : receiverBpn) + .receiverBpnNumber(StringUtils.isBlank(receiverBpn) ? asset.getKey() : receiverBpn) .receiverManufacturerName(getManufacturerName(asset.getKey())) .description(description) .notificationStatus(QualityNotificationStatus.CREATED) From 512f8c6fb2ee57cddc993511d9d90e667de7a7eb Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Mon, 28 Aug 2023 15:38:40 +0200 Subject: [PATCH 28/46] feature: TRACEFOSS-1730 added response mapper for detailaspectmodel --- .../aspect/PartSiteInformationAsPlanned.java | 34 ++++++++++++++++++ .../assets/domain/base/model/AssetBase.java | 2 ++ .../base/model/aspect/DetailAspectData.java | 22 ++++++++++++ .../base/model/aspect/DetailAspectModel.java | 33 +++++++++++++++++ .../base/model/aspect/DetailAspectType.java | 35 +++++++++++++++++++ .../semanticdatamodel/SemanticDataModel.java | 20 +++++++++++ 6 files changed, 146 insertions(+) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/model/aspect/PartSiteInformationAsPlanned.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectData.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectModel.java create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectType.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/model/aspect/PartSiteInformationAsPlanned.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/model/aspect/PartSiteInformationAsPlanned.java new file mode 100644 index 0000000000..0b42953d46 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/asplanned/model/aspect/PartSiteInformationAsPlanned.java @@ -0,0 +1,34 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.domain.asplanned.model.aspect; + +import lombok.Builder; +import lombok.Getter; +import org.eclipse.tractusx.traceability.assets.domain.base.model.aspect.DetailAspectData; + +import java.util.Date; + +@Builder +@Getter +public class PartSiteInformationAsPlanned implements DetailAspectData { + private Date functionValidUntil; + private String function; + private Date functionValidFrom; + private String catenaXSiteId; +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java index bec7b86d46..98987c67a7 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/AssetBase.java @@ -26,6 +26,7 @@ import lombok.Data; import lombok.Singular; import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.domain.base.model.aspect.DetailAspectModel; import java.util.List; @@ -51,4 +52,5 @@ public class AssetBase { private String van; private SemanticDataModel semanticDataModel; private String classification; + private List detailAspectModels; } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectData.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectData.java new file mode 100644 index 0000000000..9f0c675cee --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectData.java @@ -0,0 +1,22 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.domain.base.model.aspect; + +public interface DetailAspectData { +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectModel.java new file mode 100644 index 0000000000..cb2fca5d97 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectModel.java @@ -0,0 +1,33 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.domain.base.model.aspect; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class DetailAspectModel { + + private DetailAspectType type; + private DetailAspectData data; + +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectType.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectType.java new file mode 100644 index 0000000000..1a306c4d9f --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/aspect/DetailAspectType.java @@ -0,0 +1,35 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.assets.domain.base.model.aspect; + +public enum DetailAspectType { + /* Detail aspect of as built assets */ + TRACTION_BATTERY_CODE, + /* Downward relation of as planned assets */ + SINGLE_LEVEL_BOM_AS_BUILT, + + /* Upward relation of as planned assets */ + SINGLE_LEVEL_USAGE_AS_BUILT, + + /* Downward relation of as planned assets */ + SINGLE_LEVEL_BOM_AS_PLANNED, + /* Detail aspect of as planned assets */ + PART_SITE_INFORMATION_AS_PLANNED, + +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java index 0c7487811e..aa25e34543 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java @@ -25,7 +25,10 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.traceability.assets.domain.asplanned.model.aspect.PartSiteInformationAsPlanned; import org.eclipse.tractusx.traceability.assets.domain.base.model.*; +import org.eclipse.tractusx.traceability.assets.domain.base.model.aspect.DetailAspectModel; +import org.eclipse.tractusx.traceability.assets.domain.base.model.aspect.DetailAspectType; import org.springframework.util.StringUtils; import java.util.*; @@ -71,6 +74,20 @@ public Optional getLocalId(LocalIdKey key) { .map(LocalId::value); } + public List extractDetailAspectModelsAsPlanned() { + List detailAspectModels = new ArrayList<>(); + this.sites.forEach(site -> { + PartSiteInformationAsPlanned partSiteInformationAsPlanned = PartSiteInformationAsPlanned.builder() + .catenaXSiteId(site.catenaXSiteId()) + .functionValidFrom(site.functionValidFrom()) + .functionValidUntil(site.functionValidUntil()) + .build(); + detailAspectModels.add(DetailAspectModel.builder().data(partSiteInformationAsPlanned).type(DetailAspectType.PART_SITE_INFORMATION_AS_PLANNED).build()); + }); + + return detailAspectModels; + } + public Optional getLocalIdByInput(LocalIdKey key, List localIds) { return localIds.stream() .filter(localId -> localId.key() == key) @@ -120,6 +137,7 @@ public AssetBase toDomain(List localIds, Map shortIds, .qualityType(QualityType.OK) .semanticDataModel(semanticDataModel.get()) .van(van()) + .build(); } @@ -128,6 +146,7 @@ public AssetBase toDomainAsPlanned(Map shortIds, Owner owner, Ma final String[] manufacturerId = {"--"}; bpns.values().stream().filter(s -> s.equals(manufacturerName)).findFirst().ifPresent(s -> manufacturerId[0] = s); + return AssetBase.builder() .id(catenaXId()) .idShort(defaultValue(shortIds.get(catenaXId()))) @@ -142,6 +161,7 @@ public AssetBase toDomainAsPlanned(Map shortIds, Owner owner, Ma .underInvestigation(false) .qualityType(QualityType.OK) .semanticDataModel(org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel.PARTASPLANNED) + .detailAspectModels(extractDetailAspectModelsAsPlanned()) .van(van()) .build(); } From edecae9e6ce5608474106ee557e6a41ef64f1690 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Mon, 28 Aug 2023 16:05:04 +0200 Subject: [PATCH 29/46] feature: TRACEFOSS-1730 added response mapper for detailaspectmodel --- .../application/investigation/service/InvestigationService.java | 2 +- .../domain/service/NotificationPublisherService.java | 2 +- .../domain/service/NotificationPublisherServiceTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java index 35dce16256..d4da059cb7 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java @@ -26,6 +26,6 @@ import java.util.List; public interface InvestigationService extends QualityNotificationService { - QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity,String receiverBpn, boolean isAsBuilt, ); + QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity,String receiverBpn, boolean isAsBuilt); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index 7bcf1a407d..c025ed3804 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -87,7 +87,7 @@ public QualityNotification startInvestigation(List assetIds, String desc assetsAsPlannedBPNMap .entrySet() .stream() - .map(it -> createInvestigation(applicationBPN, description, targetDate, severity, it)) + .map(it -> createInvestigation(applicationBPN, receiverBpn, description, targetDate, severity, it)) .forEach(notification::addNotification); assetAsPlannedService.setAssetsInvestigationStatus(notification); return notification; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java index ca7d9da9a9..5850bb54a3 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherServiceTest.java @@ -20,8 +20,8 @@ package org.eclipse.tractusx.traceability.qualitynotification.domain.service; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.repository.AssetAsBuiltRepository; +import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.assets.domain.base.BpnRepository; -import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetServiceImpl; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.repository.InvestigationRepository; From 208c62abe6952b82c2b28a81498186ca3c9eb330 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Mon, 28 Aug 2023 16:10:25 +0200 Subject: [PATCH 30/46] feature: TRACEFOSS-1730 added response mapper for detailaspectmodel --- .../domain/service/NotificationPublisherService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index c025ed3804..0348f84de8 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -264,7 +264,7 @@ private List getAllLatestNotificationForEdcNotificat notificationGroup.add(notificationMessage); } else { Optional latestNotification = notificationGroup.stream().max(Comparator.comparing(QualityNotificationMessage::getCreated)); - if (notificationMessage.getCreated().isAfter(latestNotification.get().getCreated())) { + if (latestNotification.isEmpty() || notificationMessage.getCreated().isAfter(latestNotification.get().getCreated())) { notificationGroup.clear(); notificationGroup.add(notificationMessage); } else if (notificationMessage.getCreated().isEqual(latestNotification.get().getCreated())) { From c3d2e7714c1014d383a239d00c92adec8090c288 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Mon, 28 Aug 2023 16:37:22 +0200 Subject: [PATCH 31/46] feature: TRACEFOSS-1730 validated sites before injecting into mapper --- .../base/service/AssetBaseService.java | 18 ++++++++++++++++++ .../semanticdatamodel/SemanticDataModel.java | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java index 12ce7924bd..ffa57c2150 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java @@ -1,3 +1,21 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ package org.eclipse.tractusx.traceability.assets.application.base.service; import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java index aa25e34543..133de11679 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java @@ -74,9 +74,9 @@ public Optional getLocalId(LocalIdKey key) { .map(LocalId::value); } - public List extractDetailAspectModelsAsPlanned() { + public List extractDetailAspectModelsAsPlanned(List sites) { List detailAspectModels = new ArrayList<>(); - this.sites.forEach(site -> { + emptyIfNull(sites).forEach(site -> { PartSiteInformationAsPlanned partSiteInformationAsPlanned = PartSiteInformationAsPlanned.builder() .catenaXSiteId(site.catenaXSiteId()) .functionValidFrom(site.functionValidFrom()) @@ -161,7 +161,7 @@ public AssetBase toDomainAsPlanned(Map shortIds, Owner owner, Ma .underInvestigation(false) .qualityType(QualityType.OK) .semanticDataModel(org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticDataModel.PARTASPLANNED) - .detailAspectModels(extractDetailAspectModelsAsPlanned()) + .detailAspectModels(extractDetailAspectModelsAsPlanned(sites())) .van(van()) .build(); } From bec4d401c5fe95d5a4c2cf6acf0fbb38f02e4b58 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Mon, 28 Aug 2023 21:02:23 +0200 Subject: [PATCH 32/46] feature: TRACEFOSS-1730 validated sites before injecting into mapper --- .../domain/base/model/SemanticModel.java | 19 +- .../irs/model/response/JobDetailResponse.java | 6 +- .../model/response/relationship/Aspect.java | 5 + .../semanticdatamodel/SemanticDataModel.java | 2 +- .../data/irs_assets_as_planned_v4.json | 429 ++++++++++++++++++ .../assets/AssetAsPlannedControllerAllIT.java | 76 ++++ .../common/support/AssetTestData.java | 10 + .../common/support/AssetsSupport.java | 4 + 8 files changed, 541 insertions(+), 10 deletions(-) create mode 100644 tx-backend/src/main/resources/data/irs_assets_as_planned_v4.json create mode 100644 tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java index bc1d3d1ec8..48ce6fadfe 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/model/SemanticModel.java @@ -72,13 +72,18 @@ public static SemanticModel from(PartTypeInformation partTypeInformation, Manufa } public static SemanticModel from(PartTypeInformation partTypeInformation) { - return SemanticModel.builder() - .manufacturerPartId(defaultValue(partTypeInformation.manufacturerPartId())) - .nameAtManufacturer(defaultValue(partTypeInformation.nameAtManufacturer())) - .customerPartId(defaultValue(partTypeInformation.customerPartId())) - .nameAtCustomer(defaultValue(partTypeInformation.nameAtCustomer())) - .manufacturerPartId(defaultValue(partTypeInformation.manufacturerPartId())) - .build(); + if (partTypeInformation != null){ + return SemanticModel.builder() + .manufacturerPartId(defaultValue(partTypeInformation.manufacturerPartId())) + .nameAtManufacturer(defaultValue(partTypeInformation.nameAtManufacturer())) + .customerPartId(defaultValue(partTypeInformation.customerPartId())) + .nameAtCustomer(defaultValue(partTypeInformation.nameAtCustomer())) + .manufacturerPartId(defaultValue(partTypeInformation.manufacturerPartId())) + .build(); + } else { + return SemanticModel.builder().build(); + } + } private static String defaultValue(String value) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java index afdbeb8120..5d0bf8a55b 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java @@ -30,6 +30,7 @@ import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.request.BomLifecycle; +import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Aspect; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Relationship; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.semanticdatamodel.SemanticDataModel; @@ -156,7 +157,7 @@ private List mapToOtherPartsAsBuilt(Map shortIds, Own } private List mapToOtherPartsAsPlanned(Map shortIds, Owner owner, Map bpnMapping) { - List otherParts = semanticDataModels().stream().filter(semanticDataModel -> !isOwnPart(semanticDataModel, jobStatus)).toList(); + List otherParts = semanticDataModels().stream().filter(semanticDataModel -> !isOwnPart(semanticDataModel, jobStatus)).filter(semanticDataModel -> Aspect.isMasterAspect(semanticDataModel.getAspectType())).toList(); log.info(":: mapToOtherPartsAsPlanned()"); log.info(":: otherParts: {}", otherParts); final List assets = otherParts @@ -173,7 +174,8 @@ private List mapToOwnPartsAsPlanned(Map shortIds, Map List ownPartsAsPlanned = semanticDataModels().stream() - .filter(semanticDataModel -> isOwnPart(semanticDataModel, jobStatus)).toList(); + .filter(semanticDataModel -> isOwnPart(semanticDataModel, jobStatus)) + .filter(semanticDataModel -> Aspect.isMasterAspect(semanticDataModel.aspectType())).toList(); log.info(":: mapToOwnPartsAsPlanned()"); log.info(":: ownPartsAsPlanned: {}", ownPartsAsPlanned); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java index befa7e7fd1..770a8a00c9 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java @@ -55,4 +55,9 @@ public static List upwardAspectsForAssetsAsBuilt() { public static List downwardAspectsForAssetsAsPlanned() { return List.of(PART_AS_PLANNED.getAspectName(), PART_SITE_INFORMATION_AS_PLANNED.getAspectName()); } + + + public static boolean isMasterAspect(String aspect) { + return Aspect.PART_AS_PLANNED.getAspectName().contains(aspect) || Aspect.SERIAL_PART.getAspectName().contains(aspect) || Aspect.BATCH.getAspectName().contains(aspect) || Aspect.JUST_IN_SEQUENCE_PART.getAspectName().contains(aspect); + } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java index 133de11679..a05840000f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java @@ -74,7 +74,7 @@ public Optional getLocalId(LocalIdKey key) { .map(LocalId::value); } - public List extractDetailAspectModelsAsPlanned(List sites) { + private List extractDetailAspectModelsAsPlanned(List sites) { List detailAspectModels = new ArrayList<>(); emptyIfNull(sites).forEach(site -> { PartSiteInformationAsPlanned partSiteInformationAsPlanned = PartSiteInformationAsPlanned.builder() diff --git a/tx-backend/src/main/resources/data/irs_assets_as_planned_v4.json b/tx-backend/src/main/resources/data/irs_assets_as_planned_v4.json new file mode 100644 index 0000000000..3f1f7200b6 --- /dev/null +++ b/tx-backend/src/main/resources/data/irs_assets_as_planned_v4.json @@ -0,0 +1,429 @@ +{ + "job": { + "id": "895871b4-238b-4839-8dda-537e18c058d9", + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "state": "COMPLETED", + "exception": null, + "createdOn": "2023-07-21T08:38:53.551699292Z", + "startedOn": "2023-07-21T08:38:53.551856296Z", + "lastModifiedOn": "2023-07-21T08:41:29.077474138Z", + "completedOn": "2023-07-21T08:41:29.077476638Z", + "owner": "sa-cl6-cx-10", + "summary": { + "asyncFetchedItems": { + "running": 0, + "completed": 3, + "failed": 0 + }, + "bpnLookups": { + "completed": 0, + "failed": 0 + } + }, + "parameter": { + "bomLifecycle": "asPlanned", + "aspects": [ + "PartAsPlanned", + "PartSiteInformationAsPlanned" + ], + "depth": 2, + "bpn": "BPNL00000003CML1", + "direction": "downward", + "collectAspects": true, + "lookupBPNs": false, + "callbackUrl": null + } + }, + "relationships": [ + { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "linkedItem": { + "quantity": { + "quantityNumber": 1.0, + "measurementUnit": { + "datatypeURI": null, + "lexicalValue": "unit:piece" + } + }, + "lifecycleContext": "asPlanned", + "assembledOn": "2022-02-03T14:48:54.709Z", + "lastModifiedOn": "2022-02-03T14:48:54.709Z", + "childCatenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01" + }, + "aspectType": "SingleLevelBomAsPlanned" + }, + { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "linkedItem": { + "quantity": { + "quantityNumber": 1.0, + "measurementUnit": { + "datatypeURI": null, + "lexicalValue": "unit:piece" + } + }, + "lifecycleContext": "asPlanned", + "assembledOn": "2022-02-03T14:48:54.709Z", + "lastModifiedOn": "2022-02-03T14:48:54.709Z", + "childCatenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01" + }, + "aspectType": "SingleLevelBomAsPlanned" + } + ], + "shells": [ + { + "administration": null, + "description": [], + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "idShort": "VehicleModelA", + "id": "urn:uuid:4338d397-8811-4a41-a5ea-7cd7bb2f9014", + "specificAssetIds": [ + { + "name": "manufacturerPartId", + "subjectId": null, + "value": "ZX-55", + "semanticId": null + }, + { + "name": "manufacturerId", + "subjectId": null, + "value": "BPNL00000003CML1", + "semanticId": null + } + ], + "submodelDescriptors": [ + { + "administration": null, + "description": [], + "idShort": "PartAsPlanned", + "id": "urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + }, + { + "administration": null, + "description": [], + "idShort": "PartSiteInformationAsPlanned", + "id": "urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + } + ] + }, + { + "administration": null, + "description": [], + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "idShort": "VehicleModelB", + "id": "urn:uuid:e20655b1-6711-4f88-a90f-72c092d434b0", + "specificAssetIds": [ + { + "name": "manufacturerPartId", + "subjectId": null, + "value": "ZX-55", + "semanticId": null + }, + { + "name": "manufacturerId", + "subjectId": null, + "value": "BPNL00000003CNKC", + "semanticId": null + } + ], + "submodelDescriptors": [ + { + "administration": null, + "description": [], + "idShort": "PartAsPlanned", + "id": "urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-test-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01/submodels/urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01-urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951;dspEndpoint=https://trace-x-test-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + }, + { + "administration": null, + "description": [], + "idShort": "PartSiteInformationAsPlanned", + "id": "urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-test-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01/submodels/urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01-urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b;dspEndpoint=https://trace-x-test-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + } + ] + }, + { + "administration": null, + "description": [], + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "idShort": "VehicleModelA", + "id": "urn:uuid:4338d397-8811-4a41-a5ea-7cd7bb2f9014", + "specificAssetIds": [ + { + "name": "manufacturerPartId", + "subjectId": null, + "value": "ZX-55", + "semanticId": null + }, + { + "name": "manufacturerId", + "subjectId": null, + "value": "BPNL00000003CML1", + "semanticId": null + } + ], + "submodelDescriptors": [ + { + "administration": null, + "description": [], + "idShort": "PartAsPlanned", + "id": "urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + }, + { + "administration": null, + "description": [], + "idShort": "PartSiteInformationAsPlanned", + "id": "urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + }, + { + "administration": null, + "description": [], + "idShort": "SingleLevelBomAsPlanned", + "id": "urn:uuid:3d9d966b-27e1-4512-be13-2715ae623ab1", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.single_level_bom_as_planned:2.0.0#SingleLevelBomAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:3d9d966b-27e1-4512-be13-2715ae623ab1/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:3d9d966b-27e1-4512-be13-2715ae623ab1;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + } + ] + } + ], + "tombstones": [], + "submodels": [ + { + "identification": "urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8", + "aspectType": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "payload": { + "validityPeriod": { + "validFrom": "2019-04-04T03:19:03.000Z", + "validTo": "2024-12-29T10:25:12.000Z" + }, + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "partTypeInformation": { + "manufacturerPartId": "ZX-55", + "classification": "product", + "nameAtManufacturer": "Vehicle Model A" + } + } + }, + { + "identification": "urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a", + "aspectType": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "payload": { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "sites": [ + { + "functionValidUntil": "2025-02-08T04:30:48.000Z", + "function": "production", + "functionValidFrom": "2019-08-21T02:10:36.000Z", + "catenaXSiteId": "BPNS000004711DMY" + } + ] + } + }, + { + "identification": "urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951", + "aspectType": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "payload": { + "validityPeriod": { + "validFrom": "2019-04-04T03:19:03.000Z", + "validTo": "2024-12-29T10:25:12.000Z" + }, + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "partTypeInformation": { + "manufacturerPartId": "ZX-55", + "classification": "product", + "nameAtManufacturer": "Vehicle Model B" + } + } + }, + { + "identification": "urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b", + "aspectType": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "payload": { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "sites": [ + { + "functionValidUntil": "2025-02-08T04:30:48.000Z", + "function": "production", + "functionValidFrom": "2019-08-21T02:10:36.000Z", + "catenaXSiteId": "BPNS000004711DMY" + } + ] + } + } + ], + "bpns": [ + { + "manufacturerId": "BPNL00000003CML1", + "manufacturerName": null + }, + { + "manufacturerId": "BPNL00000003CNKC", + "manufacturerName": null + } + ] +} diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java new file mode 100644 index 0000000000..c368dfb98a --- /dev/null +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java @@ -0,0 +1,76 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.integration.assets; + + +import io.restassured.http.ContentType; +import org.eclipse.tractusx.traceability.integration.IntegrationTestSpecification; +import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; +import org.eclipse.tractusx.traceability.integration.common.support.BpnSupport; +import org.hamcrest.Matchers; +import org.jose4j.lang.JoseException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.stream.Stream; + +import static io.restassured.RestAssured.given; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class AssetAsPlannedControllerAllIT extends IntegrationTestSpecification { + + @Autowired + BpnSupport bpnSupport; + + @Autowired + AssetsSupport assetsSupport; + + private static Stream owners() { + return Stream.of( + arguments("OWN", 1), + arguments("CUSTOMER", 0), + arguments("SUPPLIER", 12), + arguments("UNKNOWN", 0)); + } + + @Test + void shouldReturnAssetsWithManufacturerName() throws JoseException { + //GIVEN + bpnSupport.cachedBpnsForDefaultAssets(); + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .log().all() + .when() + .get("/api/assets/as-planned") + .then() + .log().all() + .statusCode(200) + .body("content.manufacturerName", everyItem(not(equalTo(assetsSupport.emptyText())))); + } + +} diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java index 5a2813cd52..3baecf6051 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetTestData.java @@ -43,4 +43,14 @@ List readAndConvertAssetsForTests() { return Collections.emptyList(); } } + + List readAndConvertAssetsAsPlannedForTests() { + try { + InputStream file = AssetTestData.class.getResourceAsStream("/data/irs_assets_as_planned_v4.json"); + JobDetailResponse response = mapper.readValue(file, JobDetailResponse.class); + return response.convertAssets(); + } catch (IOException e) { + return Collections.emptyList(); + } + } } 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 2aed18f7a4..d8b5b2394c 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 @@ -50,6 +50,10 @@ public void defaultAssetsStored() { assetRepositoryProvider.assetAsBuiltRepository().saveAll(assetRepositoryProvider.assetsConverter().readAndConvertAssetsForTests()); } + public void defaultAssetsAsPlannedStored() { + assetRepositoryProvider.assetAsPlannedRepository().saveAll(assetRepositoryProvider.assetsConverter().readAndConvertAssetsAsPlannedForTests()); + } + public void defaultAssetsStoredWithOnGoingInvestigation(QualityNotificationStatusBaseEntity investigationStatus, boolean inInvestigation) { List assetEntities = assetRepositoryProvider.assetsConverter().readAndConvertAssetsForTests().stream().map(asset -> { AssetAsBuiltEntity assetEntity = AssetAsBuiltEntity.from(asset); From 60b07c8320c4066e143d1851bf0aa72b78679ea8 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Tue, 29 Aug 2023 10:16:29 +0200 Subject: [PATCH 33/46] feature: TRACEFOSS-1730 add TODO; reformat --- .../common/config/AssetsAsyncConfig.java | 58 +++++++++---------- .../alert/rest/AlertController.java | 1 + .../service/NotificationPublisherService.java | 15 ++++- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java index 75aeb21fae..6cda52de84 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/AssetsAsyncConfig.java @@ -28,38 +28,38 @@ @Configuration public class AssetsAsyncConfig { - public static final String SYNCHRONIZE_ASSETS_EXECUTOR = "synchronize-assets-executor"; - public static final String LOAD_SHELL_DESCRIPTORS_EXECUTOR = "load-shell-descriptors-executor"; - public static final String UPDATE_NOTIFICATION_EXECUTOR = "update-notification-executor"; + public static final String SYNCHRONIZE_ASSETS_EXECUTOR = "synchronize-assets-executor"; + public static final String LOAD_SHELL_DESCRIPTORS_EXECUTOR = "load-shell-descriptors-executor"; + public static final String UPDATE_NOTIFICATION_EXECUTOR = "update-notification-executor"; - @Bean(name = SYNCHRONIZE_ASSETS_EXECUTOR) - public ThreadPoolTaskExecutor synchronizeAssetsExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(10); - executor.setMaxPoolSize(100); - executor.setThreadNamePrefix("%s-".formatted(SYNCHRONIZE_ASSETS_EXECUTOR)); - return executor; - } + @Bean(name = SYNCHRONIZE_ASSETS_EXECUTOR) + public ThreadPoolTaskExecutor synchronizeAssetsExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); + executor.setMaxPoolSize(100); + executor.setThreadNamePrefix("%s-".formatted(SYNCHRONIZE_ASSETS_EXECUTOR)); + return executor; + } - @Bean(name = LOAD_SHELL_DESCRIPTORS_EXECUTOR) - public ThreadPoolTaskExecutor loadShellDescriptorsExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(10); - executor.setMaxPoolSize(100); - executor.setQueueCapacity(50); - executor.setThreadNamePrefix("%s-".formatted(LOAD_SHELL_DESCRIPTORS_EXECUTOR)); + @Bean(name = LOAD_SHELL_DESCRIPTORS_EXECUTOR) + public ThreadPoolTaskExecutor loadShellDescriptorsExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); + executor.setMaxPoolSize(100); + executor.setQueueCapacity(50); + executor.setThreadNamePrefix("%s-".formatted(LOAD_SHELL_DESCRIPTORS_EXECUTOR)); - return executor; - } + return executor; + } - @Bean(name = UPDATE_NOTIFICATION_EXECUTOR) - public ThreadPoolTaskExecutor updateNotificationExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(10); - executor.setMaxPoolSize(100); - executor.setQueueCapacity(50); - executor.setThreadNamePrefix("%s-".formatted(UPDATE_NOTIFICATION_EXECUTOR)); + @Bean(name = UPDATE_NOTIFICATION_EXECUTOR) + public ThreadPoolTaskExecutor updateNotificationExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); + executor.setMaxPoolSize(100); + executor.setQueueCapacity(50); + executor.setThreadNamePrefix("%s-".formatted(UPDATE_NOTIFICATION_EXECUTOR)); - return executor; - } + return executor; + } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java index 9219489502..4dae506090 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java @@ -123,6 +123,7 @@ public class AlertController { @ResponseStatus(HttpStatus.CREATED) public QualityNotificationIdResponse alertAssets(@RequestBody @Valid StartQualityAlertRequest request) { log.info(API_LOG_START + " with params: {}", request); + //TODO refactor this method to only take request as parameter return new QualityNotificationIdResponse(alertService.start( request.getPartIds(), request.getDescription(), diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java index 0348f84de8..3003827fec 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/service/NotificationPublisherService.java @@ -31,14 +31,25 @@ import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; import org.eclipse.tractusx.traceability.common.model.BPN; import org.eclipse.tractusx.traceability.common.properties.TraceabilityProperties; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.*; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationAffectedPart; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationMessage; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSeverity; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSide; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.exception.QualityNotificationIllegalUpdate; import org.springframework.stereotype.Service; import java.time.Clock; import java.time.Instant; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import static java.util.stream.Collectors.groupingBy; From 5a95798740596ca4bab5e8a2acac3a8f95ad209d Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Tue, 29 Aug 2023 10:32:19 +0200 Subject: [PATCH 34/46] feature: TRACEFOSS-1730 reformat; refactor --- .../irs/model/response/JobDetailResponse.java | 7 +++++-- .../semanticdatamodel/SemanticDataModel.java | 18 +++++++++++------- .../service/AssetAsPlannedServiceImplTest.java | 6 +++--- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java index 5d0bf8a55b..6af6ed9691 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/JobDetailResponse.java @@ -34,7 +34,11 @@ import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.relationship.Relationship; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.model.response.semanticdatamodel.SemanticDataModel; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -184,7 +188,6 @@ private List mapToOwnPartsAsPlanned(Map shortIds, Map .filter(relationship -> SINGLE_LEVEL_BOM_AS_PLANNED.equals(relationship.aspectType().getAspectName())) .collect(Collectors.groupingBy(Relationship::catenaXId, Collectors.toList())); - final List assets = ownPartsAsPlanned .stream() .map(semanticDataModel -> semanticDataModel.toDomainAsPlanned(shortIds, Owner.OWN, bpnMapping, diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java index a05840000f..f0d1d2e041 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java @@ -26,12 +26,21 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.domain.asplanned.model.aspect.PartSiteInformationAsPlanned; -import org.eclipse.tractusx.traceability.assets.domain.base.model.*; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Descriptions; +import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.domain.base.model.QualityType; +import org.eclipse.tractusx.traceability.assets.domain.base.model.SemanticModel; import org.eclipse.tractusx.traceability.assets.domain.base.model.aspect.DetailAspectModel; import org.eclipse.tractusx.traceability.assets.domain.base.model.aspect.DetailAspectType; import org.springframework.util.StringUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import static org.apache.commons.collections4.ListUtils.emptyIfNull; @@ -137,7 +146,6 @@ public AssetBase toDomain(List localIds, Map shortIds, .qualityType(QualityType.OK) .semanticDataModel(semanticDataModel.get()) .van(van()) - .build(); } @@ -146,7 +154,6 @@ public AssetBase toDomainAsPlanned(Map shortIds, Owner owner, Ma final String[] manufacturerId = {"--"}; bpns.values().stream().filter(s -> s.equals(manufacturerName)).findFirst().ifPresent(s -> manufacturerId[0] = s); - return AssetBase.builder() .id(catenaXId()) .idShort(defaultValue(shortIds.get(catenaXId()))) @@ -171,7 +178,6 @@ private String manufacturerId() { .orElse("--"); } - private String defaultValue(String value) { final String EMPTY_TEXT = "--"; if (!StringUtils.hasText(value)) { @@ -249,6 +255,4 @@ public boolean isAsBuilt() { return !aspectType.contains("AsPlanned"); } - } - diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java index f65d86c56b..046cf7e75a 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/domain/service/AssetAsPlannedServiceImplTest.java @@ -38,7 +38,9 @@ import java.util.List; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class AssetAsPlannedServiceImplTest { @@ -55,11 +57,9 @@ class AssetAsPlannedServiceImplTest { @Test void synchronizeAssets_shouldSaveCombinedAssets_whenNoException() { // given - List parentDescriptionsList = AssetTestDataFactory.provideParentRelations(); List childDescriptionList = AssetTestDataFactory.provideChildRelations(); String globalAssetId = "123"; List downwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(Collections.emptyList(), childDescriptionList)); - List upwardAssets = List.of(AssetTestDataFactory.createAssetTestDataWithRelations(parentDescriptionsList, Collections.emptyList())); when(irsRepository.findAssets(globalAssetId, Direction.DOWNWARD, Aspect.downwardAspectsForAssetsAsPlanned(), BomLifecycle.AS_PLANNED)) .thenReturn(downwardAssets); From 2d0c363037815ea60f7a20cb437c9a167d02d756 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 10:45:34 +0200 Subject: [PATCH 35/46] feature: TRACEFOSS-1730 validated sites before injecting into mapper --- .../alert/rest/AlertController.java | 19 ++++------ .../alert/service/AlertService.java | 31 ---------------- .../rest/InvestigationsController.java | 18 ++++----- .../service/InvestigationService.java | 31 ---------------- .../service/QualityNotificationService.java | 6 +++ .../alert/service/AlertServiceImpl.java | 6 +-- .../service/InvestigationServiceImpl.java | 6 +-- .../assets/AssetAsPlannedControllerAllIT.java | 37 +++++++++++++++++++ .../alert/rest/AlertControllerTest.java | 4 +- 9 files changed, 67 insertions(+), 91 deletions(-) delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java delete mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java index 9219489502..51f66ed962 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertController.java @@ -29,7 +29,6 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.common.config.FeatureFlags; import org.eclipse.tractusx.traceability.common.model.PageResult; @@ -37,21 +36,16 @@ import org.eclipse.tractusx.traceability.common.response.ErrorResponse; import org.eclipse.tractusx.traceability.qualitynotification.application.alert.mapper.AlertResponseMapper; import org.eclipse.tractusx.traceability.qualitynotification.application.alert.request.StartQualityAlertRequest; -import org.eclipse.tractusx.traceability.qualitynotification.application.alert.service.AlertService; import org.eclipse.tractusx.traceability.qualitynotification.application.request.CloseQualityNotificationRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.QualityNotificationStatusRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.UpdateQualityNotificationRequest; +import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import qualitynotification.alert.response.AlertResponse; import qualitynotification.base.response.QualityNotificationIdResponse; @@ -63,11 +57,14 @@ @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Alerts") @Validated -@RequiredArgsConstructor @Slf4j public class AlertController { - private final AlertService alertService; + private final QualityNotificationService alertService; + + public AlertController(@Qualifier("alertServiceImpl") QualityNotificationService alertService) { + this.alertService = alertService; + } private static final String API_LOG_START = "Received API call on /alerts"; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java deleted file mode 100644 index eb3c952a7f..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/service/AlertService.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -package org.eclipse.tractusx.traceability.qualitynotification.application.alert.service; - -import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationId; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSeverity; - -import java.time.Instant; -import java.util.List; - -public interface AlertService extends QualityNotificationService { - QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn, boolean isAsBuilt); -} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java index 0e8c5aee10..2a2814013e 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/rest/InvestigationsController.java @@ -38,22 +38,17 @@ import org.eclipse.tractusx.traceability.common.request.OwnPageable; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; import org.eclipse.tractusx.traceability.qualitynotification.application.investigation.mapper.InvestigationResponseMapper; -import org.eclipse.tractusx.traceability.qualitynotification.application.investigation.service.InvestigationService; import org.eclipse.tractusx.traceability.qualitynotification.application.request.CloseQualityNotificationRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.QualityNotificationStatusRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.StartQualityNotificationRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.UpdateQualityNotificationRequest; +import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import qualitynotification.base.response.QualityNotificationIdResponse; import qualitynotification.investigation.response.InvestigationResponse; @@ -65,11 +60,14 @@ @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "Investigations", description = "Operations on Investigation Notification") @Validated -@RequiredArgsConstructor @Slf4j public class InvestigationsController { - private final InvestigationService investigationService; + private final QualityNotificationService investigationService; + + public InvestigationsController(@Qualifier("investigationServiceImpl") QualityNotificationService investigationService) { + this.investigationService = investigationService; + } private static final String API_LOG_START = "Received API call on /investigations"; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java deleted file mode 100644 index d4da059cb7..0000000000 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/investigation/service/InvestigationService.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ -package org.eclipse.tractusx.traceability.qualitynotification.application.investigation.service; - -import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationId; -import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSeverity; - -import java.time.Instant; -import java.util.List; - -public interface InvestigationService extends QualityNotificationService { - QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity,String receiverBpn, boolean isAsBuilt); - -} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/service/QualityNotificationService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/service/QualityNotificationService.java index a0885f58f9..587ed58269 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/service/QualityNotificationService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/application/service/QualityNotificationService.java @@ -21,11 +21,17 @@ import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationId; +import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationSeverity; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationStatus; import org.springframework.data.domain.Pageable; +import java.time.Instant; +import java.util.List; + public interface QualityNotificationService { + // TODO refactor to use request object instead of all params. + QualityNotificationId start(List partIds, String description, Instant targetDate, QualityNotificationSeverity severity, String targetBpn, boolean isAsBuilt); PageResult getCreated(Pageable pageable); PageResult getReceived(Pageable pageable); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java index c4fe7efcb2..b6c565f10d 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/alert/service/AlertServiceImpl.java @@ -23,7 +23,7 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.application.alert.service.AlertService; +import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; import org.eclipse.tractusx.traceability.qualitynotification.domain.alert.model.exception.AlertNotFoundException; import org.eclipse.tractusx.traceability.qualitynotification.domain.alert.repository.AlertRepository; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; @@ -42,9 +42,9 @@ // TODO as this is duplicated with InvestigationServiceImpl it should be done like assetAsPlanned / assetAsBuilt with an abstract class / interface @Slf4j -@Service +@Service("alertServiceImpl") @RequiredArgsConstructor -public class AlertServiceImpl implements AlertService { +public class AlertServiceImpl implements QualityNotificationService { private final NotificationPublisherService notificationPublisherService; diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java index 1ff3f6be93..6dc4486227 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/qualitynotification/domain/investigation/service/InvestigationServiceImpl.java @@ -23,7 +23,7 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.domain.asbuilt.service.AssetAsBuiltServiceImpl; import org.eclipse.tractusx.traceability.common.model.PageResult; -import org.eclipse.tractusx.traceability.qualitynotification.application.investigation.service.InvestigationService; +import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.model.exception.InvestigationNotFoundException; import org.eclipse.tractusx.traceability.qualitynotification.domain.investigation.repository.InvestigationRepository; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; @@ -42,8 +42,8 @@ // TODO as this is duplicated with InvestigationServiceImpl it should be done like assetAsPlanned / assetAsBuilt with an abstract class / interface @Slf4j @RequiredArgsConstructor -@Service -public class InvestigationServiceImpl implements InvestigationService { +@Service("investigationServiceImpl") +public class InvestigationServiceImpl implements QualityNotificationService { private final NotificationPublisherService notificationPublisherService; diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java index c368dfb98a..c2d9c56513 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java @@ -73,4 +73,41 @@ void shouldReturnAssetsWithManufacturerName() throws JoseException { .body("content.manufacturerName", everyItem(not(equalTo(assetsSupport.emptyText())))); } + @ParameterizedTest + @MethodSource("owners") + void shouldReturnAssetsByOwnerFiltering(String ownerValue, int totalItemsValue) throws JoseException { + //GIVEN + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .queryParam("owner", ownerValue) + .when() + .get("/api/assets/as-planned") + .then() + .statusCode(200) + .body("totalItems", equalTo(totalItemsValue)); + } + + @Test + void shouldGetPageOfAssets() throws JoseException { + //GIVEN + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .param("page", "2") + .param("size", "2") + .when() + .get("/api/assets/as-planned") + .then() + .statusCode(200) + .body("page", Matchers.is(2)) + .body("pageSize", Matchers.is(2)); + } + } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java index 33df970d9c..c239bb65aa 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/qualitynotification/application/alert/rest/AlertControllerTest.java @@ -20,11 +20,11 @@ package org.eclipse.tractusx.traceability.qualitynotification.application.alert.rest; import org.eclipse.tractusx.traceability.qualitynotification.application.alert.request.StartQualityAlertRequest; -import org.eclipse.tractusx.traceability.qualitynotification.application.alert.service.AlertService; import org.eclipse.tractusx.traceability.qualitynotification.application.request.CloseQualityNotificationRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.QualityNotificationSeverityRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.UpdateQualityNotificationRequest; import org.eclipse.tractusx.traceability.qualitynotification.application.request.UpdateQualityNotificationStatusRequest; +import org.eclipse.tractusx.traceability.qualitynotification.application.service.QualityNotificationService; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotification; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationId; import org.eclipse.tractusx.traceability.qualitynotification.domain.model.QualityNotificationMessage; @@ -54,7 +54,7 @@ class AlertControllerTest { @Mock - private AlertService alertService; + private QualityNotificationService alertService; @InjectMocks private AlertController controller; From 2f5a5288b251012ed2d03bdfae61628ecd0ac89d Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 11:10:05 +0200 Subject: [PATCH 36/46] chore: TRACEFOSS-XXX dependency bumps --- .github/workflows/e2e-tests-xray_frontend.yml | 6 +++--- CHANGELOG.md | 5 +++++ DEPENDENCIES_BACKEND | 4 ++-- pom.xml | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/workflows/e2e-tests-xray_frontend.yml b/.github/workflows/e2e-tests-xray_frontend.yml index 291a9f4e3f..79e001a1e9 100644 --- a/.github/workflows/e2e-tests-xray_frontend.yml +++ b/.github/workflows/e2e-tests-xray_frontend.yml @@ -101,7 +101,7 @@ jobs: node-version: 18.x - name: Cypress run all tests - uses: cypress-io/github-action@v5.8.4 # use the explicit version number + uses: cypress-io/github-action@v6.0.0 # use the explicit version number with: start: npm start wait-on: "http://localhost:4200" @@ -156,7 +156,7 @@ jobs: node-version: 18.x - name: Cypress run all tests - uses: cypress-io/github-action@v5.8.4 # use the explicit version number + uses: cypress-io/github-action@v6.0.0 # use the explicit version number with: start: npm start wait-on: "http://localhost:4200" @@ -219,7 +219,7 @@ jobs: run: npx playwright install --with-deps webkit - name: Cypress run all tests - uses: cypress-io/github-action@v5.8.4 # use the explicit version number + uses: cypress-io/github-action@v6.0.0 # use the explicit version number with: start: npm start wait-on: "http://localhost:4200" diff --git a/CHANGELOG.md b/CHANGELOG.md index 52cbcff647..b2a8320be6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Readme / Docker Notice information as required in TRGs - Removed references to GitHub registry and added docker hub for tractusx instead - Removed UX breaking black status box +- Updated cypress-io/github-action from 5.8.4 to 6.0.0 +- Updated asciidoctor-maven-plugin from 2.2.3 to 2.2.4 +- Updated owasp:dependency-check from 8.3.1 to 8.4.0 +- Updated commons-io from 2.11.0 to 2.13.0 +- Updated snakeyaml from 2.0 to 2.1 ### Removed diff --git a/DEPENDENCIES_BACKEND b/DEPENDENCIES_BACKEND index 8bf119120a..e8780ef119 100644 --- a/DEPENDENCIES_BACKEND +++ b/DEPENDENCIES_BACKEND @@ -28,7 +28,7 @@ maven/mavencentral/com.squareup.okhttp3/okhttp/4.10.0, Apache-2.0 AND MPL-2.0, a maven/mavencentral/com.squareup.okio/okio-jvm/3.0.0, Apache-2.0, approved, clearlydefined maven/mavencentral/com.zaxxer/HikariCP/5.0.1, Apache-2.0, approved, clearlydefined maven/mavencentral/commons-fileupload/commons-fileupload/1.5, Apache-2.0, approved, #7109 -maven/mavencentral/commons-io/commons-io/2.11.0, Apache-2.0, approved, CQ23745 +maven/mavencentral/commons-io/commons-io/2.13.0, Apache-2.0, approved, #8717 maven/mavencentral/commons-logging/commons-logging/1.2, Apache-2.0, approved, CQ10162 maven/mavencentral/dev.failsafe/failsafe-okhttp/3.3.2, Apache-2.0, approved, #9178 maven/mavencentral/dev.failsafe/failsafe/3.3.2, Apache-2.0, approved, #9268 @@ -220,4 +220,4 @@ maven/mavencentral/org.thymeleaf/thymeleaf/3.1.1.RELEASE, Apache-2.0, approved, maven/mavencentral/org.unbescape/unbescape/1.1.6.RELEASE, Apache-2.0, approved, CQ18904 maven/mavencentral/org.webjars/swagger-ui/4.18.1, Apache-2.0, approved, #7850 maven/mavencentral/org.webjars/webjars-locator-core/0.52, MIT, approved, clearlydefined -maven/mavencentral/org.yaml/snakeyaml/2.0, Apache-2.0 AND (Apache-2.0 OR BSD-3-Clause OR EPL-1.0 OR GPL-2.0-or-later OR LGPL-2.1-or-later), approved, #7275 +maven/mavencentral/org.yaml/snakeyaml/2.1, Apache-2.0, approved, #9847 diff --git a/pom.xml b/pom.xml index 2894580ace..9696a8611f 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ SPDX-License-Identifier: Apache-2.0 org.eclipse.tractusx.traceability.TraceabilityApplication - 2.2.3 + 2.2.4 3.2.1 3.10.1 1.12.0 @@ -55,7 +55,7 @@ SPDX-License-Identifier: Apache-2.0 3.0.1 0.8.8 3.3.0 - 8.3.1 + 8.4.0 4.7.3.0 3.0.2 4.0.11 @@ -84,7 +84,7 @@ SPDX-License-Identifier: Apache-2.0 3.0.2 1.6.10 0.2.6 - 2.11.0 + 2.13.0 0.9.3 1.1.0 1.17.6 @@ -97,7 +97,7 @@ SPDX-License-Identifier: Apache-2.0 1.18.28 2.38.0 7.12.1 - 2.0 + 2.1 2.15.1 5.9.3 3.0.0 From 7eb71cea22598bedf5b0c7e32c634f436195c530 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 11:15:23 +0200 Subject: [PATCH 37/46] chore: TRACEFOSS-XXX add seccomp to deployment yaml of frontend. --- .../traceability-foss/charts/backend/templates/deployment.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/traceability-foss/charts/backend/templates/deployment.yaml b/charts/traceability-foss/charts/backend/templates/deployment.yaml index 83fdfae47f..32ad409e95 100644 --- a/charts/traceability-foss/charts/backend/templates/deployment.yaml +++ b/charts/traceability-foss/charts/backend/templates/deployment.yaml @@ -37,6 +37,7 @@ spec: namespace: {{ .Values.namespace | default .Release.Namespace }} {{- with .Values.podAnnotations }} annotations: + seccomp.security.alpha.kubernetes.io/pod: 'runtime/default' {{- toYaml . | nindent 8 }} {{- end }} labels: From fdabf22650cc455c41cd1ff02370d61efe3fb56e Mon Sep 17 00:00:00 2001 From: ds-mmaul <117836305+ds-mmaul@users.noreply.github.com> Date: Tue, 29 Aug 2023 13:44:07 +0200 Subject: [PATCH 38/46] Chore/tracefoss tracefoss 2607 implement release action (#532) * chore(automation):[TRACEFOSS-XXX] created release action to test --- .github/workflows/release.yaml | 35 +++++++++++++++++++++++++++ charts/traceability-foss/CHANGELOG.md | 15 +++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 38e2446e1f..9acbac41bb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,6 +26,41 @@ jobs: with: cmd: yq -i eval '.version = "${{ env.HELM_VERSION }}"' charts/traceability-foss/Chart.yaml + - name: Update frontend dependency version in Chart.yaml + uses: mikefarah/yq@v4.34.2 + with: + cmd: yq -i eval '.dependencies[0].version = "${{ env.HELM_VERSION }}"' charts/traceability-foss/Chart.yaml + + - name: Update backend dependency version in Chart.yaml + uses: mikefarah/yq@v4.34.2 + with: + cmd: yq -i eval '.dependencies[1].version = "${{ env.HELM_VERSION }}"' charts/traceability-foss/Chart.yaml + + - name: Update frontend version in frontend/Chart.yaml + uses: mikefarah/yq@v4.34.2 + with: + cmd: yq -i eval '.version = "${{ env.HELM_VERSION }}"' charts/traceability-foss/charts/frontend/Chart.yaml + + - name: Update frontend appVersion in frontend/Chart.yaml + uses: mikefarah/yq@v4.34.2 + with: + cmd: yq -i eval '.appVersion = "${{ github.ref_name }}"' charts/traceability-foss/charts/frontend/Chart.yaml + + - name: Update backend version in backend/Chart.yaml + uses: mikefarah/yq@v4.34.2 + with: + cmd: yq -i eval '.version = "${{ env.HELM_VERSION }}"' charts/traceability-foss/charts/backend/Chart.yaml + + - name: Update backend appVersion in frontend/Chart.yaml + uses: mikefarah/yq@v4.34.2 + with: + cmd: yq -i eval '.appVersion = "${{ github.ref_name }}"' charts/traceability-foss/charts/backend/Chart.yaml + + - name: Update the frontend package.json appVersion + run: | + npm install -g json + json -I -f frontend/package.json -e "this.version='${{ github.ref_name }}'" + - name: Prepare Helm release uses: peter-evans/create-pull-request@v5 with: diff --git a/charts/traceability-foss/CHANGELOG.md b/charts/traceability-foss/CHANGELOG.md index 9d021bf798..7783746aee 100644 --- a/charts/traceability-foss/CHANGELOG.md +++ b/charts/traceability-foss/CHANGELOG.md @@ -13,9 +13,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Removed -## [6.0.2] - 2023-08-22 +## [1.3.13] - 2023-08-22 +### Added +- THIS IS A TEST + ### Changed -- This is a test changelog entry -## [6.0.0] - 2023-08-21 + +### Removed + +## [1.3.12] - 2023-08-22 + +### Added +- Initialization of chart changelogs + From 157644c36d3319085e337a1c83be443b1c7b4cf4 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 15:24:56 +0200 Subject: [PATCH 39/46] chore: TRACEFOSS-XXX added kics ignore --- .kicsignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .kicsignore diff --git a/.kicsignore b/.kicsignore new file mode 100644 index 0000000000..c3143c2bc5 --- /dev/null +++ b/.kicsignore @@ -0,0 +1 @@ +00b78adf-b83f-419c-8ed8-c6018441dd3a From 5d2e1bb728029089cf350f9ba9c921c4b3991ffa Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 15:36:54 +0200 Subject: [PATCH 40/46] chore: TRACEFOSS-XXX added kics ignore --- .github/workflows/kics.yml | 4 +++- .kicsignore | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 .kicsignore diff --git a/.github/workflows/kics.yml b/.github/workflows/kics.yml index 461e8bac94..a96958b204 100644 --- a/.github/workflows/kics.yml +++ b/.github/workflows/kics.yml @@ -65,6 +65,7 @@ jobs: # - results-dir/results.json # - results-dir/results.sarif output_path: kicsResults/ + enable_comments: true output_formats: "json,sarif" # If you want KICS to ignore the results and return exit status code 0 unless a KICS engine error happens # ignore_on_exit: results @@ -98,7 +99,8 @@ jobs: with: # Scanning directory . path: "./tx-backend" - + exclude_queries: 9f88c88d-824d-4d9a-b985-e22977046042,8c8261c2-19a9-4ef7-ad37-b8bc7bdd4d85,181bd815-767e-4e95-a24d-bb3c87328e19,00b78adf-b83f-419c-8ed8-c6018441dd3a + enable_comments: true # Fail on HIGH severity results fail_on: high # Disable secrets detection - we use GitGuardian diff --git a/.kicsignore b/.kicsignore deleted file mode 100644 index c3143c2bc5..0000000000 --- a/.kicsignore +++ /dev/null @@ -1 +0,0 @@ -00b78adf-b83f-419c-8ed8-c6018441dd3a From 352a2b1cc506e5eebd7649faff13e47af8e92159 Mon Sep 17 00:00:00 2001 From: ds-lcapellino Date: Tue, 29 Aug 2023 16:45:47 +0200 Subject: [PATCH 41/46] feature: TRACEFOSS-1730 add integration tests; refactor --- .../model/response/relationship/Aspect.java | 7 +- .../semanticdatamodel/SemanticDataModel.java | 4 - .../IntegrationTestSpecification.java | 1 - .../assets/AssetAsPlannedControllerAllIT.java | 11 +- .../AssetAsPlannedControllerByIdIT.java | 174 ++++++ .../AssetAsPlannedControllerCountriesIT.java | 76 +++ ...sPlannedControllerDetailInformationIT.java | 85 +++ .../AssetAsPlannedControllerSyncIT.java | 163 ++++++ .../common/support/AssetsSupport.java | 18 + .../common/support/BpnSupport.java | 11 + .../common/support/IrsApiSupport.java | 36 +- .../id/response_200_downward_asPlanned.json | 533 +++++++++++------- ...esponse_200_empty_as_built_jobdetails.json | 0 ...ponse_200_empty_as_planned_jobdetails.json | 41 ++ 14 files changed, 948 insertions(+), 212 deletions(-) create mode 100644 tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerByIdIT.java create mode 100644 tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerCountriesIT.java create mode 100644 tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerDetailInformationIT.java create mode 100644 tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerSyncIT.java rename tx-backend/src/test/resources/stubs/irs/{post/jobs => get/jobs/id}/response_200_empty_as_built_jobdetails.json (100%) create mode 100644 tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_empty_as_planned_jobdetails.json diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java index 770a8a00c9..c2ddabfe91 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/relationship/Aspect.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import java.util.List; +import java.util.Objects; public enum Aspect { BATCH("Batch"), @@ -58,6 +59,10 @@ public static List downwardAspectsForAssetsAsPlanned() { public static boolean isMasterAspect(String aspect) { - return Aspect.PART_AS_PLANNED.getAspectName().contains(aspect) || Aspect.SERIAL_PART.getAspectName().contains(aspect) || Aspect.BATCH.getAspectName().contains(aspect) || Aspect.JUST_IN_SEQUENCE_PART.getAspectName().contains(aspect); + assert Objects.nonNull(aspect); + return aspect.contains(Aspect.PART_AS_PLANNED.getAspectName()) || + aspect.contains(Aspect.SERIAL_PART.getAspectName()) || + aspect.contains(Aspect.BATCH.getAspectName()) || + aspect.contains(Aspect.JUST_IN_SEQUENCE_PART.getAspectName()); } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java index f0d1d2e041..a77dd2b63a 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/model/response/semanticdatamodel/SemanticDataModel.java @@ -196,10 +196,6 @@ public String catenaXId() { return catenaXId; } - public PartTypeInformation partTypeInformation() { - return partTypeInformation; - } - public ManufacturingInformation manufacturingInformation() { return manufacturingInformation; } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/IntegrationTestSpecification.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/IntegrationTestSpecification.java index fa881e1bde..6532a51d2a 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/IntegrationTestSpecification.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/IntegrationTestSpecification.java @@ -79,7 +79,6 @@ protected String asJson(Map map) { protected void eventually(Callable conditions) throws InterruptedException { Awaitility.setDefaultPollInterval(500, TimeUnit.MILLISECONDS); Awaitility.setDefaultTimeout(15, TimeUnit.SECONDS); - Awaitility.ignoreExceptionsByDefault(); Awaitility.pollInSameThread(); await().until(conditions, Matchers.equalTo(true)); } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java index c2d9c56513..71c861ad7c 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerAllIT.java @@ -35,7 +35,11 @@ import static io.restassured.RestAssured.given; import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.everyItem; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; import static org.junit.jupiter.params.provider.Arguments.arguments; class AssetAsPlannedControllerAllIT extends IntegrationTestSpecification { @@ -50,14 +54,14 @@ private static Stream owners() { return Stream.of( arguments("OWN", 1), arguments("CUSTOMER", 0), - arguments("SUPPLIER", 12), + arguments("SUPPLIER", 1), arguments("UNKNOWN", 0)); } @Test void shouldReturnAssetsWithManufacturerName() throws JoseException { //GIVEN - bpnSupport.cachedBpnsForDefaultAssets(); + bpnSupport.cachedBpnsForAsPlannedAssets(); assetsSupport.defaultAssetsAsPlannedStored(); //THEN @@ -70,6 +74,7 @@ void shouldReturnAssetsWithManufacturerName() throws JoseException { .then() .log().all() .statusCode(200) + .body("totalItems", is(greaterThan(0))) .body("content.manufacturerName", everyItem(not(equalTo(assetsSupport.emptyText())))); } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerByIdIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerByIdIT.java new file mode 100644 index 0000000000..a67f562f21 --- /dev/null +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerByIdIT.java @@ -0,0 +1,174 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.integration.assets; + +import io.restassured.http.ContentType; +import org.eclipse.tractusx.traceability.integration.IntegrationTestSpecification; +import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; +import org.hamcrest.Matchers; +import org.jose4j.lang.JoseException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; +import java.util.stream.Stream; + +import static io.restassured.RestAssured.given; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class AssetAsPlannedControllerByIdIT extends IntegrationTestSpecification { + + @Autowired + AssetsSupport assetsSupport; + + private static Stream requests() { + return Stream.of( + arguments(Map.of("qualityType", "NOT_EXISTING_QUALITY_TYPE"), "Failed to deserialize request body."), + arguments(Map.of("qualityType", "'CRITICAL'"), "Failed to deserialize request body."), + arguments(Map.of("qualityType", ""), "Failed to deserialize request body."), + arguments(Map.of("qualityType", " "), "Failed to deserialize request body.") + ); + } + + @Test + void shouldReturnAssetsForAuthenticatedUserWithRole() throws JoseException { + //GIVEN + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01") + .then() + .statusCode(200); + } + + + @Test + void shouldNotReturnAssetsWhenUserIsNotAuthenticated() { + given() + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/1234") + .then() + .statusCode(401); + } + + @Test + void shouldGetChildrenAsset() throws JoseException { + //GIVEN + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01/children/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01") + .then() + .statusCode(200) + .body("id", Matchers.is("urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01")); + } + + @Test + void shouldReturn404WhenChildrenAssetIsNotFound() throws JoseException { + //GIVEN + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb/children/unknown") + .then() + .statusCode(404); + } + + @Test + void shouldNotUpdateQualityTypeForNotExistingAsset() throws JoseException { + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .body(asJson(Map.of("qualityType", "Critical"))) + .when() + .patch("/api/assets/as-planned/1234") + .then() + .statusCode(404) + .body("message", equalTo("Asset with id 1234 was not found.")); + } + + @ParameterizedTest + @MethodSource("requests") + void shouldNotUpdateQualityTypeWithInvalidRequestBody(Map requestBody, String errorMessage) throws JoseException { + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .body(asJson(requestBody)) + .when() + .patch("/api/assets/as-planned/1234") + .then() + .statusCode(400) + .body("message", equalTo(errorMessage)); + } + + @Test + void shouldUpdateQualityTypeForExistingAsset() throws JoseException { + //GIVEN + assetsSupport.defaultAssetsAsPlannedStored(); + String existingAssetId = "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01"; + + //THEN + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/" + existingAssetId) + .then() + .statusCode(200) + .body("qualityType", equalTo("Ok")); + + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .body(Map.of("qualityType", "Critical")) + .when() + .patch("/api/assets/as-planned/" + existingAssetId) + .then() + .statusCode(200) + .body("qualityType", equalTo("Critical")); + + given() + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/" + existingAssetId) + .then() + .statusCode(200) + .body("qualityType", equalTo("Critical")); + } + +} diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerCountriesIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerCountriesIT.java new file mode 100644 index 0000000000..5229fa464c --- /dev/null +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerCountriesIT.java @@ -0,0 +1,76 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.integration.assets; + +import io.restassured.http.ContentType; +import org.eclipse.tractusx.traceability.common.security.JwtRole; +import org.eclipse.tractusx.traceability.integration.IntegrationTestSpecification; +import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; +import org.jose4j.lang.JoseException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.stream.Stream; + +import static io.restassured.RestAssured.given; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.SUPERVISOR; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.USER; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class AssetAsPlannedControllerCountriesIT extends IntegrationTestSpecification { + + @Autowired + AssetsSupport assetsSupport; + + private static Stream roles() { + return Stream.of( + arguments(USER), + arguments(SUPERVISOR), + arguments(ADMIN) + ); + } + + @ParameterizedTest + @MethodSource("roles") + void shouldReturnAssetsCountryMap(JwtRole role) throws JoseException { + given() + .header(oAuth2Support.jwtAuthorization(role)) + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/countries") + .then() + .statusCode(200); + + } + + @Test + void shouldNotReturnAssetsCountryMapWhenUserIsNotAuthenticated() { + given() + .contentType(ContentType.JSON) + .when() + .get("/api/assets/as-planned/countries") + .then() + .statusCode(401); + } + +} diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerDetailInformationIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerDetailInformationIT.java new file mode 100644 index 0000000000..32d1d12a81 --- /dev/null +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerDetailInformationIT.java @@ -0,0 +1,85 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.integration.assets; + +import io.restassured.http.ContentType; +import org.eclipse.tractusx.traceability.integration.IntegrationTestSpecification; +import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; +import org.eclipse.tractusx.traceability.integration.common.support.BpnSupport; +import org.jose4j.lang.JoseException; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Map; + +import static io.restassured.RestAssured.given; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; +import static org.hamcrest.Matchers.hasSize; + +class AssetAsPlannedControllerDetailInformationIT extends IntegrationTestSpecification { + + + @Autowired + BpnSupport bpnSupport; + + @Autowired + AssetsSupport assetsSupport; + + @Test + void shouldNotReturnAassetsDetailInformationWhenUserIsNotAuthenticated() { + //GIVEN + bpnSupport.cachedBpnsForAsPlannedAssets(); + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .contentType(ContentType.JSON) + .body( + asJson(Map.of("assetIds", List.of("1234")) + ) + ) + .when() + .post("/api/assets/as-planned/detail-information") + .then() + .statusCode(401); + } + + @Test + void shouldReturnAssetsDetailInformation() throws JoseException { + //GIVEN + bpnSupport.cachedBpnsForAsPlannedAssets(); + assetsSupport.defaultAssetsAsPlannedStored(); + + //THEN + given() + .contentType(ContentType.JSON) + .body( + asJson(Map.of("assetIds", List.of("urn:urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01")) + ) + ) + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .when() + .post("/api/assets/as-planned/detail-information") + .then() + .statusCode(200) + .body("", hasSize(1)); + } +} diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerSyncIT.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerSyncIT.java new file mode 100644 index 0000000000..f7025db677 --- /dev/null +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/assets/AssetAsPlannedControllerSyncIT.java @@ -0,0 +1,163 @@ +/******************************************************************************** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.integration.assets; + +import io.restassured.http.ContentType; +import org.eclipse.tractusx.traceability.integration.IntegrationTestSpecification; +import org.eclipse.tractusx.traceability.integration.common.support.AssetsSupport; +import org.eclipse.tractusx.traceability.integration.common.support.IrsApiSupport; +import org.jose4j.lang.JoseException; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Map; + +import static io.restassured.RestAssured.given; +import static org.eclipse.tractusx.traceability.common.security.JwtRole.ADMIN; + +class AssetAsPlannedControllerSyncIT extends IntegrationTestSpecification { + + @Autowired + IrsApiSupport irsApiSupport; + + @Autowired + AssetsSupport assetsSupport; + + @Test + void shouldSynchronizeAssets() throws JoseException, InterruptedException { + //GIVEN + oAuth2ApiSupport.oauth2ApiReturnsTechnicalUserToken(); + irsApiSupport.irsApiTriggerJobAsPlanned(); + irsApiSupport.irsApiReturnsJobDetailsAsPlannedDownward(); + + //WHEN + given() + .contentType(ContentType.JSON) + .body( + asJson(Map.of("globalAssetIds", List.of("urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01")) + ) + ) + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .when() + .post("/api/assets/as-planned/sync") + .then() + .statusCode(200); + + //THEN + eventually(() -> { + try { + assetsSupport.assertAssetAsPlannedSize(2); + assetsSupport.assertHasAsPlannedChildCount("urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", 1); + return true; + } catch (Throwable e) { + e.printStackTrace(); + return false; + } + }); + + } + + @Test + void shouldSynchronizeAssetsUsingRetry() throws JoseException, InterruptedException { + //GIVEN + oAuth2ApiSupport.oauth2ApiReturnsTechnicalUserToken(); + irsApiSupport.irsApiTriggerJobAsPlanned(); + irsApiSupport.irsApiReturnsJobDetailsAsPlannedDownwardEmptyFirst(); + + //WHEN + given() + .contentType(ContentType.JSON) + .body( + asJson(Map.of("globalAssetIds", List.of("urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01")) + ) + ) + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .when() + .post("/api/assets/as-planned/sync") + .then() + .statusCode(200); + + //THEN + eventually(() -> { + try { + assetsSupport.assertAssetAsPlannedSize(2); + irsApiSupport.verifyIrsApiTriggerJobCalledTimes(1); + return true; + } catch (Throwable e) { + e.printStackTrace(); + return false; + } + }); + } + + @Test + void shouldNotSynchronizeAssetsWhenIrsFailedToReturnJobDetails() throws JoseException, InterruptedException { + //GIVEN + oAuth2ApiSupport.oauth2ApiReturnsTechnicalUserToken(); + irsApiSupport.irsApiTriggerJob(); + irsApiSupport.irsJobDetailsApiFailed(); + + //WHEN + given() + .contentType(ContentType.JSON) + .body( + asJson(Map.of("globalAssetIds", List.of("urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb")) + ) + ) + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .when() + .post("/api/assets/as-planned/sync") + .then() + .statusCode(200); + + //THEN + eventually(() -> { + assetsSupport.assertNoAssetsStored(); + return true; + }); + } + + @Test + void shouldNotSynchronizeAssetsWhenIrsKeepsReturningJobInRunningState() throws JoseException, InterruptedException { + //GIVEN + oAuth2ApiSupport.oauth2ApiReturnsTechnicalUserToken(); + irsApiSupport.irsApiTriggerJob(); + irsApiSupport.irsApiReturnsJobInRunningState(); + + //WHEN + given() + .contentType(ContentType.JSON) + .body( + asJson(Map.of("globalAssetIds", List.of("urn:uuid:d387fa8e-603c-42bd-98c3-4d87fef8d2bb")) + ) + ) + .header(oAuth2Support.jwtAuthorization(ADMIN)) + .when() + .post("/api/assets/as-planned/sync") + .then() + .statusCode(200); + + //THEN + eventually(() -> { + assetsSupport.assertNoAssetsStored(); + return true; + }); + } +} 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 d8b5b2394c..76ff4bcfe2 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 @@ -97,12 +97,30 @@ public void assertHasRequiredIdentifiers() { }); } + public void assertAsPlannedHasRequiredIdentifiers() { + assetRepositoryProvider.assetAsPlannedRepository().getAssets().forEach(asset -> { + assert Objects.nonNull(asset.getManufacturerId()) && !asset.getManufacturerId().equals("--"); + assert Objects.nonNull(asset.getSemanticModelId()) && !asset.getSemanticModelId().equals("--"); + assert !Objects.isNull(asset.getIdShort()); + + log.info("!asset.getManufacturerId().equals(\"--\"): {}", !asset.getManufacturerId().equals("--")); + log.info("!asset.getSemanticModelId().equals(\"--\"): {}", !asset.getSemanticModelId().equals("--")); + log.info("!Objects.isNull(asset.getIdShort()): {}", !Objects.isNull(asset.getIdShort())); + }); + } + public void assertHasChildCount(String assetId, int count) { List childRelations = assetRepositoryProvider.assetAsBuiltRepository().getAssetById(assetId).getChildRelations(); log.info("childCount: {}", childRelations.size()); assert childRelations.size() == count; } + public void assertHasAsPlannedChildCount(String assetId, int count) { + List childRelations = assetRepositoryProvider.assetAsPlannedRepository().getAssetById(assetId).getChildRelations(); + log.info("childCount: {}", childRelations.size()); + assert childRelations.size() == count; + } + public void assertNoAssetsStored() { assertAssetAsBuiltSize(0); } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java index c5bf02d738..55b58c80a2 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/BpnSupport.java @@ -49,6 +49,17 @@ public void cachedBpnsForDefaultAssets() { bpnRepositoryProvider.bpnRepository().updateManufacturers(bpnMappings); } + public void cachedBpnsForAsPlannedAssets() { + List assetIds = assetRepositoryProvider.assetsConverter().readAndConvertAssetsAsPlannedForTests().stream().map(AssetBase::getManufacturerId).toList(); + Map bpnMappings = new HashMap<>(); + + for (String assetId : assetIds) { + bpnMappings.put(assetId, "Manufacturer Name $i"); + } + + bpnRepositoryProvider.bpnRepository().updateManufacturers(bpnMappings); + } + public String testBpn() { return bpn; } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/IrsApiSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/IrsApiSupport.java index b5a455518b..dd9953e270 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/IrsApiSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/IrsApiSupport.java @@ -25,8 +25,14 @@ import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp; import static com.xebialabs.restito.builder.verify.VerifyHttp.verifyHttp; -import static com.xebialabs.restito.semantics.Action.*; -import static com.xebialabs.restito.semantics.Condition.*; +import static com.xebialabs.restito.semantics.Action.header; +import static com.xebialabs.restito.semantics.Action.ok; +import static com.xebialabs.restito.semantics.Action.status; +import static com.xebialabs.restito.semantics.Condition.get; +import static com.xebialabs.restito.semantics.Condition.post; +import static com.xebialabs.restito.semantics.Condition.startsWithUri; +import static com.xebialabs.restito.semantics.Condition.withHeader; +import static com.xebialabs.restito.semantics.Condition.withPostBodyContaining; @Component public class IrsApiSupport { @@ -81,7 +87,7 @@ public void irsJobDetailsEmptyAsBuilt() { .then( ok(), header("Content-Type", "application/json"), - restitoProvider.jsonResponseFromFile("./stubs/irs/post/jobs/response_200_empty_as_built_jobdetails.json")); + restitoProvider.jsonResponseFromFile("stubs/irs/get/jobs/id/response_200_empty_as_built_jobdetails.json")); } @@ -105,25 +111,35 @@ public void irsApiTriggerJobAsPlanned() { ).then( ok(), header("Content-Type", "application/json"), - restitoProvider.jsonResponseFromFile("./stubs/irs/post/jobs/response_200.json") + restitoProvider.jsonResponseFromFile("./stubs/irs/post/jobs/response_200_jobId_as_planned_successful.json") ); } public void irsApiReturnsJobDetailsAsPlannedDownward() { whenHttp(restitoProvider.stubServer()).match( - get("/irs/jobs/ebb79c45-7bba-4169-bf17-3e719989ab54"), + get("/irs/jobs/ebb79c45-7bba-4169-bf17-SUCCESSFUL_AS_PLANNED"), withHeader(HttpHeaders.AUTHORIZATION) ) .then( ok(), - header("Content-Type", "application/json")) - .withSequence( - restitoProvider.jsonResponseFromFile("./stubs/irs/post/jobs/empty_response_200.json"), - restitoProvider.jsonResponseFromFile("./stubs/irs/post/jobs/empty_response_200.json"), + header("Content-Type", "application/json"), restitoProvider.jsonResponseFromFile("./stubs/irs/get/jobs/id/response_200_downward_asPlanned.json") ); } + public void irsApiReturnsJobDetailsAsPlannedDownwardEmptyFirst() { + whenHttp(restitoProvider.stubServer()).match( + get("/irs/jobs/ebb79c45-7bba-4169-bf17-SUCCESSFUL_AS_PLANNED"), + withHeader(HttpHeaders.AUTHORIZATION) + ) + .then( + ok(), + header("Content-Type", "application/json") + ).withSequence( + restitoProvider.jsonResponseFromFile("./stubs/irs/get/jobs/id/response_200_empty_as_planned_jobdetails.json"), + restitoProvider.jsonResponseFromFile("./stubs/irs/get/jobs/id/response_200_downward_asPlanned.json") + ); + } public void irsApiTriggerJobFailed() { whenHttp(restitoProvider.stubServer()).match( @@ -192,7 +208,7 @@ public void irsApiReturnsJobInRunningAndCompleted() { ok(), header("Content-Type", "application/json") ).withSequence( - restitoProvider.jsonResponseFromFile("./stubs/irs/get/jobs/id/response_200.json"), + restitoProvider.jsonResponseFromFile("./stubs/irs/get/jobs/id/response_200_empty_as_built_jobdetails.json"), restitoProvider.jsonResponseFromFile("./stubs/irs/get/jobs/id/response_200.json") ); } diff --git a/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_downward_asPlanned.json b/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_downward_asPlanned.json index 1cf2e60d6c..3f1f7200b6 100644 --- a/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_downward_asPlanned.json +++ b/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_downward_asPlanned.json @@ -1,282 +1,429 @@ { - "job" : { - "id" : "6bb115eb-6793-44c9-b247-c8acc03756d5", - "globalAssetId" : "ebb79c45-7bba-4169-bf17-SUCCESSFUL_AS_PLANNED", - "state" : "COMPLETED", - "exception" : null, - "createdOn" : "2023-06-14T13:42:17.473660935Z", - "startedOn" : "2023-06-14T13:42:17.473771737Z", - "lastModifiedOn" : "2023-06-14T13:42:50.578583206Z", - "completedOn" : "2023-06-14T13:42:50.578585306Z", - "owner" : "sa-cl6-cx-10", - "summary" : { - "asyncFetchedItems" : { - "running" : 0, - "completed" : 3, - "failed" : 0 + "job": { + "id": "895871b4-238b-4839-8dda-537e18c058d9", + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "state": "COMPLETED", + "exception": null, + "createdOn": "2023-07-21T08:38:53.551699292Z", + "startedOn": "2023-07-21T08:38:53.551856296Z", + "lastModifiedOn": "2023-07-21T08:41:29.077474138Z", + "completedOn": "2023-07-21T08:41:29.077476638Z", + "owner": "sa-cl6-cx-10", + "summary": { + "asyncFetchedItems": { + "running": 0, + "completed": 3, + "failed": 0 }, - "bpnLookups" : { - "completed" : 3, - "failed" : 0 + "bpnLookups": { + "completed": 0, + "failed": 0 } }, - "parameter" : { - "bomLifecycle" : "asPlanned", - "aspects" : [ + "parameter": { + "bomLifecycle": "asPlanned", + "aspects": [ "PartAsPlanned", "PartSiteInformationAsPlanned" ], - "depth" : 2, - "direction" : "downward", - "collectAspects" : true, - "lookupBPNs" : true, - "callbackUrl" : null + "depth": 2, + "bpn": "BPNL00000003CML1", + "direction": "downward", + "collectAspects": true, + "lookupBPNs": false, + "callbackUrl": null } }, - "relationships" : [ + "relationships": [ { - "catenaXId" : "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", - "linkedItem" : { - "quantity" : { - "quantityNumber" : 1.0, - "measurementUnit" : { - "datatypeURI" : "urn:bamm:io.openmanufacturing:meta-model:1.0.0#curie", - "lexicalValue" : "unit:piece" + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "linkedItem": { + "quantity": { + "quantityNumber": 1.0, + "measurementUnit": { + "datatypeURI": null, + "lexicalValue": "unit:piece" } }, - "lifecycleContext" : "asPlanned", - "assembledOn" : "2022-02-03T14:48:54.709Z", - "lastModifiedOn" : "2022-02-03T14:48:54.709Z", - "childCatenaXId" : "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01" + "lifecycleContext": "asPlanned", + "assembledOn": "2022-02-03T14:48:54.709Z", + "lastModifiedOn": "2022-02-03T14:48:54.709Z", + "childCatenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01" }, - "aspectType" : "SingleLevelBomAsPlanned" + "aspectType": "SingleLevelBomAsPlanned" + }, + { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "linkedItem": { + "quantity": { + "quantityNumber": 1.0, + "measurementUnit": { + "datatypeURI": null, + "lexicalValue": "unit:piece" + } + }, + "lifecycleContext": "asPlanned", + "assembledOn": "2022-02-03T14:48:54.709Z", + "lastModifiedOn": "2022-02-03T14:48:54.709Z", + "childCatenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01" + }, + "aspectType": "SingleLevelBomAsPlanned" } ], - "shells" : [ + "shells": [ { - "administration" : null, - "description" : [], - "globalAssetId" : { - "value" : [ - "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01" - ] - }, - "idShort" : "VehicleModelA", - "identification" : "urn:uuid:20f469ec-0d4e-4ba2-90d1-de456826274d", - "specificAssetIds" : [ + "administration": null, + "description": [], + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "idShort": "VehicleModelA", + "id": "urn:uuid:4338d397-8811-4a41-a5ea-7cd7bb2f9014", + "specificAssetIds": [ { - "key" : "manufacturerId", - "subjectId" : null, - "value" : "BPNL00000003CML1", - "semanticId" : null + "name": "manufacturerPartId", + "subjectId": null, + "value": "ZX-55", + "semanticId": null }, { - "key" : "manufacturerPartId", - "subjectId" : null, - "value" : "ZX-55", - "semanticId" : null + "name": "manufacturerId", + "subjectId": null, + "value": "BPNL00000003CML1", + "semanticId": null } ], - "submodelDescriptors" : [ + "submodelDescriptors": [ { - "administration" : null, - "description" : [], - "idShort" : "PartAsPlanned", - "identification" : "urn:uuid:6506fbae-c1c0-4f79-a4e4-663be438854d", - "semanticId" : { - "value" : [ - "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned" - ] + "administration": null, + "description": [], + "idShort": "PartAsPlanned", + "id": "urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" }, - "endpoints" : [ + "endpoints": [ { - "protocolInformation" : { - "endpointAddress" : "https://trace-x-edc.dev.demo.catena-x.net/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:6506fbae-c1c0-4f79-a4e4-663be438854d/submodel?content=value&extent=withBlobValue", - "endpointProtocol" : "AAS/IDS", - "endpointProtocolVersion" : "0.1", - "subprotocol" : "IDS", - "subprotocolBody" : "TDB", - "subprotocolBodyEncoding" : "plain" + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" }, - "interface" : "HTTP" + "interface": "SUBMODEL-3.0" } ] }, { - "administration" : null, - "description" : [], - "idShort" : "PartSiteInformationAsPlanned", - "identification" : "urn:uuid:68b98f02-1de5-46ab-b161-a3addd4b87aa", - "semanticId" : { - "value" : [ - "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned" - ] + "administration": null, + "description": [], + "idShort": "PartSiteInformationAsPlanned", + "id": "urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" }, - "endpoints" : [ + "endpoints": [ { - "protocolInformation" : { - "endpointAddress" : "https://trace-x-edc.dev.demo.catena-x.net/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:68b98f02-1de5-46ab-b161-a3addd4b87aa/submodel?content=value&extent=withBlobValue", - "endpointProtocol" : "AAS/IDS", - "endpointProtocolVersion" : "0.1", - "subprotocol" : "IDS", - "subprotocolBody" : "TDB", - "subprotocolBodyEncoding" : "plain" + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" }, - "interface" : "HTTP" + "interface": "SUBMODEL-3.0" } ] } ] }, { - "administration" : null, - "description" : [], - "globalAssetId" : { - "value" : [ - "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01" - ] - }, - "idShort" : "VehicleModelA", - "identification" : "urn:uuid:43db912b-f71b-4b32-9629-6ad58a382ca0", - "specificAssetIds" : [ + "administration": null, + "description": [], + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "idShort": "VehicleModelB", + "id": "urn:uuid:e20655b1-6711-4f88-a90f-72c092d434b0", + "specificAssetIds": [ + { + "name": "manufacturerPartId", + "subjectId": null, + "value": "ZX-55", + "semanticId": null + }, + { + "name": "manufacturerId", + "subjectId": null, + "value": "BPNL00000003CNKC", + "semanticId": null + } + ], + "submodelDescriptors": [ + { + "administration": null, + "description": [], + "idShort": "PartAsPlanned", + "id": "urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-test-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01/submodels/urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01-urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951;dspEndpoint=https://trace-x-test-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + }, { - "key" : "manufacturerPartId", - "subjectId" : null, - "value" : "ZX-55", - "semanticId" : null + "administration": null, + "description": [], + "idShort": "PartSiteInformationAsPlanned", + "id": "urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-test-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01/submodels/urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01-urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b;dspEndpoint=https://trace-x-test-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + } + ] + }, + { + "administration": null, + "description": [], + "globalAssetId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "idShort": "VehicleModelA", + "id": "urn:uuid:4338d397-8811-4a41-a5ea-7cd7bb2f9014", + "specificAssetIds": [ + { + "name": "manufacturerPartId", + "subjectId": null, + "value": "ZX-55", + "semanticId": null }, { - "key" : "manufacturerId", - "subjectId" : null, - "value" : "BPNL00000003CNKC", - "semanticId" : null + "name": "manufacturerId", + "subjectId": null, + "value": "BPNL00000003CML1", + "semanticId": null } ], - "submodelDescriptors" : [ + "submodelDescriptors": [ + { + "administration": null, + "description": [], + "idShort": "PartAsPlanned", + "id": "urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" + }, + "endpoints": [ + { + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" + }, + "interface": "SUBMODEL-3.0" + } + ] + }, { - "administration" : null, - "description" : [], - "idShort" : "PartAsPlanned", - "identification" : "urn:uuid:28d4c163-2b12-4519-b616-18c6e42dcc81", - "semanticId" : { - "value" : [ - "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned" - ] + "administration": null, + "description": [], + "idShort": "PartSiteInformationAsPlanned", + "id": "urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" }, - "endpoints" : [ + "endpoints": [ { - "protocolInformation" : { - "endpointAddress" : "https://trace-x-edc.dev.demo.catena-x.net/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01-urn:uuid:28d4c163-2b12-4519-b616-18c6e42dcc81/submodel?content=value&extent=withBlobValue", - "endpointProtocol" : "AAS/IDS", - "endpointProtocolVersion" : "0.1", - "subprotocol" : "IDS", - "subprotocolBody" : "TDB", - "subprotocolBodyEncoding" : "plain" + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" }, - "interface" : "HTTP" + "interface": "SUBMODEL-3.0" } ] }, { - "administration" : null, - "description" : [], - "idShort" : "PartSiteInformationAsPlanned", - "identification" : "urn:uuid:dbedf42b-57ca-489d-a389-0516fcd58a25", - "semanticId" : { - "value" : [ - "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned" - ] + "administration": null, + "description": [], + "idShort": "SingleLevelBomAsPlanned", + "id": "urn:uuid:3d9d966b-27e1-4512-be13-2715ae623ab1", + "semanticId": { + "keys": [ + { + "value": "urn:bamm:io.catenax.single_level_bom_as_planned:2.0.0#SingleLevelBomAsPlanned", + "type": "Submodel" + } + ], + "type": "ExternalReference" }, - "endpoints" : [ + "endpoints": [ { - "protocolInformation" : { - "endpointAddress" : "https://trace-x-edc.dev.demo.catena-x.net/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01-urn:uuid:dbedf42b-57ca-489d-a389-0516fcd58a25/submodel?content=value&extent=withBlobValue", - "endpointProtocol" : "AAS/IDS", - "endpointProtocolVersion" : "0.1", - "subprotocol" : "IDS", - "subprotocolBody" : "TDB", - "subprotocolBodyEncoding" : "plain" + "protocolInformation": { + "href": "https://trace-x-edc.dev.demo.catena-x.net/shells/urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01/submodels/urn:uuid:3d9d966b-27e1-4512-be13-2715ae623ab1/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "DSP", + "subprotocolBody": "id=urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01-urn:uuid:3d9d966b-27e1-4512-be13-2715ae623ab1;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net", + "subprotocolBodyEncoding": "plain" }, - "interface" : "HTTP" + "interface": "SUBMODEL-3.0" } ] } ] } ], - "tombstones" : [], - "submodels" : [ + "tombstones": [], + "submodels": [ { - "identification" : "urn:uuid:6506fbae-c1c0-4f79-a4e4-663be438854d", - "aspectType" : "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", - "payload" : { - "validityPeriod" : { - "validFrom" : "2019-04-04T03:19:03.000Z", - "validTo" : "2024-12-29T10:25:12.000Z" + "identification": "urn:uuid:9a1cf54a-56e1-4d20-9931-5479db0ce6f8", + "aspectType": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "payload": { + "validityPeriod": { + "validFrom": "2019-04-04T03:19:03.000Z", + "validTo": "2024-12-29T10:25:12.000Z" }, - "catenaXId" : "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", - "partTypeInformation" : { - "manufacturerPartId" : "ZX-55", - "classification" : "product", - "nameAtManufacturer" : "Vehicle Model A" + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "partTypeInformation": { + "manufacturerPartId": "ZX-55", + "classification": "product", + "nameAtManufacturer": "Vehicle Model A" } } }, { - "identification" : "urn:uuid:68b98f02-1de5-46ab-b161-a3addd4b87aa", - "aspectType" : "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", - "payload" : { - "catenaXId" : "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", - "sites" : [ + "identification": "urn:uuid:6507e9fc-2544-4ce1-a41c-b0aa57d7b30a", + "aspectType": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "payload": { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4da01", + "sites": [ { - "functionValidUntil" : "2025-02-08T04:30:48.000Z", - "function" : "production", - "functionValidFrom" : "2019-08-21T02:10:36.000Z", - "catenaXSiteId" : "BPNS000004711DMY" + "functionValidUntil": "2025-02-08T04:30:48.000Z", + "function": "production", + "functionValidFrom": "2019-08-21T02:10:36.000Z", + "catenaXSiteId": "BPNS000004711DMY" } ] } }, { - "identification" : "urn:uuid:28d4c163-2b12-4519-b616-18c6e42dcc81", - "aspectType" : "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", - "payload" : { - "validityPeriod" : { - "validFrom" : "2019-04-04T03:19:03.000Z", - "validTo" : "2024-12-29T10:25:12.000Z" + "identification": "urn:uuid:81d16457-d9af-4b4d-a124-84d3ae17d951", + "aspectType": "urn:bamm:io.catenax.part_as_planned:1.0.1#PartAsPlanned", + "payload": { + "validityPeriod": { + "validFrom": "2019-04-04T03:19:03.000Z", + "validTo": "2024-12-29T10:25:12.000Z" }, - "catenaXId" : "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", - "partTypeInformation" : { - "manufacturerPartId" : "ZX-55", - "classification" : "product", - "nameAtManufacturer" : "Vehicle Model A" + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "partTypeInformation": { + "manufacturerPartId": "ZX-55", + "classification": "product", + "nameAtManufacturer": "Vehicle Model B" } } }, { - "identification" : "urn:uuid:dbedf42b-57ca-489d-a389-0516fcd58a25", - "aspectType" : "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", - "payload" : { - "catenaXId" : "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", - "sites" : [ + "identification": "urn:uuid:3331cecf-8183-4966-aa4c-d99d61d20c0b", + "aspectType": "urn:bamm:io.catenax.part_site_information_as_planned:1.0.0#PartSiteInformationAsPlanned", + "payload": { + "catenaXId": "urn:uuid:0733946c-59c6-41ae-9570-cb43a6e4eb01", + "sites": [ { - "functionValidUntil" : "2025-02-08T04:30:48.000Z", - "function" : "production", - "functionValidFrom" : "2019-08-21T02:10:36.000Z", - "catenaXSiteId" : "BPNS000004711DMY" + "functionValidUntil": "2025-02-08T04:30:48.000Z", + "function": "production", + "functionValidFrom": "2019-08-21T02:10:36.000Z", + "catenaXSiteId": "BPNS000004711DMY" } ] } } ], - "bpns" : [ + "bpns": [ { - "manufacturerId" : "BPNL00000003CML1", - "manufacturerName" : "TEST_BPN_DFT_1" + "manufacturerId": "BPNL00000003CML1", + "manufacturerName": null }, { - "manufacturerId" : "BPNL00000003CNKC", - "manufacturerName" : "TEST_BPN_IRS_1" + "manufacturerId": "BPNL00000003CNKC", + "manufacturerName": null } ] } diff --git a/tx-backend/src/test/resources/stubs/irs/post/jobs/response_200_empty_as_built_jobdetails.json b/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_empty_as_built_jobdetails.json similarity index 100% rename from tx-backend/src/test/resources/stubs/irs/post/jobs/response_200_empty_as_built_jobdetails.json rename to tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_empty_as_built_jobdetails.json diff --git a/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_empty_as_planned_jobdetails.json b/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_empty_as_planned_jobdetails.json new file mode 100644 index 0000000000..40cd0f0e1b --- /dev/null +++ b/tx-backend/src/test/resources/stubs/irs/get/jobs/id/response_200_empty_as_planned_jobdetails.json @@ -0,0 +1,41 @@ +{ + "job": { + "id": "6bb115eb-6793-44c9-b247-c8acc03756d5", + "globalAssetId": "ebb79c45-7bba-4169-bf17-EMPTY_AS_BUILT", + "state": "RUNNING", + "exception": null, + "createdOn": "2023-06-14T13:42:17.473660935Z", + "startedOn": "2023-06-14T13:42:17.473771737Z", + "lastModifiedOn": "2023-06-14T13:42:50.578583206Z", + "completedOn": "2023-06-14T13:42:50.578585306Z", + "owner": "sa-cl6-cx-10", + "summary": { + "asyncFetchedItems": { + "running": 0, + "completed": 0, + "failed": 0 + }, + "bpnLookups": { + "completed": 3, + "failed": 0 + } + }, + "parameter": { + "bomLifecycle": "asBuilt", + "aspects": [ + "Batch", + "SerialPart", + "AssemblyPartRelationship" + ], + "depth": 2, + "direction": "downward", + "collectAspects": true, + "lookupBPNs": true, + "callbackUrl": null + } + }, + "relationships": [], + "shells": [], + "tombstones": [], + "submodels": [] +} From a12d67e7ea67b88c44ba0a5c3a3af6ac02f3bb39 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 20:43:36 +0200 Subject: [PATCH 42/46] chore: TRACEFOSS-1730 adapt frontend api to use assets/as-built by default --- CHANGELOG.md | 3 ++- .../otherParts-mock/otherParts.handler.ts | 4 ++-- .../services/parts-mock/parts.handler.ts | 22 +++++++++---------- .../other-parts/core/other-parts.service.ts | 4 ++-- .../modules/shared/service/parts.service.ts | 8 +++---- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52cbcff647..219aee70a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,9 +15,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Cucumber tests for quality investigations - Refactored asset structure to allow new API for assets-as-planned - Optional parameter "receiverBpn" to /investigations endpoint +- NEW API /api/assets/as-planned ### Changed - +- API BREAKING CHANGE: /api/assets changed to /api/assets/as-built - Changed digitalTwinRegistryRestTemplate to use token in requests - Update asBuild test data to 1.5.3 and asPlanned to 1.5.1 - Changed transfer notification logic not to break iteration loop when sending notifications to bpn with more than 1 connector endpoints diff --git a/frontend/src/app/mocks/services/otherParts-mock/otherParts.handler.ts b/frontend/src/app/mocks/services/otherParts-mock/otherParts.handler.ts index 7c1a9db217..adfcb909c9 100644 --- a/frontend/src/app/mocks/services/otherParts-mock/otherParts.handler.ts +++ b/frontend/src/app/mocks/services/otherParts-mock/otherParts.handler.ts @@ -26,7 +26,7 @@ import { otherPartsAssets } from './otherParts.model'; import { mockCustomerAssets, mockSupplierAssets } from './otherParts.test.model'; export const otherPartsHandlers = [ - rest.get(`*${environment.apiUrl}/assets`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built`, (req, res, ctx) => { const pagination = extractPagination(req); const owner = req.url.searchParams.get('owner'); @@ -42,7 +42,7 @@ export const otherPartsHandlers = [ ]; export const otherPartsHandlersTest = [ - rest.get(`*${environment.apiUrl}/assets`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built`, (req, res, ctx) => { const owner = req.url.searchParams.get('owner'); switch (owner) { diff --git a/frontend/src/app/mocks/services/parts-mock/parts.handler.ts b/frontend/src/app/mocks/services/parts-mock/parts.handler.ts index 7a7d7813e7..6b92f2edbc 100644 --- a/frontend/src/app/mocks/services/parts-mock/parts.handler.ts +++ b/frontend/src/app/mocks/services/parts-mock/parts.handler.ts @@ -26,33 +26,33 @@ import { getAssetById, mockBmwAssets } from './parts.model'; import { mockAssetList, mockAssets } from './parts.test.model'; export const partsHandlers = [ - rest.get(`*${environment.apiUrl}/assets`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built`, (req, res, ctx) => { const pagination = extractPagination(req); return res(ctx.status(200), ctx.json(applyPagination(mockBmwAssets, pagination))); }), - rest.post(`*${environment.apiUrl}/assets/detail-information`, async (req, res, ctx) => { + rest.post(`*${environment.apiUrl}/assets/as-built/detail-information`, async (req, res, ctx) => { const { assetIds } = await req.json(); const response = assetIds.map(id => getAssetById(id)); return res(ctx.status(200), ctx.json(response.filter(data => !!data))); }), - rest.get(`*${environment.apiUrl}/assets/:partId`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built/:partId`, (req, res, ctx) => { const { partId } = req.params; const currentAsset = getAssetById(partId as string); return res(ctx.status(200), ctx.json(currentAsset)); }), - rest.patch(`*${environment.apiUrl}/assets/:partId`, (req, res, ctx) => { + rest.patch(`*${environment.apiUrl}/assets/as-built/:partId`, (req, res, ctx) => { const { partId } = req.params; const currentPart = getAssetById(partId as string); return res(ctx.status(200), ctx.json({ ...currentPart, ...req.json() })); }), - rest.get(`*${environment.apiUrl}/assets/:assetId/children/:childId`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built/:assetId/children/:childId`, (req, res, ctx) => { const { childId } = req.params; const currentAsset = getAssetById(childId as string); return res(ctx.status(200), ctx.json(currentAsset)); @@ -60,34 +60,34 @@ export const partsHandlers = [ ]; export const partsHandlersTest = [ - rest.get(`*${environment.apiUrl}/assets`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built`, (req, res, ctx) => { return res(ctx.status(200), ctx.json(mockAssets)); }), - rest.get(`*${environment.apiUrl}/assets/my`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built/my`, (req, res, ctx) => { return res(ctx.status(200), ctx.json(mockAssets)); }), - rest.post(`*${environment.apiUrl}/assets/detail-information`, async (req, res, ctx) => { + rest.post(`*${environment.apiUrl}/assets/as-built/detail-information`, async (req, res, ctx) => { const { assetIds } = await req.json(); const response = assetIds.map(id => mockAssetList[id] || getAssetById(id)); return res(ctx.status(200), ctx.json(response.filter(data => !!data))); }), - rest.get(`*${environment.apiUrl}/assets/:partId`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built/:partId`, (req, res, ctx) => { const { partId } = req.params; const currentAsset = mockAssetList[partId as string]; return res(ctx.status(200), ctx.json(currentAsset)); }), - rest.patch(`*${environment.apiUrl}/assets/:partId`, (req, res, ctx) => { + rest.patch(`*${environment.apiUrl}/assets/as-built/:partId`, (req, res, ctx) => { const { partId } = req.params; const currentPart = mockAssetList[partId as string]; return res(ctx.status(200), ctx.json({ ...currentPart, ...req.json() })); }), - rest.get(`*${environment.apiUrl}/assets/:assetId/children/:childId`, (req, res, ctx) => { + rest.get(`*${environment.apiUrl}/assets/as-built/:assetId/children/:childId`, (req, res, ctx) => { const { childId } = req.params; const currentAsset = mockAssetList[childId as string]; return res(ctx.status(200), ctx.json(currentAsset)); diff --git a/frontend/src/app/modules/page/other-parts/core/other-parts.service.ts b/frontend/src/app/modules/page/other-parts/core/other-parts.service.ts index d6323465b8..4013f027c8 100644 --- a/frontend/src/app/modules/page/other-parts/core/other-parts.service.ts +++ b/frontend/src/app/modules/page/other-parts/core/other-parts.service.ts @@ -45,7 +45,7 @@ export class OtherPartsService { .set('owner', 'SUPPLIER'); return this.apiService - .getBy(`${this.url}/assets`, params) + .getBy(`${this.url}/assets/as-built`, params) .pipe(map(parts => PartsAssembler.assembleOtherParts(parts))); } @@ -58,7 +58,7 @@ export class OtherPartsService { .set('owner', 'CUSTOMER'); return this.apiService - .getBy(`${this.url}/assets`, params) + .getBy(`${this.url}/assets/as-built`, params) .pipe(map(parts => PartsAssembler.assembleOtherParts(parts))); } } diff --git a/frontend/src/app/modules/shared/service/parts.service.ts b/frontend/src/app/modules/shared/service/parts.service.ts index 6049d88b3a..1d2c68e95c 100644 --- a/frontend/src/app/modules/shared/service/parts.service.ts +++ b/frontend/src/app/modules/shared/service/parts.service.ts @@ -47,25 +47,25 @@ export class PartsService { .set('owner', 'OWN'); return this.apiService - .getBy(`${this.url}/assets`, params) + .getBy(`${this.url}/assets/as-built`, params) .pipe(map(parts => PartsAssembler.assembleParts(parts))); } public getPart(id: string): Observable { return this.apiService - .get(`${this.url}/assets/${id}`) + .get(`${this.url}/assets/as-built/${id}`) .pipe(map(part => PartsAssembler.assemblePart(part))); } public patchPart({ qualityType, id }: Part): Observable { const patchBody = { qualityType }; - return this.apiService.patch(`${this.url}/assets/${id}`, patchBody); + return this.apiService.patch(`${this.url}/assets/as-built/${id}`, patchBody); } public getPartDetailOfIds(assetIds: string[]): Observable { return this.apiService - .post(`${this.url}/assets/detail-information`, { assetIds }) + .post(`${this.url}/assets/as-built/detail-information`, { assetIds }) .pipe(map(parts => PartsAssembler.assemblePartList(parts))); } From 3674515dba4d431fa49c341a27e90264e22f2289 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 21:43:21 +0200 Subject: [PATCH 43/46] chore: TRACEFOSS-1730 adapt frontend api to use assets/as-built by default --- CHANGELOG.md | 1 + .../application/DecentralRegistryService.java | 2 + .../application/RegistryController.java | 43 +++++++++++++++++++ .../application/ShellDescriptorService.java | 2 + .../repository/ShellDescriptorRepository.java | 2 + .../service/DecentralRegistryServiceImpl.java | 7 ++- .../service/ShellDescriptorsServiceImpl.java | 11 +++-- .../jpa/ShellDescriptorRepositoryImpl.java | 7 +++ 8 files changed, 71 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf6f1e76db..ff25bfe3c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Refactored asset structure to allow new API for assets-as-planned - Optional parameter "receiverBpn" to /investigations endpoint - NEW API /api/assets/as-planned +- NEW API DELETE /api/registry ### Changed - API BREAKING CHANGE: /api/assets changed to /api/assets/as-built diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java index 2c2b06e42b..31a0273d57 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java @@ -20,4 +20,6 @@ public interface DecentralRegistryService { void updateShellDescriptorAndSynchronizeAssets(); + + void deleteAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java index 539e874c4e..b2d0f51fc1 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java @@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -83,4 +84,46 @@ public class RegistryController { public void reload() { decentralRegistryService.updateShellDescriptorAndSynchronizeAssets(); } + + @Operation(operationId = "deleteAll", + summary = "Triggers deleteAll of shell descriptors list", + tags = {"Registry"}, + description = "The endpoint deletes all shell descriptors.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "202", description = "Created registry reload job."), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @DeleteMapping() + public void deleteAll() { + decentralRegistryService.deleteAll(); + } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java index 0bbe2ce413..a40568adf3 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java @@ -24,4 +24,6 @@ public interface ShellDescriptorService { List determineExistingShellDescriptorsAndUpdate(List ownShellDescriptors); + + void deleteAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/repository/ShellDescriptorRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/repository/ShellDescriptorRepository.java index a90ddb2cfe..481733c093 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/repository/ShellDescriptorRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/repository/ShellDescriptorRepository.java @@ -33,4 +33,6 @@ public interface ShellDescriptorRepository { void update(ShellDescriptor shellDescriptor); void saveAll(Collection values); void removeDescriptorsByUpdatedBefore(ZonedDateTime now); + + void deleteAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java index 2e9410e6bf..75cb3a77bc 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/DecentralRegistryServiceImpl.java @@ -50,7 +50,6 @@ public class DecentralRegistryServiceImpl implements DecentralRegistryService { @Async(value = AssetsAsyncConfig.LOAD_SHELL_DESCRIPTORS_EXECUTOR) public void updateShellDescriptorAndSynchronizeAssets() { List shellDescriptorList = decentralRegistryRepository.retrieveShellDescriptorsByBpn(traceabilityProperties.getBpn().toString()); - List updatedShellDescriptorList = shellDescriptorsService.determineExistingShellDescriptorsAndUpdate(shellDescriptorList); updatedShellDescriptorList.stream() .map(ShellDescriptor::getGlobalAssetId) @@ -60,5 +59,11 @@ public void updateShellDescriptorAndSynchronizeAssets() { }); } + public void deleteAll(){ + shellDescriptorsService.deleteAll(); + log.info("Deleted all shell descriptors"); + } + + } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java index ba63925f1c..397d7b4795 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java @@ -54,17 +54,22 @@ public List determineExistingShellDescriptorsAndUpdate(List values) { public void removeDescriptorsByUpdatedBefore(ZonedDateTime now) { repository.deleteAllByUpdatedBefore(now); } + + @Override + public void deleteAll() { + repository.deleteAll(); + } + + } From b76fc5c00c72f63b8098246ada8ac4fd23c7cdd9 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 22:05:15 +0200 Subject: [PATCH 44/46] feature: TRACEFOSS-XXX added removeAll and findAll API shellDescriptors --- .../application/DecentralRegistryService.java | 5 +- .../application/RegistryController.java | 42 ------- .../application/ShellDescriptorService.java | 2 + .../rest/ShellDescriptorController.java | 111 ++++++++++++++++++ .../service/ShellDescriptorsServiceImpl.java | 5 + 5 files changed, 122 insertions(+), 43 deletions(-) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java index 31a0273d57..8406e83747 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/DecentralRegistryService.java @@ -18,8 +18,11 @@ ********************************************************************************/ package org.eclipse.tractusx.traceability.shelldescriptor.application; +import org.eclipse.tractusx.traceability.shelldescriptor.domain.model.ShellDescriptor; + +import java.util.List; + public interface DecentralRegistryService { void updateShellDescriptorAndSynchronizeAssets(); - void deleteAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java index b2d0f51fc1..8c1c9587fc 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/RegistryController.java @@ -30,7 +30,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.eclipse.tractusx.traceability.common.response.ErrorResponse; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -85,45 +84,4 @@ public void reload() { decentralRegistryService.updateShellDescriptorAndSynchronizeAssets(); } - @Operation(operationId = "deleteAll", - summary = "Triggers deleteAll of shell descriptors list", - tags = {"Registry"}, - description = "The endpoint deletes all shell descriptors.", - security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) - @ApiResponses(value = {@ApiResponse(responseCode = "202", description = "Created registry reload job."), - @ApiResponse( - responseCode = "400", - description = "Bad request.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "401", - description = "Authorization failed.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - - @ApiResponse( - responseCode = "403", - description = "Forbidden.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "429", - description = "Too many requests.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class))), - @ApiResponse( - responseCode = "500", - description = "Internal server error.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ErrorResponse.class)))}) - @DeleteMapping() - public void deleteAll() { - decentralRegistryService.deleteAll(); - } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java index a40568adf3..78c5ea0882 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/ShellDescriptorService.java @@ -26,4 +26,6 @@ public interface ShellDescriptorService { List determineExistingShellDescriptorsAndUpdate(List ownShellDescriptors); void deleteAll(); + + List findAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java new file mode 100644 index 0000000000..5896b416cc --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java @@ -0,0 +1,111 @@ +package org.eclipse.tractusx.traceability.shelldescriptor.application.rest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.eclipse.tractusx.traceability.common.response.ErrorResponse; +import org.eclipse.tractusx.traceability.shelldescriptor.application.ShellDescriptorService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") +@Tag(name = "ShellDescriptorController", description = "Shell Descriptor Controller") +@RequiredArgsConstructor +@RequestMapping(path = "/assets/as-built", produces = "application/json", consumes = "application/json") +public class ShellDescriptorController { + private final ShellDescriptorService shellDescriptorService; + + @Operation(operationId = "findAll", + summary = "FindAll shell descriptors", + tags = {"ShellDescriptorController"}, + description = "The endpoint returns all shell descriptors.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "ShellDescriptors found."), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @GetMapping() + public void findAll() { + shellDescriptorService.findAll(); + } + + @Operation(operationId = "deleteAll", + summary = "Triggers deleteAll of shell descriptors list", + tags = {"Registry"}, + description = "The endpoint deletes all shell descriptors.", + security = @SecurityRequirement(name = "oAuth2", scopes = "profile email")) + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Deleted."), + @ApiResponse( + responseCode = "400", + description = "Bad request.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "401", + description = "Authorization failed.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + + @ApiResponse( + responseCode = "403", + description = "Forbidden.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "429", + description = "Too many requests.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "Internal server error.", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class)))}) + @DeleteMapping() + public void deleteAll() { + shellDescriptorService.deleteAll(); + } + +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java index 397d7b4795..73e26f5e9a 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/domain/service/ShellDescriptorsServiceImpl.java @@ -72,4 +72,9 @@ public List determineExistingShellDescriptorsAndUpdate(List findAll(){ + return shellDescriptorRepository.findAll(); + } } From 6ddb7b43376b20ed878916e74ff8c699abed1055 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 22:10:25 +0200 Subject: [PATCH 45/46] chore: TRACEFOSS-1730 adapt frontend api to use assets/as-built by default --- .../tractusx/traceability/test/tooling/rest/RestProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java b/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java index 86af47afff..6d30caa16c 100644 --- a/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java +++ b/tx-cucumber-tests/src/test/java/org/eclipse/tractusx/traceability/test/tooling/rest/RestProvider.java @@ -216,7 +216,7 @@ public List getAssets(String ownerFilter) { return given().spec(getRequestSpecification()) .contentType(ContentType.JSON) .when() - .get("/api/assets?owner=" + ownerFilter + "&page=0&size=50") + .get("/api/assets/as-built?owner=" + ownerFilter + "&page=0&size=50") .then() .statusCode(HttpStatus.SC_OK) .extract() From f41192496bd6daa6ebcb354136379a06f0f4b5c9 Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Tue, 29 Aug 2023 22:16:46 +0200 Subject: [PATCH 46/46] chore: TRACEFOSS-1730 adapt frontend api to use assets/as-built by default --- .../application/rest/ShellDescriptorController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java index 5896b416cc..fc29fc71d9 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/shelldescriptor/application/rest/ShellDescriptorController.java @@ -20,7 +20,7 @@ @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERVISOR', 'ROLE_USER')") @Tag(name = "ShellDescriptorController", description = "Shell Descriptor Controller") @RequiredArgsConstructor -@RequestMapping(path = "/assets/as-built", produces = "application/json", consumes = "application/json") +@RequestMapping(path = "/shelldescriptors", produces = "application/json", consumes = "application/json") public class ShellDescriptorController { private final ShellDescriptorService shellDescriptorService;