You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2023/04/26 16:10:48 UTC
[airavata-data-catalog] 09/09: Integrated SharingManager into the Data Catalog API
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 e07066340e3021bc3bd3e66ac656ab768ab90541
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Wed Apr 26 11:17:04 2023 -0400
Integrated SharingManager into the Data Catalog API
---
.../api/client/DataCatalogAPIClient.java | 22 ++++---
.../sharing/simple/SimpleGroupSharingEntity.java | 3 +-
.../sharing/simple/SimplePublicSharingEntity.java | 3 +-
.../sharing/simple/SimpleUserSharingEntity.java | 3 +-
.../api/query/MetadataSchemaQueryExecutor.java | 3 +-
.../api/query/MetadataSchemaQueryWriter.java | 5 +-
.../impl/MetadataSchemaQueryExecutorImpl.java | 6 +-
.../PostgresqlMetadataSchemaQueryWriterImpl.java | 31 +++++++--
.../api/service/DataCatalogAPIService.java | 74 ++++++++++++++++++++--
.../api/service/DataCatalogService.java | 3 +-
.../api/service/impl/DataCatalogServiceImpl.java | 15 +++--
.../server/src/main/resources/schema.sql | 25 ++++++++
12 files changed, 160 insertions(+), 33 deletions(-)
diff --git a/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
index 794147b..c24fb07 100644
--- a/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
+++ b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
@@ -33,6 +33,7 @@ import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListRequest;
import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListResponse;
import org.apache.airavata.datacatalog.api.MetadataSchemaGetRequest;
import org.apache.airavata.datacatalog.api.MetadataSchemaGetResponse;
+import org.apache.airavata.datacatalog.api.UserInfo;
import io.grpc.Channel;
import io.grpc.ManagedChannel;
@@ -43,32 +44,36 @@ import io.grpc.StatusRuntimeException;;
public class DataCatalogAPIClient {
private final DataCatalogAPIServiceBlockingStub blockingStub;
+ private final UserInfo userInfo = UserInfo.newBuilder().setUserId("demoUser").setTenantId("demoTenant").build();
public DataCatalogAPIClient(Channel channel) {
blockingStub = DataCatalogAPIServiceGrpc.newBlockingStub(channel);
}
public DataProduct createDataProduct(DataProduct dataProduct) {
- DataProductCreateRequest request = DataProductCreateRequest.newBuilder().setDataProduct(dataProduct).build();
+ DataProductCreateRequest request = DataProductCreateRequest.newBuilder().setDataProduct(dataProduct)
+ .setUserInfo(userInfo).build();
DataProductCreateResponse response = blockingStub.createDataProduct(request);
return response.getDataProduct();
}
public DataProduct updateDataProduct(DataProduct dataProduct) {
- DataProductUpdateRequest request = DataProductUpdateRequest.newBuilder().setDataProduct(dataProduct).build();
+ DataProductUpdateRequest request = DataProductUpdateRequest.newBuilder().setDataProduct(dataProduct)
+ .setUserInfo(userInfo).build();
DataProductUpdateResponse response = blockingStub.updateDataProduct(request);
return response.getDataProduct();
}
public DataProduct getDataProduct(String dataProductId) {
- DataProductGetRequest request = DataProductGetRequest.newBuilder().setDataProductId(dataProductId).build();
+ DataProductGetRequest request = DataProductGetRequest.newBuilder().setDataProductId(dataProductId)
+ .setUserInfo(userInfo).build();
DataProductGetResponse response = blockingStub.getDataProduct(request);
return response.getDataProduct();
}
public void deleteDataProduct(String dataProductId) {
DataProductDeleteRequest request = DataProductDeleteRequest.newBuilder().setDataProductId(dataProductId)
- .build();
+ .setUserInfo(userInfo).build();
blockingStub.deleteDataProduct(request);
}
@@ -122,21 +127,22 @@ public class DataCatalogAPIClient {
public DataProduct addDataProductToMetadataSchema(String dataProductId, String schemaName) {
DataProductAddToMetadataSchemaRequest request = DataProductAddToMetadataSchemaRequest.newBuilder()
- .setDataProductId(dataProductId).setSchemaName(schemaName).build();
+ .setDataProductId(dataProductId).setSchemaName(schemaName).setUserInfo(userInfo).build();
DataProductAddToMetadataSchemaResponse response = blockingStub.addDataProductToMetadataSchema(request);
return response.getDataProduct();
}
public DataProduct removeDataProductFromMetadataSchema(String dataProductId, String schemaName) {
DataProductRemoveFromMetadataSchemaRequest request = DataProductRemoveFromMetadataSchemaRequest.newBuilder()
- .setDataProductId(dataProductId).setSchemaName(schemaName).build();
+ .setDataProductId(dataProductId).setSchemaName(schemaName).setUserInfo(userInfo).build();
DataProductRemoveFromMetadataSchemaResponse response = blockingStub
.removeDataProductFromMetadataSchema(request);
return response.getDataProduct();
}
public List<DataProduct> searchDataProducts(String sql) {
- DataProductSearchRequest request = DataProductSearchRequest.newBuilder().setSql(sql).build();
+ DataProductSearchRequest request = DataProductSearchRequest.newBuilder().setSql(sql).setUserInfo(userInfo)
+ .build();
DataProductSearchResponse response = blockingStub.searchDataProducts(request);
return response.getDataProductsList();
}
@@ -282,7 +288,7 @@ public class DataCatalogAPIClient {
// searchResults = client.searchDataProducts("""
// select * from my_schema where not (field1 < 5 or field3 = 'bar')
// """);
- System.out.println(searchResults);
+ System.out.println("Shouldn't match anything: " + searchResults);
} finally {
channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleGroupSharingEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleGroupSharingEntity.java
index a4ce8bc..00c7ad0 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleGroupSharingEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleGroupSharingEntity.java
@@ -7,6 +7,7 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
+import jakarta.persistence.ForeignKey;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@@ -32,7 +33,7 @@ public class SimpleGroupSharingEntity {
private SimpleGroupEntity simpleGroup;
@ManyToOne(optional = false)
- @JoinColumn(name = "data_product_id", referencedColumnName = "data_product_id", nullable = false, updatable = false)
+ @JoinColumn(name = "data_product_id", referencedColumnName = "data_product_id", nullable = false, updatable = false, foreignKey = @ForeignKey(name = "fk_simple_group_sharing_data_product_id"))
private DataProductEntity dataProduct;
@Column(name = "permission_id")
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimplePublicSharingEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimplePublicSharingEntity.java
index 88ea990..7cda70d 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimplePublicSharingEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimplePublicSharingEntity.java
@@ -7,6 +7,7 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
+import jakarta.persistence.ForeignKey;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@@ -28,7 +29,7 @@ public class SimplePublicSharingEntity {
private Long sharingId;
@ManyToOne(optional = false)
- @JoinColumn(name = "data_product_id", referencedColumnName = "data_product_id", nullable = false, updatable = false)
+ @JoinColumn(name = "data_product_id", referencedColumnName = "data_product_id", nullable = false, updatable = false, foreignKey = @ForeignKey(name = "fk_simple_public_sharing_data_product_id"))
private DataProductEntity dataProduct;
@Column(name = "permission_id")
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleUserSharingEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleUserSharingEntity.java
index 57d6c9b..afb7be3 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleUserSharingEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimpleUserSharingEntity.java
@@ -7,6 +7,7 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
+import jakarta.persistence.ForeignKey;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@@ -32,7 +33,7 @@ public class SimpleUserSharingEntity {
private SimpleUserEntity simpleUser;
@ManyToOne(optional = false)
- @JoinColumn(name = "data_product_id", nullable = false, updatable = false)
+ @JoinColumn(name = "data_product_id", nullable = false, updatable = false, foreignKey = @ForeignKey(name = "fk_simple_user_sharing_data_product_id"))
private DataProductEntity dataProduct;
@Column(name = "permission_id")
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryExecutor.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryExecutor.java
index dcf6a35..b158662 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryExecutor.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryExecutor.java
@@ -2,9 +2,10 @@ package org.apache.airavata.datacatalog.api.query;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlParseException;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlValidateException;
+import org.apache.airavata.datacatalog.api.model.UserEntity;
public interface MetadataSchemaQueryExecutor {
- MetadataSchemaQueryResult execute(String sql)
+ MetadataSchemaQueryResult execute(UserEntity userEntity, String sql)
throws MetadataSchemaSqlParseException, MetadataSchemaSqlValidateException;
}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryWriter.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryWriter.java
index 08ab745..5932bbd 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryWriter.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/MetadataSchemaQueryWriter.java
@@ -4,6 +4,7 @@ import java.util.Collection;
import java.util.Map;
import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.apache.airavata.datacatalog.api.model.UserEntity;
import org.apache.calcite.sql.SqlNode;
public interface MetadataSchemaQueryWriter {
@@ -11,11 +12,13 @@ public interface MetadataSchemaQueryWriter {
/**
* Rewrite the query as needed to filter against metadata schema fields.
*
+ * @param userEntity
+ *
* @param sqlNode
* @param metadataSchemas
* @param tableAliases
* @return
*/
- String rewriteQuery(SqlNode sqlNode, Collection<MetadataSchemaEntity> metadataSchemas,
+ String rewriteQuery(UserEntity userEntity, SqlNode sqlNode, Collection<MetadataSchemaEntity> metadataSchemas,
Map<String, String> tableAliases);
}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java
index 7643a50..1dca5c0 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java
@@ -14,6 +14,7 @@ import org.apache.airavata.datacatalog.api.mapper.DataProductMapper;
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.model.UserEntity;
import org.apache.airavata.datacatalog.api.query.MetadataSchemaQueryExecutor;
import org.apache.airavata.datacatalog.api.query.MetadataSchemaQueryResult;
import org.apache.airavata.datacatalog.api.query.MetadataSchemaQueryWriter;
@@ -68,7 +69,7 @@ public class MetadataSchemaQueryExecutorImpl implements MetadataSchemaQueryExecu
DataProductMapper dataProductMapper;
@Override
- public MetadataSchemaQueryResult execute(String sql)
+ public MetadataSchemaQueryResult execute(UserEntity userEntity, String sql)
throws MetadataSchemaSqlParseException, MetadataSchemaSqlValidateException {
// Create a schema that contains the data_product table and all of the metadata
@@ -148,7 +149,8 @@ public class MetadataSchemaQueryExecutorImpl implements MetadataSchemaQueryExecu
});
- String finalSql = metadataSchemaQueryWriter.rewriteQuery(validatedSqlNode, metadataSchemas, tableAliases);
+ String finalSql = metadataSchemaQueryWriter.rewriteQuery(userEntity, validatedSqlNode, metadataSchemas,
+ tableAliases);
logger.debug("Metadata schema query final sql: {}", finalSql);
List<DataProductEntity> dataProductEntities = entityManager.createNativeQuery(finalSql, DataProductEntity.class)
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/PostgresqlMetadataSchemaQueryWriterImpl.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/PostgresqlMetadataSchemaQueryWriterImpl.java
index 8ace28a..b8e7775 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/PostgresqlMetadataSchemaQueryWriterImpl.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/query/impl/PostgresqlMetadataSchemaQueryWriterImpl.java
@@ -8,9 +8,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.airavata.datacatalog.api.Permission;
import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
+import org.apache.airavata.datacatalog.api.model.UserEntity;
import org.apache.airavata.datacatalog.api.query.MetadataSchemaQueryWriter;
+import org.apache.airavata.datacatalog.api.sharing.SharingManager;
import org.apache.calcite.sql.SqlCall;
import org.apache.calcite.sql.SqlIdentifier;
import org.apache.calcite.sql.SqlKind;
@@ -18,11 +21,15 @@ import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlSelect;
import org.apache.calcite.sql.dialect.PostgresqlSqlDialect;
import org.apache.calcite.sql.util.SqlShuttle;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PostgresqlMetadataSchemaQueryWriterImpl implements MetadataSchemaQueryWriter {
+ @Autowired
+ SharingManager sharingManager;
+
private static final class MetadataSchemaFieldFilterRewriter extends SqlShuttle {
final Collection<MetadataSchemaEntity> metadataSchemas;
@@ -150,11 +157,11 @@ public class PostgresqlMetadataSchemaQueryWriterImpl implements MetadataSchemaQu
}
@Override
- public String rewriteQuery(SqlNode sqlNode, Collection<MetadataSchemaEntity> metadataSchemas,
+ public String rewriteQuery(UserEntity userEntity, SqlNode sqlNode, Collection<MetadataSchemaEntity> metadataSchemas,
Map<String, String> tableAliases) {
StringBuilder sb = new StringBuilder();
- sb.append(writeCommonTableExpressions(metadataSchemas));
+ sb.append(writeCommonTableExpressions(userEntity, metadataSchemas));
sb.append(" SELECT * FROM ");
sb.append(((SqlSelect) sqlNode).getFrom().toSqlString(PostgresqlSqlDialect.DEFAULT));
sb.append(" WHERE ");
@@ -170,23 +177,24 @@ public class PostgresqlMetadataSchemaQueryWriterImpl implements MetadataSchemaQu
return filterRewriter.finalizeSql();
}
- String writeCommonTableExpressions(Collection<MetadataSchemaEntity> metadataSchemas) {
+ String writeCommonTableExpressions(UserEntity userEntity, Collection<MetadataSchemaEntity> metadataSchemas) {
StringBuilder sb = new StringBuilder();
List<String> commonTableExpressions = new ArrayList<>();
for (MetadataSchemaEntity metadataSchema : metadataSchemas) {
- commonTableExpressions.add(writeCommonTableExpression(metadataSchema));
+ commonTableExpressions.add(writeCommonTableExpression(userEntity, metadataSchema));
}
sb.append("WITH ");
sb.append(String.join(", ", commonTableExpressions));
return sb.toString();
}
- String writeCommonTableExpression(MetadataSchemaEntity metadataSchemaEntity) {
+ String writeCommonTableExpression(UserEntity userEntity, MetadataSchemaEntity metadataSchemaEntity) {
StringBuilder sb = new StringBuilder();
sb.append(metadataSchemaEntity.getSchemaName());
sb.append(" AS (");
- sb.append("select dp_.data_product_id, dp_.parent_data_product_id, dp_.external_id, dp_.name, dp_.metadata ");
+ sb.append(
+ "select dp_.data_product_id, dp_.parent_data_product_id, dp_.external_id, dp_.name, dp_.metadata, dp_.owner_id ");
// for (MetadataSchemaFieldEntity field :
// metadataSchemaEntity.getMetadataSchemaFields()) {
// TODO: include each field as well?
@@ -194,6 +202,17 @@ public class PostgresqlMetadataSchemaQueryWriterImpl implements MetadataSchemaQu
sb.append("from data_product dp_ ");
sb.append("inner join data_product_metadata_schema dpms_ on dpms_.data_product_id = dp_.data_product_id ");
sb.append("inner join metadata_schema ms_ on ms_.metadata_schema_id = dpms_.metadata_schema_id ");
+ sb.append("inner join ");
+ sb.append(sharingManager.getDataProductSharingView());
+ sb.append(" dpsv_ on dpsv_.data_product_id = dp_.data_product_id ");
+ sb.append("and dpsv_.user_id = ");
+ // TODO: change these to be bound parameters
+ sb.append(userEntity.getUserId());
+ sb.append(" and dpsv_.permission_id in (");
+ sb.append(Permission.OWNER.getNumber());
+ sb.append(",");
+ sb.append(Permission.READ_METADATA.getNumber());
+ sb.append(") ");
sb.append("where ms_.metadata_schema_id = " + metadataSchemaEntity.getMetadataSchemaId());
sb.append(")");
return sb.toString();
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 92c02a7..e658fc4 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
@@ -36,11 +36,14 @@ 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.Permission;
+import org.apache.airavata.datacatalog.api.UserInfo;
import org.apache.airavata.datacatalog.api.exception.EntityNotFoundException;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlParseException;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlValidateException;
import org.apache.airavata.datacatalog.api.exception.SharingException;
import org.apache.airavata.datacatalog.api.query.MetadataSchemaQueryResult;
+import org.apache.airavata.datacatalog.api.sharing.SharingManager;
import org.lognet.springboot.grpc.GRpcService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,6 +60,9 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
@Autowired
DataCatalogService dataCatalogService;
+ @Autowired
+ SharingManager sharingManager;
+
@Override
public void createDataProduct(DataProductCreateRequest request,
StreamObserver<DataProductCreateResponse> responseObserver) {
@@ -83,7 +89,12 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
public void updateDataProduct(DataProductUpdateRequest request,
StreamObserver<DataProductUpdateResponse> responseObserver) {
- // TODO: check that user has access to update data product record
+ // check that user has access to update data product record
+ if (!checkHasPermission(request.getUserInfo(), request.getDataProduct(), Permission.WRITE_METADATA,
+ responseObserver)) {
+ return;
+ }
+
try {
DataProduct savedDataProduct = dataCatalogService.updateDataProduct(request.getDataProduct());
@@ -97,9 +108,13 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
@Override
public void getDataProduct(DataProductGetRequest request, StreamObserver<DataProductGetResponse> responseObserver) {
- // TODO: check that user has READ access on data product record
+
try {
DataProduct dataProduct = dataCatalogService.getDataProduct(request.getDataProductId());
+ // check that user has READ_METADATA access on data product record
+ if (!checkHasPermission(request.getUserInfo(), dataProduct, Permission.READ_METADATA, responseObserver)) {
+ return;
+ }
responseObserver.onNext(DataProductGetResponse.newBuilder().setDataProduct(dataProduct).build());
responseObserver.onCompleted();
@@ -112,11 +127,20 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
@Override
public void deleteDataProduct(DataProductDeleteRequest request,
StreamObserver<DataProductDeleteResponse> responseObserver) {
- // TODO: check that user has WRITE access on data product record
- dataCatalogService.deleteDataProduct(request.getDataProductId());
+ try {
+ DataProduct dataProduct = dataCatalogService.getDataProduct(request.getDataProductId());
+ // check that user has WRITE_METADATA access on data product record
+ if (!checkHasPermission(request.getUserInfo(), dataProduct, Permission.WRITE_METADATA, responseObserver)) {
+ return;
+ }
+ dataCatalogService.deleteDataProduct(request.getDataProductId());
- responseObserver.onNext(DataProductDeleteResponse.newBuilder().build());
- responseObserver.onCompleted();
+ responseObserver.onNext(DataProductDeleteResponse.newBuilder().build());
+ responseObserver.onCompleted();
+ } catch (EntityNotFoundException e) {
+ responseObserver.onError(Status.NOT_FOUND.asException());
+ responseObserver.onCompleted();
+ }
}
@Override
@@ -125,7 +149,14 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
String dataProductId = request.getDataProductId();
String schemaName = request.getSchemaName();
+
try {
+ DataProduct checkDataProduct = dataCatalogService.getDataProduct(request.getDataProductId());
+ // check that user has WRITE_METADATA access on data product record
+ if (!checkHasPermission(request.getUserInfo(), checkDataProduct, Permission.WRITE_METADATA,
+ responseObserver)) {
+ return;
+ }
DataProduct dataProduct = dataCatalogService.addDataProductToMetadataSchema(dataProductId, schemaName);
responseObserver
@@ -144,6 +175,12 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
String dataProductId = request.getDataProductId();
String schemaName = request.getSchemaName();
try {
+ DataProduct checkDataProduct = dataCatalogService.getDataProduct(request.getDataProductId());
+ // check that user has WRITE_METADATA access on data product record
+ if (!checkHasPermission(request.getUserInfo(), checkDataProduct, Permission.WRITE_METADATA,
+ responseObserver)) {
+ return;
+ }
DataProduct dataProduct = dataCatalogService.removeDataProductFromMetadataSchema(dataProductId, schemaName);
responseObserver
@@ -161,7 +198,8 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
StreamObserver<DataProductSearchResponse> responseObserver) {
try {
- MetadataSchemaQueryResult searchResult = dataCatalogService.searchDataProducts(request.getSql());
+ MetadataSchemaQueryResult searchResult = dataCatalogService.searchDataProducts(request.getUserInfo(),
+ request.getSql());
List<DataProduct> dataProducts = searchResult.dataProducts();
responseObserver.onNext(DataProductSearchResponse.newBuilder().addAllDataProducts(dataProducts).build());
responseObserver.onCompleted();
@@ -270,4 +308,26 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
MetadataSchemaFieldUpdateResponse.newBuilder().setMetadataSchemaField(metadataSchemaField).build());
responseObserver.onCompleted();
}
+
+ private <T> boolean checkHasPermission(UserInfo userInfo, DataProduct dataProduct, Permission permission,
+ StreamObserver<T> responseObserver) {
+ try {
+ boolean userHasAccess = sharingManager.userHasAccess(userInfo, dataProduct,
+ permission);
+ if (!userHasAccess) {
+ responseObserver.onError(Status.PERMISSION_DENIED
+ .withDescription("user does not have " + permission + " permission")
+ .asException());
+ responseObserver.onCompleted();
+ return false;
+ } else {
+ return true;
+ }
+ } catch (SharingException e) {
+ responseObserver.onError(Status.INTERNAL.withDescription(e.getMessage()).asException());
+ responseObserver.onCompleted();
+ }
+ return false;
+ }
+
}
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
index be6ff66..0e514ce 100644
--- 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
@@ -5,6 +5,7 @@ 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;
+import org.apache.airavata.datacatalog.api.UserInfo;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlParseException;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlValidateException;
import org.apache.airavata.datacatalog.api.exception.SharingException;
@@ -43,6 +44,6 @@ public interface DataCatalogService {
MetadataSchemaField updateMetadataSchemaField(MetadataSchemaField metadataSchemaField);
- MetadataSchemaQueryResult searchDataProducts(String sql)
+ MetadataSchemaQueryResult searchDataProducts(UserInfo userInfo, String sql)
throws MetadataSchemaSqlParseException, MetadataSchemaSqlValidateException;
}
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
index e44d10a..fb23e02 100644
--- 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
@@ -9,6 +9,7 @@ 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.Permission;
+import org.apache.airavata.datacatalog.api.UserInfo;
import org.apache.airavata.datacatalog.api.exception.EntityNotFoundException;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlParseException;
import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlValidateException;
@@ -70,11 +71,12 @@ public class DataCatalogServiceImpl implements DataCatalogService {
dataProductEntity.setOwner(owner);
dataProductMapper.mapModelToEntity(dataProduct, dataProductEntity);
DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity);
+ DataProduct savedDataProduct = toDataProduct(savedDataProductEntity);
- sharingManager.grantPermissionToUser(dataProduct.getOwner(), dataProduct, Permission.OWNER,
+ sharingManager.grantPermissionToUser(dataProduct.getOwner(), savedDataProduct, Permission.OWNER,
dataProduct.getOwner());
- return toDataProduct(savedDataProductEntity);
+ return savedDataProduct;
}
@Override
@@ -121,9 +123,14 @@ public class DataCatalogServiceImpl implements DataCatalogService {
}
@Override
- public MetadataSchemaQueryResult searchDataProducts(String sql)
+ public MetadataSchemaQueryResult searchDataProducts(UserInfo userInfo, String sql)
throws MetadataSchemaSqlParseException, MetadataSchemaSqlValidateException {
- return metadataSchemaQueryExecutor.execute(sql);
+ try {
+ UserEntity userEntity = sharingManager.resolveUser(userInfo);
+ return metadataSchemaQueryExecutor.execute(userEntity, sql);
+ } catch (SharingException e) {
+ throw new RuntimeException("Unable to resolve " + userInfo, e);
+ }
}
@Override
diff --git a/data-catalog-api/server/src/main/resources/schema.sql b/data-catalog-api/server/src/main/resources/schema.sql
index 162f1af..41371eb 100644
--- a/data-catalog-api/server/src/main/resources/schema.sql
+++ b/data-catalog-api/server/src/main/resources/schema.sql
@@ -53,3 +53,28 @@ FROM
INNER JOIN simple_group_membership gm ON gm.simple_group_id = s.simple_group_id
INNER JOIN simple_user su ON su.simple_user_id = gm.simple_user_id
INNER JOIN data_product_hierarchy dph ON dph.root = s.data_product_id;
+
+-- Add ON DELETE CASCADE to the simple sharing tables
+ALTER TABLE
+ simple_user_sharing DROP CONSTRAINT fk_simple_user_sharing_data_product_id;
+
+ALTER TABLE
+ simple_user_sharing
+ADD
+ CONSTRAINT fk_simple_user_sharing_data_product_id FOREIGN KEY (data_product_id) REFERENCES data_product(data_product_id) ON DELETE CASCADE;
+
+ALTER TABLE
+ simple_group_sharing DROP CONSTRAINT fk_simple_group_sharing_data_product_id;
+
+ALTER TABLE
+ simple_group_sharing
+ADD
+ CONSTRAINT fk_simple_group_sharing_data_product_id FOREIGN KEY (data_product_id) REFERENCES data_product(data_product_id) ON DELETE CASCADE;
+
+ALTER TABLE
+ simple_public_sharing DROP CONSTRAINT fk_simple_public_sharing_data_product_id;
+
+ALTER TABLE
+ simple_public_sharing
+ADD
+ CONSTRAINT fk_simple_public_sharing_data_product_id FOREIGN KEY (data_product_id) REFERENCES data_product(data_product_id) ON DELETE CASCADE;