Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(generic bpm): #384 Gate API: Create input endpoints for generic data model #419

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,7 @@ object CommonDescription {
const val score = "Relative quality score of the match. The higher the better."

const val externalId = "The identifier which uniquely identifies (in the internal system landscape of the sharing member) the business partner."

const val roles = "Roles this business partner takes in relation to the sharing member."

}
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,5 @@ object LegalEntityDescription {
const val states = "The list of (temporary) states of the legal entity."
const val classifications = "The list of classifications of the legal entity, such as a specific industry."
const val relations = "Relations to other business partners."
const val roles = "Roles this business partner takes in relation to the sharing member."

}
Original file line number Diff line number Diff line change
@@ -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.BusinessPartnerInputDto
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<BusinessPartnerInputRequest>): Collection<BusinessPartnerInputDto>

@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 external IDs."
)
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "The requested page of business 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<String>
): PageDto<BusinessPartnerInputDto>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*******************************************************************************
* 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

enum class AddressType {

LegalAndSiteMainAddress,
LegalAddress,
SiteMainAddress,
AdditionalAddress
}
Original file line number Diff line number Diff line change
@@ -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"])
rainer-exxcellent marked this conversation as resolved.
Show resolved Hide resolved
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?
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*******************************************************************************
* 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
import org.eclipse.tractusx.bpdm.gate.api.model.openapidescription.BusinessPartnerAddressDescription

@Schema(description = "Postal address of a input business partner", requiredProperties = ["physicalPostalAddress"])
data class BusinessPartnerPostalAddressInputDto(

@get:Schema( description = BusinessPartnerAddressDescription.addressType)
val addressType: AddressType?,

// 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
)
Original file line number Diff line number Diff line change
@@ -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 = "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
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*******************************************************************************
* 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.CommonDescription

interface IBaseBusinessPartnerInputDto {

@get:Schema(description = CommonDescription.externalId)
val externalId: String

@get:Schema(description = "")
val nameParts: List<String>

@get:Schema(description = "Abbreviated name or shorthand")
val shortName: String?

@get:ArraySchema(arraySchema = Schema(description = "The list of identifiers of the business partner."))
val identifiers: Collection<BusinessPartnerIdentifierDto>

@get:Schema(description = "Technical key of the legal form.")
val legalForm: String?

@get:ArraySchema(arraySchema = Schema(description = "The list of (temporary) states of the business partner."))
val states: Collection<BusinessPartnerStateDto>

@get:ArraySchema(arraySchema = Schema(description = "The list of classifications of the legal entity, such as a specific industry."))
val classifications: Collection<ClassificationDto>

@get:ArraySchema(arraySchema = Schema(description = CommonDescription.roles))
val roles: Collection<BusinessPartnerRole>

@get:Schema(name = "isOwner", description = "True if the sharing member declares itself as the owner of the business partner.")
val isOwner: Boolean
rainer-exxcellent marked this conversation as resolved.
Show resolved Hide resolved

@get:Schema(description = "Address of the official seat of this business partner.")
val postalAddress: BusinessPartnerPostalAddressInputDto

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Business Partner Input is missing the L/S/A BPN fields as described in #382. I'm aware that the OpenAPI snippet for the generic input endpoint description is not up-to-date on this matter and will add it there as well.

Why are the fields needed?
The service provider for the cleaning service will be supported by this information. Also, since especially Sites are hard to infer automatically, it is one of the only ways for a sharing member to tell the cleaning service that an address belongs to a certain existing site.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest we move this change to a separate issue in order to not block depending issues for too long.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, I will put this down in the issue. So we can create a pull request later on


}


Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*******************************************************************************
* 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.openapidescription

object BusinessPartnerAddressDescription {

const val addressType = "Type of the address"
}
Original file line number Diff line number Diff line change
@@ -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(description = "Generic business partner with external id", requiredProperties = ["externalId", "postalAddress"])
data class BusinessPartnerInputRequest(
nicoprow marked this conversation as resolved.
Show resolved Hide resolved
override val externalId: String,
override val nameParts: List<String> = emptyList(),
override val shortName: String?,
override val identifiers: Collection<BusinessPartnerIdentifierDto> = emptyList(),
override val legalForm: String? = null,
override val states: Collection<BusinessPartnerStateDto> = emptyList(),
override val classifications: Collection<ClassificationDto> = emptyList(),
override val roles: Collection<BusinessPartnerRole> = emptyList(),
override val postalAddress: BusinessPartnerPostalAddressInputDto,
override val isOwner: Boolean
) : IBaseBusinessPartnerInputDto
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ data class LegalEntityGateInputRequest(
@field:JsonUnwrapped
val legalEntity: LegalEntityDto,

@get:ArraySchema(arraySchema = Schema(description = LegalEntityDescription.roles))
@get:ArraySchema(arraySchema = Schema(description = CommonDescription.roles))
val roles: Collection<BusinessPartnerRole> = emptyList(),

// TODO OpenAPI description for complex field does not work!!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ data class LegalEntityGateOutputRequest(
@field:JsonUnwrapped
val legalEntity: LegalEntityDto,

@get:ArraySchema(arraySchema = Schema(description = LegalEntityDescription.roles))
@get:ArraySchema(arraySchema = Schema(description = CommonDescription.roles))
val roles: Collection<BusinessPartnerRole> = emptyList(),

// TODO OpenAPI description for complex field does not work!!
Expand Down
Loading