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(DataManagementApi): returns id in Assest, Policy and Contract de… #2012

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
1,277 changes: 647 additions & 630 deletions docs/swaggerui/swagger-spec.js

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright (c) 2022 T-Systems International GmbH
*
* 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
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* T-Systems International GmbH
*
*/

package org.eclipse.dataspaceconnector.api.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;

@JsonDeserialize(builder = IdResponseDto.Builder.class)
public class IdResponseDto extends BaseResponseDto {
private String id;

public IdResponseDto() {
}

public String getId() {
return id;
}

@JsonPOJOBuilder(withPrefix = "")
public static final class Builder extends BaseResponseDto.Builder<IdResponseDto, Builder> {
private Builder() {
super(new IdResponseDto());
}

@JsonCreator
public static Builder newInstance() {
return new Builder();
}

@Override
public Builder self() {
return this;
}

public Builder id(String id) {
dto.id = id;
return this;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (c) 2022 T-Systems International GmbH
*
* 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
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* T-Systems International GmbH
*
*/

package org.eclipse.dataspaceconnector.api.model;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class IdResponseDtoTest {

private ObjectMapper objectMapper;

@BeforeEach
void setUp() {
objectMapper = new ObjectMapper();
}

@Test
void verifySerialization() throws JsonProcessingException {
var assetDto = IdResponseDto.Builder.newInstance().id("assetId").createdAt(1664209047728L).build();

var str = objectMapper.writeValueAsString(assetDto);

assertThat(str).isNotNull();

var deserialized = objectMapper.readValue(str, IdResponseDto.class);
assertThat(deserialized).usingRecursiveComparison().isEqualTo(assetDto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import jakarta.validation.Valid;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetEntryDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetResponseDto;
import org.eclipse.dataspaceconnector.api.model.IdResponseDto;
import org.eclipse.dataspaceconnector.api.query.QuerySpecDto;
import org.eclipse.dataspaceconnector.spi.ApiErrorDetail;

Expand All @@ -35,13 +36,14 @@ public interface AssetApi {

@Operation(description = "Creates a new asset together with a data address",
responses = {
@ApiResponse(responseCode = "200", description = "Asset was created successfully"),
@ApiResponse(responseCode = "200", description = "Asset was created successfully. Returns the asset Id and created timestamp",
content = @Content(schema = @Schema(implementation = IdResponseDto.class))),
@ApiResponse(responseCode = "400", description = "Request body was malformed",
content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))),
@ApiResponse(responseCode = "409", description = "Could not create asset, because an asset with that ID already exists",
content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))) }
)
void createAsset(@Valid AssetEntryDto assetEntryDto);
IdResponseDto createAsset(@Valid AssetEntryDto assetEntryDto);

@Operation(description = "Gets all assets according to a particular query",
responses = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetEntryDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetResponseDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.service.AssetService;
import org.eclipse.dataspaceconnector.api.model.IdResponseDto;
import org.eclipse.dataspaceconnector.api.query.QuerySpecDto;
import org.eclipse.dataspaceconnector.api.transformer.DtoTransformerRegistry;
import org.eclipse.dataspaceconnector.spi.exception.InvalidRequestException;
Expand Down Expand Up @@ -64,7 +65,7 @@ public AssetApiController(Monitor monitor, AssetService service, DtoTransformerR

@POST
@Override
public void createAsset(@Valid AssetEntryDto assetEntryDto) {
public IdResponseDto createAsset(@Valid AssetEntryDto assetEntryDto) {
var assetResult = transformerRegistry.transform(assetEntryDto.getAsset(), Asset.class);
var dataAddressResult = transformerRegistry.transform(assetEntryDto.getDataAddress(), DataAddress.class);

Expand All @@ -80,6 +81,11 @@ public void createAsset(@Valid AssetEntryDto assetEntryDto) {

if (result.succeeded()) {
monitor.debug(format("Asset created %s", assetEntryDto.getAsset()));
var resultContent = result.getContent();
return IdResponseDto.Builder.newInstance()
.id(resultContent.getId())
.createdAt(resultContent.getCreatedAt())
.build();
} else {
throw mapToException(result, Asset.class, asset.getId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import static org.eclipse.dataspaceconnector.junit.testfixtures.TestUtils.getFreePort;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;

@ExtendWith(EdcExtension.class)
public class AssetApiControllerIntegrationTest {
Expand Down Expand Up @@ -126,7 +127,10 @@ void postAsset(AssetIndex assetIndex) {
.contentType(JSON)
.post("/assets")
.then()
.statusCode(204);
.statusCode(200)
.contentType(JSON)
.body("id", is("assetId"))
.body("createdAt", not("0"));
assertThat(assetIndex.findById("assetId")).isNotNull();
}

Expand All @@ -141,7 +145,9 @@ void postAsset_supportOldIdAsPropertyApi(AssetIndex assetIndex) {
.contentType(JSON)
.post("/assets")
.then()
.statusCode(204);
.statusCode(200)
.contentType(JSON)
.body("id", is("assetId"));
assertThat(assetIndex.findById("assetId")).isNotNull();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@

package org.eclipse.dataspaceconnector.api.datamanagement.asset;


import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetEntryDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetRequestDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.AssetResponseDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.model.DataAddressDto;
import org.eclipse.dataspaceconnector.api.datamanagement.asset.service.AssetService;
import org.eclipse.dataspaceconnector.api.model.IdResponseDto;
import org.eclipse.dataspaceconnector.api.query.QuerySpecDto;
import org.eclipse.dataspaceconnector.api.result.ServiceResult;
import org.eclipse.dataspaceconnector.api.transformer.DtoTransformerRegistry;
Expand All @@ -36,6 +38,7 @@
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.UUID;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
Expand Down Expand Up @@ -70,13 +73,36 @@ void createAsset() {
when(transformerRegistry.transform(isA(DataAddressDto.class), eq(DataAddress.class))).thenReturn(Result.success(DataAddress.Builder.newInstance().type("any").build()));
when(service.create(any(), any())).thenReturn(ServiceResult.success(asset));

controller.createAsset(assetEntry);
var assetId = controller.createAsset(assetEntry);

assertThat(assetId).isNotNull();
assertThat(assetId.getId()).isNotEmpty();
assertThat(assetId).isInstanceOf(IdResponseDto.class);
assertThat(assetId.getCreatedAt()).isNotEqualTo(0L);

verify(transformerRegistry).transform(any(), eq(Asset.class));
verify(transformerRegistry).transform(any(), eq(DataAddress.class));
verify(service).create(isA(Asset.class), isA(DataAddress.class));
}

@Test
void createAsset_returnExpectedId() {
var assetId = UUID.randomUUID().toString();
var assetEntry = AssetEntryDto.Builder.newInstance()
.asset(AssetRequestDto.Builder.newInstance().build())
.dataAddress(DataAddressDto.Builder.newInstance().build())
.build();

var asset = Asset.Builder.newInstance().id(assetId).build();
when(transformerRegistry.transform(isA(AssetRequestDto.class), eq(Asset.class))).thenReturn(Result.success(asset));
when(transformerRegistry.transform(isA(DataAddressDto.class), eq(DataAddress.class))).thenReturn(Result.success(DataAddress.Builder.newInstance().type("any").build()));
when(service.create(any(), any())).thenReturn(ServiceResult.success(asset));

var returnedAssetId = controller.createAsset(assetEntry);
assertThat(returnedAssetId).isNotNull();
assertThat(returnedAssetId.getId()).isEqualTo(assetId);
}

@Test
void createAsset_alreadyExists() {
var assetEntry = AssetEntryDto.Builder.newInstance()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import jakarta.validation.Valid;
import org.eclipse.dataspaceconnector.api.datamanagement.contractdefinition.model.ContractDefinitionRequestDto;
import org.eclipse.dataspaceconnector.api.datamanagement.contractdefinition.model.ContractDefinitionResponseDto;
import org.eclipse.dataspaceconnector.api.model.IdResponseDto;
import org.eclipse.dataspaceconnector.api.query.QuerySpecDto;
import org.eclipse.dataspaceconnector.spi.ApiErrorDetail;

Expand Down Expand Up @@ -57,13 +58,14 @@ public interface ContractDefinitionApi {

@Operation(description = "Creates a new contract definition",
responses = {
@ApiResponse(responseCode = "200", description = "contract definition was created successfully"),
@ApiResponse(responseCode = "200", description = "contract definition was created successfully. Returns the Contract Definition Id and created timestamp",
content = @Content(schema = @Schema(implementation = IdResponseDto.class))),
@ApiResponse(responseCode = "400", description = "Request body was malformed",
content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))),
@ApiResponse(responseCode = "409", description = "Could not create contract definition, because a contract definition with that ID already exists",
content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))) }
)
void createContractDefinition(@Valid ContractDefinitionRequestDto dto);
IdResponseDto createContractDefinition(@Valid ContractDefinitionRequestDto dto);

@Operation(description = "Removes a contract definition with the given ID if possible. " +
"DANGER ZONE: Note that deleting contract definitions can have unexpected results, especially for contract offers that have been sent out or ongoing or contract negotiations.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.eclipse.dataspaceconnector.api.datamanagement.contractdefinition.model.ContractDefinitionRequestDto;
import org.eclipse.dataspaceconnector.api.datamanagement.contractdefinition.model.ContractDefinitionResponseDto;
import org.eclipse.dataspaceconnector.api.datamanagement.contractdefinition.service.ContractDefinitionService;
import org.eclipse.dataspaceconnector.api.model.IdResponseDto;
import org.eclipse.dataspaceconnector.api.query.QuerySpecDto;
import org.eclipse.dataspaceconnector.api.transformer.DtoTransformerRegistry;
import org.eclipse.dataspaceconnector.spi.exception.InvalidRequestException;
Expand Down Expand Up @@ -98,7 +99,7 @@ public ContractDefinitionResponseDto getContractDefinition(@PathParam("id") Stri

@POST
@Override
public void createContractDefinition(@Valid ContractDefinitionRequestDto dto) {
public IdResponseDto createContractDefinition(@Valid ContractDefinitionRequestDto dto) {
monitor.debug("Create new contract definition");
var transformResult = transformerRegistry.transform(dto, ContractDefinition.class);
if (transformResult.failed()) {
Expand All @@ -110,6 +111,11 @@ public void createContractDefinition(@Valid ContractDefinitionRequestDto dto) {
var result = service.create(contractDefinition);
if (result.succeeded()) {
monitor.debug(format("Contract definition created %s", result.getContent().getId()));
var resultContent = result.getContent();
return IdResponseDto.Builder.newInstance()
.id(resultContent.getId())
.createdAt(resultContent.getCreatedAt())
.build();
} else {
throw new ObjectExistsException(ContractDefinition.class, dto.getId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.eclipse.dataspaceconnector.junit.testfixtures.TestUtils.getFreePort;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;

@ExtendWith(EdcExtension.class)
public class ContractDefinitionApiControllerIntegrationTest {
Expand Down Expand Up @@ -115,7 +116,10 @@ void postContractDefinition(ContractDefinitionStore store) {
.contentType(JSON)
.post("/contractdefinitions")
.then()
.statusCode(204);
.statusCode(200)
.contentType(JSON)
.body("id", is("definitionId"))
.body("createdAt", not("0"));
assertThat(store.findAll(QuerySpec.max())).isNotEmpty();
}

Expand Down
Loading