Skip to content

Commit

Permalink
feat: editable assets
Browse files Browse the repository at this point in the history
  • Loading branch information
richardtreier committed Jan 9, 2024
1 parent c8323d1 commit 4dc22cb
Show file tree
Hide file tree
Showing 10 changed files with 362 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ please see [changelog_updates.md](docs/dev/changelog_updates.md).

#### Minor Changes

- UI API: New endpoint "editAsset"
- Added `JWKS-Extension`, which provides an endpoint in the default API, that returns the JWKS of the connector.
- Added shortDescriptionText to `UiAsset`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import de.sovity.edc.ext.wrapper.api.common.model.PolicyDefinitionCreateRequest;
import de.sovity.edc.ext.wrapper.api.common.model.UiAsset;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetCreateRequest;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetEditRequest;
import de.sovity.edc.ext.wrapper.api.ui.model.AssetPage;
import de.sovity.edc.ext.wrapper.api.ui.model.ContractAgreementPage;
import de.sovity.edc.ext.wrapper.api.ui.model.ContractDefinitionPage;
Expand All @@ -36,6 +37,7 @@
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
Expand Down Expand Up @@ -67,6 +69,13 @@ interface UiResource {
@Operation(description = "Create a new Asset")
IdResponseDto createAsset(UiAssetCreateRequest uiAssetCreateRequest);

@PUT
@Path("pages/asset-page/assets/{assetId}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Updates an Asset")
IdResponseDto editAsset(@PathParam("assetId") String assetId, UiAssetEditRequest uiAssetEditRequest);

@DELETE
@Path("pages/asset-page/assets/{assetId}")
@Produces(MediaType.APPLICATION_JSON)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright (c) 2022 sovity 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:
* sovity GmbH - initial API and implementation
*
*/

package de.sovity.edc.ext.wrapper.api.common.model;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;
import java.util.Map;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "Data for editing an asset.")
public class UiAssetEditRequest {
@Schema(description = "Asset Title", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String title;

@Schema(description = "Asset Language", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String language;

@Schema(description = "Asset Description", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String description;

@Schema(description = "Asset Homepage", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String publisherHomepage;

@Schema(description = "License URL", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String licenseUrl;

@Schema(description = "Version", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String version;

@Schema(description = "Asset Keywords", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private List<String> keywords;

@Schema(description = "Asset MediaType", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String mediaType;

@Schema(description = "Landing Page URL", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String landingPageUrl;

@Schema(description = "Data Category", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String dataCategory;

@Schema(description = "Data Subcategory", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String dataSubcategory;

@Schema(description = "Data Model", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String dataModel;

@Schema(description = "Geo-Reference Method", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String geoReferenceMethod;

@Schema(description = "Transport Mode", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String transportMode;

@Schema(description = "Data Address", requiredMode = Schema.RequiredMode.REQUIRED)
private Map<String, String> dataAddressProperties;

@Schema(description = "Custom Asset Properties (that are strings)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Map<String, String> additionalProperties;

@Schema(description = "Custom Asset Properties (that are not strings but other JSON values)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Map<String, String> additionalJsonProperties;

@Schema(description = "Private Asset Properties (that are strings)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Map<String, String> privateProperties;

@Schema(description = "Private Asset Properties (that are not strings but other JSON values)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Map<String, String> privateJsonProperties;
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import de.sovity.edc.ext.wrapper.api.ui.UiResourceImpl;
import de.sovity.edc.ext.wrapper.api.ui.pages.asset.AssetApiService;
import de.sovity.edc.ext.wrapper.api.ui.pages.asset.AssetIdValidator;
import de.sovity.edc.ext.wrapper.api.ui.pages.asset.AssetUpdater;
import de.sovity.edc.ext.wrapper.api.ui.pages.catalog.CatalogApiService;
import de.sovity.edc.ext.wrapper.api.ui.pages.contract_agreements.ContractAgreementPageApiService;
import de.sovity.edc.ext.wrapper.api.ui.pages.contract_agreements.ContractAgreementTransferApiService;
Expand Down Expand Up @@ -177,10 +178,11 @@ public static WrapperExtensionContext buildContext(
);
var contractAgreementUtils = new ContractAgreementUtils(contractAgreementService);
var assetIdValidator = new AssetIdValidator();
var assetUpdater = new AssetUpdater(assetMapper, assetIdValidator, selfDescriptionService);
var assetApiService = new AssetApiService(
assetService,
assetMapper,
assetIdValidator,
assetUpdater,
selfDescriptionService
);
var transferRequestBuilder = new TransferRequestBuilder(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import de.sovity.edc.ext.wrapper.api.common.model.PolicyDefinitionCreateRequest;
import de.sovity.edc.ext.wrapper.api.common.model.UiAsset;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetCreateRequest;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetEditRequest;
import de.sovity.edc.ext.wrapper.api.ui.model.AssetPage;
import de.sovity.edc.ext.wrapper.api.ui.model.ContractAgreementPage;
import de.sovity.edc.ext.wrapper.api.ui.model.InitiateCustomTransferRequest;
Expand Down Expand Up @@ -74,6 +75,11 @@ public IdResponseDto createAsset(UiAssetCreateRequest uiAssetCreateRequest) {
return assetApiService.createAsset(uiAssetCreateRequest);
}

@Override
public IdResponseDto editAsset(String assetId, UiAssetEditRequest uiAssetEditRequest) {
return assetApiService.editAsset(assetId, uiAssetEditRequest);
}

@Override
public IdResponseDto deleteAsset(String assetId) {
return assetApiService.deleteAsset(assetId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import de.sovity.edc.ext.wrapper.api.common.mappers.AssetMapper;
import de.sovity.edc.ext.wrapper.api.common.model.UiAsset;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetCreateRequest;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetEditRequest;
import de.sovity.edc.ext.wrapper.api.ui.model.IdResponseDto;
import de.sovity.edc.ext.wrapper.api.ui.pages.dashboard.services.SelfDescriptionService;
import lombok.RequiredArgsConstructor;
Expand All @@ -28,12 +29,13 @@

import java.util.Comparator;
import java.util.List;
import java.util.Objects;

@RequiredArgsConstructor
public class AssetApiService {
private final AssetService assetService;
private final AssetMapper assetMapper;
private final AssetIdValidator assetIdValidator;
private final AssetUpdater assetUpdater;
private final SelfDescriptionService selfDescriptionService;

public List<UiAsset> getAssets() {
Expand All @@ -47,13 +49,19 @@ public List<UiAsset> getAssets() {

@NotNull
public IdResponseDto createAsset(UiAssetCreateRequest request) {
assetIdValidator.assertValid(request.getId());
var organizationName = selfDescriptionService.getCuratorName();
var asset = assetMapper.buildAsset(request, organizationName);
var asset = assetUpdater.createAsset(request);
asset = assetService.create(asset).orElseThrow(ServiceException::new);
return new IdResponseDto(asset.getId());
}

public IdResponseDto editAsset(String assetId, UiAssetEditRequest request) {
var asset = assetService.findById(assetId);
Objects.requireNonNull(asset, "Asset with ID %s not found".formatted(assetId));
asset = assetUpdater.editAsset(asset, request);
asset = assetService.update(asset).orElseThrow(ServiceException::new);
return new IdResponseDto(asset.getId());
}

@NotNull
public IdResponseDto deleteAsset(String assetId) {
var response = assetService.delete(assetId).orElseThrow(ServiceException::new);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2022 sovity 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:
* sovity GmbH - initial API and implementation
*
*/

package de.sovity.edc.ext.wrapper.api.ui.pages.asset;

import de.sovity.edc.ext.wrapper.api.common.mappers.AssetMapper;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetCreateRequest;
import de.sovity.edc.ext.wrapper.api.common.model.UiAssetEditRequest;
import de.sovity.edc.ext.wrapper.api.ui.pages.dashboard.services.SelfDescriptionService;
import lombok.RequiredArgsConstructor;
import org.eclipse.edc.spi.types.domain.asset.Asset;

@RequiredArgsConstructor
public class AssetUpdater {
private final AssetMapper assetMapper;
private final AssetIdValidator assetIdValidator;
private final SelfDescriptionService selfDescriptionService;

/**
* Creates an {@link Asset} from a {@link UiAssetCreateRequest}.
*
* @param request {@link UiAssetCreateRequest}
* @return {@link Asset}
*/
public Asset createAsset(UiAssetCreateRequest request) {
assetIdValidator.assertValid(request.getId());
var organizationName = selfDescriptionService.getCuratorName();
return assetMapper.buildAsset(request, organizationName);
}

/**
* Returns an edited copy of an {@link Asset} updated with a {@link UiAssetEditRequest}
*
* @param asset {@link Asset} (immutable)
* @param request {@link UiAssetEditRequest}
* @return copy of {@link Asset}
*/
public Asset editAsset(Asset asset, UiAssetEditRequest request) {
var createRequest = buildCreateRequest(asset.getId(), request);
var tmpAsset = createAsset(createRequest);

return asset.toBuilder()
.dataAddress(tmpAsset.getDataAddress())
.properties(tmpAsset.getProperties())
.privateProperties(tmpAsset.getPrivateProperties())
.build();
}


private UiAssetCreateRequest buildCreateRequest(String id, UiAssetEditRequest editRequest) {
var createRequest = new UiAssetCreateRequest();
createRequest.setId(id);
createRequest.setAdditionalJsonProperties(editRequest.getAdditionalJsonProperties());
createRequest.setAdditionalProperties(editRequest.getAdditionalProperties());
createRequest.setDataAddressProperties(editRequest.getDataAddressProperties());
createRequest.setDataCategory(editRequest.getDataCategory());
createRequest.setDataModel(editRequest.getDataModel());
createRequest.setDataSubcategory(editRequest.getDataSubcategory());
createRequest.setDescription(editRequest.getDescription());
createRequest.setGeoReferenceMethod(editRequest.getGeoReferenceMethod());
createRequest.setKeywords(editRequest.getKeywords());
createRequest.setLandingPageUrl(editRequest.getLandingPageUrl());
createRequest.setLanguage(editRequest.getLanguage());
createRequest.setLicenseUrl(editRequest.getLicenseUrl());
createRequest.setMediaType(editRequest.getMediaType());
createRequest.setPrivateJsonProperties(editRequest.getPrivateJsonProperties());
createRequest.setPrivateProperties(editRequest.getPrivateProperties());
createRequest.setPublisherHomepage(editRequest.getPublisherHomepage());
createRequest.setTitle(editRequest.getTitle());
createRequest.setTransportMode(editRequest.getTransportMode());
createRequest.setVersion(editRequest.getVersion());
return createRequest;
}

}
Loading

0 comments on commit 4dc22cb

Please sign in to comment.