From 655785df9f0c49151d8dab3824e9aca88531909b Mon Sep 17 00:00:00 2001 From: rschneider <97682836+rainer-exxcellent@users.noreply.github.com> Date: Thu, 24 Aug 2023 10:04:27 +0200 Subject: [PATCH] feat(generic bpm): #384 Gate API: Create input endpoints for generic business partner --- .../bpdm/gate/api/GateBusinessPartnerApi.kt | 79 +++++++++++++++++++ .../api/model/BusinessPartnerIdentifierDto.kt | 35 ++++++++ .../model/BusinessPartnerPostalAddressDto.kt | 42 ++++++++++ .../gate/api/model/BusinessPartnerStateDto.kt | 41 ++++++++++ .../api/model/IBaseBusinessPartnerInputDto.kt | 63 +++++++++++++++ .../request/BusinessPartnerInputRequest.kt | 39 +++++++++ .../BusinessPartnerInputResponseDto.kt | 47 +++++++++++ .../controller/BusinessPartnerController.kt | 42 ++++++++++ 8 files changed, 388 insertions(+) create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/GateBusinessPartnerApi.kt create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerIdentifierDto.kt create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerPostalAddressDto.kt create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerStateDto.kt create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/IBaseBusinessPartnerInputDto.kt create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/request/BusinessPartnerInputRequest.kt create mode 100644 bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/response/BusinessPartnerInputResponseDto.kt create mode 100644 bpdm-gate/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/controller/BusinessPartnerController.kt diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/GateBusinessPartnerApi.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/GateBusinessPartnerApi.kt new file mode 100644 index 000000000..e00b63895 --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/GateBusinessPartnerApi.kt @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.media.Content +import io.swagger.v3.oas.annotations.responses.ApiResponse +import io.swagger.v3.oas.annotations.responses.ApiResponses +import jakarta.validation.Valid +import org.eclipse.tractusx.bpdm.common.dto.request.PaginationRequest +import org.eclipse.tractusx.bpdm.common.dto.response.PageDto +import org.eclipse.tractusx.bpdm.gate.api.model.request.BusinessPartnerInputRequest +import org.eclipse.tractusx.bpdm.gate.api.model.response.BusinessPartnerInputResponseDto +import org.springdoc.core.annotations.ParameterObject +import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.service.annotation.HttpExchange +import org.springframework.web.service.annotation.PostExchange +import org.springframework.web.service.annotation.PutExchange + +@RequestMapping("/api/catena", produces = [MediaType.APPLICATION_JSON_VALUE]) +@HttpExchange("/api/catena") +interface GateBusinessPartnerApi { + + @Operation( + summary = "Create or update business partner with given external ID", + description = "Create or update generic business partner. " + + "Updates instead of creating a new business partner if an already existing external id is used. " + + "The same external id may not occur more than once in a single request. " + + "For a single request, the maximum number of business partners in the request is limited to \${bpdm.api.upsert-limit} entries." + ) + @ApiResponses( + value = [ + ApiResponse(responseCode = "200", description = "Business partner were successfully updated or created"), + ApiResponse(responseCode = "400", description = "On malformed legal entity request", content = [Content()]), + ] + ) + @PutMapping("/input/business-partners") + @PutExchange("/input/business-partners") + fun upsertBusinessPartnersInput(@RequestBody businessPartners: Collection): Collection + + @Operation( + summary = "Search business partner by external ID. An empty external ID list returns a paginated list of all business partners.", + description = "Get page of business partners filtered by a collection of externalIds." + ) + @ApiResponses( + value = [ + ApiResponse(responseCode = "200", description = "The requested page of busines partners"), + ApiResponse(responseCode = "400", description = "On malformed pagination request", content = [Content()]), + ] + ) + @PostMapping("/input/business-partners/search") + @PostExchange("/input/business-partners/search") + fun getBusinessPartnersInputByExternalIds( + @ParameterObject @Valid paginationRequest: PaginationRequest, + @RequestBody externalIds: Collection + ): PageDto + +} \ No newline at end of file diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerIdentifierDto.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerIdentifierDto.kt new file mode 100644 index 000000000..813fcf2f4 --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerIdentifierDto.kt @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api.model + +import io.swagger.v3.oas.annotations.media.Schema + +@Schema(description = "Identifier record for a business partner", requiredProperties = ["type"]) +data class BusinessPartnerIdentifierDto( + + @get:Schema(description = "Value of the identifier") + val value: String, + + @get:Schema(description = "Technical key of the type to which this identifier belongs to") + val type: String, + + @get:Schema(description = "Body which issued the identifier") + val issuingBody: String? +) diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerPostalAddressDto.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerPostalAddressDto.kt new file mode 100644 index 000000000..7302ab6cc --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerPostalAddressDto.kt @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api.model + +import io.swagger.v3.oas.annotations.media.Schema +import org.eclipse.tractusx.bpdm.common.dto.AlternativePostalAddressDto +import org.eclipse.tractusx.bpdm.common.dto.openapidescription.LogisticAddressDescription + +@Schema(description = "Postal address of a business partner", requiredProperties = ["physicalPostalAddress"]) +data class BusinessPartnerPostalAddressDto( + + @get:Schema(name = "isLegalAddress", description = LogisticAddressDescription.isLegalAddress) + val isLegalAddress: Boolean = false, + + @get:Schema(name = "isSiteMainAddress", description = LogisticAddressDescription.isMainAddress) + val isSiteMainAddress: Boolean = false, + + // TODO OpenAPI description for complex field does not work!! + @get:Schema(description = LogisticAddressDescription.physicalPostalAddress) + val physicalPostalAddress: PhysicalPostalAddressGateDto, + + // TODO OpenAPI description for complex field does not work!! + @get:Schema(description = LogisticAddressDescription.alternativePostalAddress) + val alternativePostalAddress: AlternativePostalAddressDto? = null +) diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerStateDto.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerStateDto.kt new file mode 100644 index 000000000..aa3e8ccb6 --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/BusinessPartnerStateDto.kt @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api.model + +import io.swagger.v3.oas.annotations.media.Schema +import org.eclipse.tractusx.bpdm.common.dto.openapidescription.LegalEntityStateDescription +import org.eclipse.tractusx.bpdm.common.model.BusinessStateType +import java.time.LocalDateTime + +@Schema(description = LegalEntityStateDescription.header, requiredProperties = ["type"]) +data class BusinessPartnerStateDto( + + @get:Schema(description = "Exact, official denotation of the status") + val description: String?, + + @get:Schema(description = "Date since when the status is/was valid") + val validFrom: LocalDateTime?, + + @get:Schema(description = "Date until the status was valid, if applicable") + val validTo: LocalDateTime?, + + @get:Schema(description = "The type of this specified status") + val type: BusinessStateType +) diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/IBaseBusinessPartnerInputDto.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/IBaseBusinessPartnerInputDto.kt new file mode 100644 index 000000000..04e23fa12 --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/IBaseBusinessPartnerInputDto.kt @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api.model + +import io.swagger.v3.oas.annotations.media.ArraySchema +import io.swagger.v3.oas.annotations.media.Schema +import org.eclipse.tractusx.bpdm.common.dto.ClassificationDto +import org.eclipse.tractusx.bpdm.common.dto.openapidescription.LegalEntityDescription + + +interface IBaseBusinessPartnerInputDto { + + @get:Schema(description = "ID the record has in the external system where the record originates from") + val externalId: String + + @get:Schema(description = "") + val nameParts: List + + @get:Schema(description = "Abbreviated name or shorthand") + val shortName: String? + + @get:ArraySchema(arraySchema = Schema(description = LegalEntityDescription.identifiers)) + val identifiers: Collection + + @get:Schema(description = "Technical key of the legal form") + val legalForm: String? + + @get:ArraySchema(arraySchema = Schema(description = LegalEntityDescription.states)) + val states: Collection + + @get:ArraySchema(arraySchema = Schema(description = LegalEntityDescription.classifications)) + val classifications: Collection + + @get:Schema(description = "Which roles this business partner takes in relation to the sharing member") + val roles: Collection + + @get:Schema(description = "") + val isOwner: Boolean + + @get:Schema(description = "Address of the official seat of this legal entity") + val postalAddress: BusinessPartnerPostalAddressDto + + +} + + diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/request/BusinessPartnerInputRequest.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/request/BusinessPartnerInputRequest.kt new file mode 100644 index 000000000..7773e6038 --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/request/BusinessPartnerInputRequest.kt @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api.model.request + +import io.swagger.v3.oas.annotations.media.Schema +import org.eclipse.tractusx.bpdm.common.dto.ClassificationDto +import org.eclipse.tractusx.bpdm.gate.api.model.* + + +@Schema(name = "BusinessPartnerInputDto", description = "Generic business partner with external id", requiredProperties = ["externalId", "postalAddress"]) +data class BusinessPartnerInputRequest( + override val externalId: String, + override val nameParts: List = emptyList(), + override val shortName: String?, + override val identifiers: Collection = emptyList(), + override val legalForm: String? = null, + override val states: Collection = emptyList(), + override val classifications: Collection = emptyList(), + override val roles: Collection = emptyList(), + override val postalAddress: BusinessPartnerPostalAddressDto, + override val isOwner: Boolean +) : IBaseBusinessPartnerInputDto \ No newline at end of file diff --git a/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/response/BusinessPartnerInputResponseDto.kt b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/response/BusinessPartnerInputResponseDto.kt new file mode 100644 index 000000000..02636a631 --- /dev/null +++ b/bpdm-gate-api/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/api/model/response/BusinessPartnerInputResponseDto.kt @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.api.model.response + +import io.swagger.v3.oas.annotations.media.Schema +import org.eclipse.tractusx.bpdm.common.dto.ClassificationDto +import org.eclipse.tractusx.bpdm.common.dto.openapidescription.CommonDescription +import org.eclipse.tractusx.bpdm.gate.api.model.* +import java.time.Instant + + +@Schema(description = "Generic business partner with external id", requiredProperties = ["externalId", "postalAddress"]) +data class BusinessPartnerInputResponseDto( + override val externalId: String, + override val nameParts: List = emptyList(), + override val shortName: String?, + override val identifiers: Collection = emptyList(), + override val legalForm: String? = null, + override val states: Collection = emptyList(), + override val classifications: Collection = emptyList(), + override val roles: Collection = emptyList(), + override val postalAddress: BusinessPartnerPostalAddressDto, + override val isOwner: Boolean, + + @get:Schema(description = CommonDescription.createdAt) + val createdAt: Instant, + + @get:Schema(description = CommonDescription.updatedAt) + val updatedAt: Instant, +) : IBaseBusinessPartnerInputDto \ No newline at end of file diff --git a/bpdm-gate/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/controller/BusinessPartnerController.kt b/bpdm-gate/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/controller/BusinessPartnerController.kt new file mode 100644 index 000000000..07ec2c102 --- /dev/null +++ b/bpdm-gate/src/main/kotlin/org/eclipse/tractusx/bpdm/gate/controller/BusinessPartnerController.kt @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2021,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.bpdm.gate.controller + +import org.eclipse.tractusx.bpdm.common.dto.request.PaginationRequest +import org.eclipse.tractusx.bpdm.common.dto.response.PageDto +import org.eclipse.tractusx.bpdm.gate.api.GateBusinessPartnerApi +import org.eclipse.tractusx.bpdm.gate.api.model.request.BusinessPartnerInputRequest +import org.eclipse.tractusx.bpdm.gate.api.model.response.BusinessPartnerInputResponseDto +import org.springframework.web.bind.annotation.RestController + +@RestController +class BusinessPartnerController() : GateBusinessPartnerApi { + + override fun upsertBusinessPartnersInput(businessPartners: Collection): Collection { + TODO("Not yet implemented") + } + + override fun getBusinessPartnersInputByExternalIds( + paginationRequest: PaginationRequest, + externalIds: Collection + ): PageDto { + TODO("Not yet implemented") + } +} \ No newline at end of file