This is an automated email from the ASF dual-hosted git repository. machristie pushed a commit to branch custos-integration in repository https://gitbox.apache.org/repos/asf/airavata-data-catalog.git
commit 18a9563642c27947bf5eecb22fa22fb424a416dc Author: Marcus Christie <[email protected]> AuthorDate: Fri Feb 17 17:12:26 2023 -0500 Transactional service layer for data catalog db operations --- .../api/exception/EntityNotFoundException.java | 25 +++ .../api/service/DataCatalogAPIService.java | 178 +++++------------- .../api/service/DataCatalogService.java | 39 ++++ .../api/service/impl/DataCatalogServiceImpl.java | 205 +++++++++++++++++++++ 4 files changed, 316 insertions(+), 131 deletions(-) diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/exception/EntityNotFoundException.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/exception/EntityNotFoundException.java new file mode 100644 index 0000000..7a58b41 --- /dev/null +++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/exception/EntityNotFoundException.java @@ -0,0 +1,25 @@ +package org.apache.airavata.datacatalog.api.exception; + +public class EntityNotFoundException extends RuntimeException { + + public EntityNotFoundException() { + } + + public EntityNotFoundException(String message) { + super(message); + } + + public EntityNotFoundException(Throwable cause) { + super(cause); + } + + public EntityNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public EntityNotFoundException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java index f7a7904..7df3e40 100644 --- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java +++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java @@ -1,7 +1,6 @@ package org.apache.airavata.datacatalog.api.service; import java.util.List; -import java.util.UUID; import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc; import org.apache.airavata.datacatalog.api.DataProduct; @@ -17,6 +16,7 @@ import org.apache.airavata.datacatalog.api.DataProductRemoveFromMetadataSchemaRe import org.apache.airavata.datacatalog.api.DataProductRemoveFromMetadataSchemaResponse; import org.apache.airavata.datacatalog.api.DataProductUpdateRequest; import org.apache.airavata.datacatalog.api.DataProductUpdateResponse; +import org.apache.airavata.datacatalog.api.MetadataSchema; import org.apache.airavata.datacatalog.api.MetadataSchemaCreateRequest; import org.apache.airavata.datacatalog.api.MetadataSchemaCreateResponse; import org.apache.airavata.datacatalog.api.MetadataSchemaDeleteRequest; @@ -32,65 +32,32 @@ import org.apache.airavata.datacatalog.api.MetadataSchemaFieldUpdateRequest; import org.apache.airavata.datacatalog.api.MetadataSchemaFieldUpdateResponse; import org.apache.airavata.datacatalog.api.MetadataSchemaGetRequest; import org.apache.airavata.datacatalog.api.MetadataSchemaGetResponse; -import org.apache.airavata.datacatalog.api.mapper.DataProductMapper; -import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaFieldMapper; -import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaMapper; -import org.apache.airavata.datacatalog.api.model.DataProductEntity; -import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity; -import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity; -import org.apache.airavata.datacatalog.api.repository.DataProductRepository; -import org.apache.airavata.datacatalog.api.repository.MetadataSchemaFieldRepository; -import org.apache.airavata.datacatalog.api.repository.MetadataSchemaRepository; +import org.apache.airavata.datacatalog.api.exception.EntityNotFoundException; import org.lognet.springboot.grpc.GRpcService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import io.grpc.Status; import io.grpc.stub.StreamObserver; @GRpcService -@Transactional public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalogAPIServiceImplBase { private static final Logger logger = LoggerFactory.getLogger(DataCatalogAPIService.class); @Autowired - DataProductRepository dataProductRepository; - - @Autowired - MetadataSchemaRepository metadataSchemaRepository; - - @Autowired - MetadataSchemaFieldRepository metadataSchemaFieldRepository; - - @Autowired - DataProductMapper dataProductMapper; - - @Autowired - MetadataSchemaMapper metadataSchemaMapper; - - @Autowired - MetadataSchemaFieldMapper metadataSchemaFieldMapper; + DataCatalogService dataCatalogService; @Override public void createDataProduct(DataProductCreateRequest request, StreamObserver<DataProductCreateResponse> responseObserver) { - // TODO: SharingManager.resolveUser logger.info("Creating data product {}", request.getDataProduct()); - DataProductEntity dataProductEntity = new DataProductEntity(); - dataProductEntity.setExternalId(UUID.randomUUID().toString()); - dataProductMapper.mapModelToEntity(request.getDataProduct(), dataProductEntity); - DataProductEntity savedDataProductEntity = dataProductRepository.saveAndFlush(dataProductEntity); - // TODO: SharingManager.grantPermissionToUser(userInfo, dataProduct, - // Permission.OWNER) + DataProduct result = dataCatalogService.createDataProduct(request.getDataProduct()); - DataProductCreateResponse.Builder responseBuilder = DataProductCreateResponse.newBuilder(); - dataProductMapper.mapEntityToModel(savedDataProductEntity, responseBuilder.getDataProductBuilder()); - responseObserver.onNext(responseBuilder.build()); + responseObserver.onNext(DataProductCreateResponse.newBuilder().setDataProduct(result).build()); responseObserver.onCompleted(); } @@ -99,29 +66,18 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog StreamObserver<DataProductUpdateResponse> responseObserver) { // TODO: check that user has access to update data product record - // TODO: handle data product does not exist - DataProduct dataProduct = request.getDataProduct(); - DataProductEntity dataProductEntity = dataProductRepository - .findByExternalId(dataProduct.getDataProductId()); - dataProductMapper.mapModelToEntity(dataProduct, dataProductEntity); - - DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity); + DataProduct savedDataProduct = dataCatalogService.updateDataProduct(request.getDataProduct()); - DataProductUpdateResponse.Builder responseBuilder = DataProductUpdateResponse.newBuilder(); - dataProductMapper.mapEntityToModel(savedDataProductEntity, responseBuilder.getDataProductBuilder()); - responseObserver.onNext(responseBuilder.build()); + responseObserver.onNext(DataProductUpdateResponse.newBuilder().setDataProduct(savedDataProduct).build()); responseObserver.onCompleted(); } @Override public void getDataProduct(DataProductGetRequest request, StreamObserver<DataProductGetResponse> responseObserver) { // TODO: check that user has READ access on data product record - // TODO: handle data product does not exist - DataProductEntity dataProductEntity = dataProductRepository - .findByExternalId(request.getDataProductId()); - DataProductGetResponse.Builder responseBuilder = DataProductGetResponse.newBuilder(); - dataProductMapper.mapEntityToModel(dataProductEntity, responseBuilder.getDataProductBuilder()); - responseObserver.onNext(responseBuilder.build()); + DataProduct dataProduct = dataCatalogService.getDataProduct(request.getDataProductId()); + + responseObserver.onNext(DataProductGetResponse.newBuilder().setDataProduct(dataProduct).build()); responseObserver.onCompleted(); } @@ -129,9 +85,9 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog public void deleteDataProduct(DataProductDeleteRequest request, StreamObserver<DataProductDeleteResponse> responseObserver) { // TODO: check that user has WRITE access on data product record - dataProductRepository.deleteByExternalId(request.getDataProductId()); - DataProductDeleteResponse.Builder responseBuilder = DataProductDeleteResponse.newBuilder(); - responseObserver.onNext(responseBuilder.build()); + dataCatalogService.deleteDataProduct(request.getDataProductId()); + + responseObserver.onNext(DataProductDeleteResponse.newBuilder().build()); responseObserver.onCompleted(); } @@ -139,45 +95,35 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog public void addDataProductToMetadataSchema(DataProductAddToMetadataSchemaRequest request, StreamObserver<DataProductAddToMetadataSchemaResponse> responseObserver) { String dataProductId = request.getDataProductId(); - // TODO: handle data product not found - DataProductEntity dataProduct = dataProductRepository.findByExternalId(dataProductId); String schemaName = request.getSchemaName(); - // TODO: handle metadata schema not found - MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository.findBySchemaName(schemaName); - dataProduct.addMetadataSchema(metadataSchemaEntity); - - DataProductAddToMetadataSchemaResponse.Builder responseBuilder = DataProductAddToMetadataSchemaResponse - .newBuilder(); - dataProductMapper.mapEntityToModel(dataProduct, responseBuilder.getDataProductBuilder()); - responseObserver.onNext(responseBuilder.build()); + DataProduct dataProduct = dataCatalogService.addDataProductToMetadataSchema(dataProductId, schemaName); + + responseObserver + .onNext(DataProductAddToMetadataSchemaResponse.newBuilder().setDataProduct(dataProduct).build()); responseObserver.onCompleted(); } @Override public void getMetadataSchema(MetadataSchemaGetRequest request, StreamObserver<MetadataSchemaGetResponse> responseObserver) { - MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository.findBySchemaName(request.getSchemaName()); - if (metadataSchemaEntity == null) { + try { + MetadataSchema metadataSchema = dataCatalogService.getMetadataSchema(request.getSchemaName()); + + responseObserver.onNext(MetadataSchemaGetResponse.newBuilder().setMetadataSchema(metadataSchema).build()); + responseObserver.onCompleted(); + } catch (EntityNotFoundException e) { responseObserver.onError(Status.NOT_FOUND.asException()); responseObserver.onCompleted(); } - MetadataSchemaGetResponse.Builder responseBuilder = MetadataSchemaGetResponse.newBuilder(); - metadataSchemaMapper.mapEntityToModel(metadataSchemaEntity, responseBuilder.getMetadataSchemaBuilder()); - responseObserver.onNext(responseBuilder.build()); - responseObserver.onCompleted(); } @Override public void createMetadataSchema(MetadataSchemaCreateRequest request, StreamObserver<MetadataSchemaCreateResponse> responseObserver) { - MetadataSchemaEntity metadataSchemaEntity = new MetadataSchemaEntity(); - metadataSchemaMapper.mapModelToEntity(request.getMetadataSchema(), metadataSchemaEntity); - MetadataSchemaEntity savedMetadataSchemaEntity = metadataSchemaRepository.save(metadataSchemaEntity); + MetadataSchema metadataSchema = dataCatalogService.createMetadataSchema(request.getMetadataSchema()); - MetadataSchemaCreateResponse.Builder responseBuilder = MetadataSchemaCreateResponse.newBuilder(); - metadataSchemaMapper.mapEntityToModel(savedMetadataSchemaEntity, responseBuilder.getMetadataSchemaBuilder()); - responseObserver.onNext(responseBuilder.build()); + responseObserver.onNext(MetadataSchemaCreateResponse.newBuilder().setMetadataSchema(metadataSchema).build()); responseObserver.onCompleted(); } @@ -185,15 +131,11 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog public void createMetadataSchemaField(MetadataSchemaFieldCreateRequest request, StreamObserver<MetadataSchemaFieldCreateResponse> responseObserver) { - MetadataSchemaFieldEntity metadataSchemaFieldEntity = new MetadataSchemaFieldEntity(); - metadataSchemaFieldMapper.mapModelToEntity(request.getMetadataSchemaField(), metadataSchemaFieldEntity); - MetadataSchemaFieldEntity savedMetadataSchemaFieldEntity = metadataSchemaFieldRepository - .save(metadataSchemaFieldEntity); + MetadataSchemaField metadataSchemaField = dataCatalogService + .createMetadataSchemaField(request.getMetadataSchemaField()); - MetadataSchemaFieldCreateResponse.Builder responseBuilder = MetadataSchemaFieldCreateResponse.newBuilder(); - metadataSchemaFieldMapper.mapEntityToModel(savedMetadataSchemaFieldEntity, - responseBuilder.getMetadataSchemaFieldBuilder()); - responseObserver.onNext(responseBuilder.build()); + responseObserver.onNext( + MetadataSchemaFieldCreateResponse.newBuilder().setMetadataSchemaField(metadataSchemaField).build()); responseObserver.onCompleted(); } @@ -201,13 +143,9 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog public void deleteMetadataSchema(MetadataSchemaDeleteRequest request, StreamObserver<MetadataSchemaDeleteResponse> responseObserver) { // TODO: check that user has write access on metadata schema - // TODO: handle metadata schema not found - MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository - .findBySchemaName(request.getMetadataSchema().getSchemaName()); - metadataSchemaFieldRepository.deleteAll(metadataSchemaEntity.getMetadataSchemaFields()); - metadataSchemaRepository.delete(metadataSchemaEntity); - MetadataSchemaDeleteResponse.Builder responseBuilder = MetadataSchemaDeleteResponse.newBuilder(); - responseObserver.onNext(responseBuilder.build()); + dataCatalogService.deleteMetadataSchema(request.getMetadataSchema()); + + responseObserver.onNext(MetadataSchemaDeleteResponse.newBuilder().build()); responseObserver.onCompleted(); } @@ -215,13 +153,9 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog public void deleteMetadataSchemaField(MetadataSchemaFieldDeleteRequest request, StreamObserver<MetadataSchemaFieldDeleteResponse> responseObserver) { // TODO: check that user has write access on metadata schema field - // TODO: handle metadata schema field not found - MetadataSchemaFieldEntity metadataSchemaFieldEntity = metadataSchemaFieldRepository - .findByFieldNameAndMetadataSchema_SchemaName(request.getMetadataSchemaField().getFieldName(), - request.getMetadataSchemaField().getSchemaName()); - metadataSchemaFieldRepository.delete(metadataSchemaFieldEntity); - MetadataSchemaFieldDeleteResponse.Builder responseBuilder = MetadataSchemaFieldDeleteResponse.newBuilder(); - responseObserver.onNext(responseBuilder.build()); + dataCatalogService.deleteMetadataSchemaField(request.getMetadataSchemaField()); + + responseObserver.onNext(MetadataSchemaFieldDeleteResponse.newBuilder().build()); responseObserver.onCompleted(); } @@ -229,16 +163,10 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog public void getMetadataSchemaFields(MetadataSchemaFieldListRequest request, StreamObserver<MetadataSchemaFieldListResponse> responseObserver) { - // TODO: handle case where schema doesn't exist - List<MetadataSchemaFieldEntity> metadataSchemaFieldEntities = metadataSchemaFieldRepository - .findByMetadataSchema_SchemaName(request.getSchemaName()); + List<MetadataSchemaField> fields = dataCatalogService.getMetadataSchemaFields(request.getSchemaName()); - MetadataSchemaFieldListResponse.Builder responseBuilder = MetadataSchemaFieldListResponse.newBuilder(); - for (MetadataSchemaFieldEntity metadataSchemaFieldEntity : metadataSchemaFieldEntities) { - MetadataSchemaField.Builder builder = responseBuilder.addMetadataSchemaFieldsBuilder(); - metadataSchemaFieldMapper.mapEntityToModel(metadataSchemaFieldEntity, builder); - } - responseObserver.onNext(responseBuilder.build()); + responseObserver + .onNext(MetadataSchemaFieldListResponse.newBuilder().addAllMetadataSchemaFields(fields).build()); responseObserver.onCompleted(); } @@ -247,17 +175,11 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog StreamObserver<DataProductRemoveFromMetadataSchemaResponse> responseObserver) { String dataProductId = request.getDataProductId(); - // TODO: handle data product not found - DataProductEntity dataProduct = dataProductRepository.findByExternalId(dataProductId); String schemaName = request.getSchemaName(); - // TODO: handle metadata schema not found - MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository.findBySchemaName(schemaName); - dataProduct.removeMetadataSchema(metadataSchemaEntity); - - DataProductRemoveFromMetadataSchemaResponse.Builder responseBuilder = DataProductRemoveFromMetadataSchemaResponse - .newBuilder(); - dataProductMapper.mapEntityToModel(dataProduct, responseBuilder.getDataProductBuilder()); - responseObserver.onNext(responseBuilder.build()); + DataProduct dataProduct = dataCatalogService.removeDataProductFromMetadataSchema(dataProductId, schemaName); + + responseObserver + .onNext(DataProductRemoveFromMetadataSchemaResponse.newBuilder().setDataProduct(dataProduct).build()); responseObserver.onCompleted(); } @@ -266,17 +188,11 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog StreamObserver<MetadataSchemaFieldUpdateResponse> responseObserver) { // TODO: check that user has write access on metadata schema field - // TODO: handle metadata schema field not found - MetadataSchemaFieldEntity metadataSchemaFieldEntity = metadataSchemaFieldRepository - .findByFieldNameAndMetadataSchema_SchemaName(request.getMetadataSchemaField().getFieldName(), - request.getMetadataSchemaField().getSchemaName()); - metadataSchemaFieldMapper.mapModelToEntity(request.getMetadataSchemaField(), metadataSchemaFieldEntity); - metadataSchemaFieldRepository.save(metadataSchemaFieldEntity); - - MetadataSchemaFieldUpdateResponse.Builder responseBuilder = MetadataSchemaFieldUpdateResponse.newBuilder(); - metadataSchemaFieldMapper.mapEntityToModel(metadataSchemaFieldEntity, - responseBuilder.getMetadataSchemaFieldBuilder()); - responseObserver.onNext(responseBuilder.build()); + MetadataSchemaField metadataSchemaField = dataCatalogService + .updateMetadataSchemaField(request.getMetadataSchemaField()); + + responseObserver.onNext( + MetadataSchemaFieldUpdateResponse.newBuilder().setMetadataSchemaField(metadataSchemaField).build()); responseObserver.onCompleted(); } } diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogService.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogService.java new file mode 100644 index 0000000..9c4f1c9 --- /dev/null +++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogService.java @@ -0,0 +1,39 @@ +package org.apache.airavata.datacatalog.api.service; + +import java.util.List; + +import org.apache.airavata.datacatalog.api.DataProduct; +import org.apache.airavata.datacatalog.api.MetadataSchema; +import org.apache.airavata.datacatalog.api.MetadataSchemaField; + +/** + * Transactional service layer for CRUD operations on data catalog database. + */ +public interface DataCatalogService { + + DataProduct createDataProduct(DataProduct dataProduct); + + DataProduct updateDataProduct(DataProduct dataProduct); + + DataProduct getDataProduct(String dataProductId); + + void deleteDataProduct(String dataProductId); + + DataProduct addDataProductToMetadataSchema(String dataProductId, String schemaName); + + MetadataSchema getMetadataSchema(String schemaName); + + MetadataSchema createMetadataSchema(MetadataSchema metadataSchema); + + MetadataSchemaField createMetadataSchemaField(MetadataSchemaField metadataSchemaField); + + void deleteMetadataSchema(MetadataSchema metadataSchema); + + void deleteMetadataSchemaField(MetadataSchemaField metadataSchemaField); + + List<MetadataSchemaField> getMetadataSchemaFields(String schemaName); + + DataProduct removeDataProductFromMetadataSchema(String dataProductId, String schemaName); + + MetadataSchemaField updateMetadataSchemaField(MetadataSchemaField metadataSchemaField); +} diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/impl/DataCatalogServiceImpl.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/impl/DataCatalogServiceImpl.java new file mode 100644 index 0000000..3aef542 --- /dev/null +++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/impl/DataCatalogServiceImpl.java @@ -0,0 +1,205 @@ +package org.apache.airavata.datacatalog.api.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.apache.airavata.datacatalog.api.DataProduct; +import org.apache.airavata.datacatalog.api.MetadataSchema; +import org.apache.airavata.datacatalog.api.MetadataSchemaField; +import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListResponse; +import org.apache.airavata.datacatalog.api.exception.EntityNotFoundException; +import org.apache.airavata.datacatalog.api.mapper.DataProductMapper; +import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaFieldMapper; +import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaMapper; +import org.apache.airavata.datacatalog.api.model.DataProductEntity; +import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity; +import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity; +import org.apache.airavata.datacatalog.api.repository.DataProductRepository; +import org.apache.airavata.datacatalog.api.repository.MetadataSchemaFieldRepository; +import org.apache.airavata.datacatalog.api.repository.MetadataSchemaRepository; +import org.apache.airavata.datacatalog.api.service.DataCatalogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class DataCatalogServiceImpl implements DataCatalogService { + + // Repositories + @Autowired + DataProductRepository dataProductRepository; + + @Autowired + MetadataSchemaRepository metadataSchemaRepository; + + @Autowired + MetadataSchemaFieldRepository metadataSchemaFieldRepository; + + // Mappers + @Autowired + DataProductMapper dataProductMapper; + + @Autowired + MetadataSchemaMapper metadataSchemaMapper; + + @Autowired + MetadataSchemaFieldMapper metadataSchemaFieldMapper; + + @Override + public DataProduct createDataProduct(DataProduct dataProduct) { + + // TODO: SharingManager.resolveUser + DataProductEntity dataProductEntity = new DataProductEntity(); + dataProductEntity.setExternalId(UUID.randomUUID().toString()); + dataProductMapper.mapModelToEntity(dataProduct, dataProductEntity); + DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity); + + // TODO: SharingManager.grantPermissionToUser(userInfo, dataProduct, + // Permission.OWNER) + + return toDataProduct(savedDataProductEntity); + } + + @Override + public DataProduct updateDataProduct(DataProduct dataProduct) { + + DataProductEntity dataProductEntity = dataProductRepository + .findByExternalId(dataProduct.getDataProductId()); + dataProductMapper.mapModelToEntity(dataProduct, dataProductEntity); + + DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity); + + return toDataProduct(savedDataProductEntity); + } + + @Override + public DataProduct getDataProduct(String dataProductId) { + // TODO: handle data product does not exist + DataProductEntity dataProductEntity = dataProductRepository.findByExternalId(dataProductId); + return toDataProduct(dataProductEntity); + } + + @Override + public void deleteDataProduct(String dataProductId) { + dataProductRepository.deleteByExternalId(dataProductId); + } + + @Override + public DataProduct addDataProductToMetadataSchema(String dataProductId, String schemaName) { + // TODO: handle data product not found + DataProductEntity dataProduct = dataProductRepository.findByExternalId(dataProductId); + // TODO: handle metadata schema not found + MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository.findBySchemaName(schemaName); + dataProduct.addMetadataSchema(metadataSchemaEntity); + DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProduct); + return toDataProduct(savedDataProductEntity); + } + + @Override + public MetadataSchema getMetadataSchema(String schemaName) { + MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository.findBySchemaName(schemaName); + if (metadataSchemaEntity == null) { + throw new EntityNotFoundException("No schema found with name " + schemaName); + } + return toMetadataSchema(metadataSchemaEntity); + } + + @Override + public MetadataSchema createMetadataSchema(MetadataSchema metadataSchema) { + + MetadataSchemaEntity metadataSchemaEntity = new MetadataSchemaEntity(); + metadataSchemaMapper.mapModelToEntity(metadataSchema, metadataSchemaEntity); + MetadataSchemaEntity savedMetadataSchemaEntity = metadataSchemaRepository.save(metadataSchemaEntity); + return toMetadataSchema(savedMetadataSchemaEntity); + } + + @Override + public MetadataSchemaField createMetadataSchemaField(MetadataSchemaField metadataSchemaField) { + + MetadataSchemaFieldEntity metadataSchemaFieldEntity = new MetadataSchemaFieldEntity(); + metadataSchemaFieldMapper.mapModelToEntity(metadataSchemaField, metadataSchemaFieldEntity); + MetadataSchemaFieldEntity savedMetadataSchemaFieldEntity = metadataSchemaFieldRepository + .save(metadataSchemaFieldEntity); + return toMetadataSchemaField(savedMetadataSchemaFieldEntity); + } + + @Override + public void deleteMetadataSchema(MetadataSchema metadataSchema) { + // TODO: check that user has write access on metadata schema + // TODO: handle metadata schema not found + MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository + .findBySchemaName(metadataSchema.getSchemaName()); + metadataSchemaFieldRepository.deleteAll(metadataSchemaEntity.getMetadataSchemaFields()); + metadataSchemaRepository.delete(metadataSchemaEntity); + } + + @Override + public void deleteMetadataSchemaField(MetadataSchemaField metadataSchemaField) { + // TODO: handle metadata schema field not found + MetadataSchemaFieldEntity metadataSchemaFieldEntity = metadataSchemaFieldRepository + .findByFieldNameAndMetadataSchema_SchemaName(metadataSchemaField.getFieldName(), + metadataSchemaField.getSchemaName()); + metadataSchemaFieldRepository.delete(metadataSchemaFieldEntity); + } + + @Override + public List<MetadataSchemaField> getMetadataSchemaFields(String schemaName) { + + // TODO: handle case where schema doesn't exist + List<MetadataSchemaFieldEntity> metadataSchemaFieldEntities = metadataSchemaFieldRepository + .findByMetadataSchema_SchemaName(schemaName); + + List<MetadataSchemaField> fields = new ArrayList<>(); + MetadataSchemaFieldListResponse.Builder responseBuilder = MetadataSchemaFieldListResponse.newBuilder(); + for (MetadataSchemaFieldEntity metadataSchemaFieldEntity : metadataSchemaFieldEntities) { + fields.add(toMetadataSchemaField(metadataSchemaFieldEntity)); + } + return fields; + } + + @Override + public DataProduct removeDataProductFromMetadataSchema(String dataProductId, String schemaName) { + + // TODO: handle data product not found + DataProductEntity dataProduct = dataProductRepository.findByExternalId(dataProductId); + // TODO: handle metadata schema not found + MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository.findBySchemaName(schemaName); + dataProduct.removeMetadataSchema(metadataSchemaEntity); + DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProduct); + return toDataProduct(savedDataProductEntity); + } + + @Override + public MetadataSchemaField updateMetadataSchemaField(MetadataSchemaField metadataSchemaField) { + + // TODO: handle metadata schema field not found + MetadataSchemaFieldEntity metadataSchemaFieldEntity = metadataSchemaFieldRepository + .findByFieldNameAndMetadataSchema_SchemaName(metadataSchemaField.getFieldName(), + metadataSchemaField.getSchemaName()); + metadataSchemaFieldMapper.mapModelToEntity(metadataSchemaField, metadataSchemaFieldEntity); + MetadataSchemaFieldEntity savedMetadataSchemaFieldEntity = metadataSchemaFieldRepository + .save(metadataSchemaFieldEntity); + return toMetadataSchemaField(savedMetadataSchemaFieldEntity); + } + + private DataProduct toDataProduct(DataProductEntity savedDataProductEntity) { + DataProduct.Builder builder = DataProduct.newBuilder(); + dataProductMapper.mapEntityToModel(savedDataProductEntity, builder); + return builder.build(); + } + + private MetadataSchema toMetadataSchema(MetadataSchemaEntity metadataSchemaEntity) { + MetadataSchema.Builder builder = MetadataSchema.newBuilder(); + metadataSchemaMapper.mapEntityToModel(metadataSchemaEntity, builder); + return builder.build(); + } + + private MetadataSchemaField toMetadataSchemaField(MetadataSchemaFieldEntity metadataSchemaFieldEntity) { + MetadataSchemaField.Builder builder = MetadataSchemaField.newBuilder(); + metadataSchemaFieldMapper.mapEntityToModel(metadataSchemaFieldEntity, builder); + return builder.build(); + } + +}
