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/01/31 17:08:04 UTC
[airavata-data-catalog] 05/05: Initial work on sharing management interface
This is an automated email from the ASF dual-hosted git repository.
machristie pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airavata-data-catalog.git
commit 2e6393961620230cfbdc9ad5f4f799904905a728
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu Jan 26 11:19:20 2023 -0500
Initial work on sharing management interface
---
.../datacatalog/api/model/DataProductEntity.java | 11 ++-
.../airavata/datacatalog/api/model/UserEntity.java | 79 ++++++++++++++++
.../api/service/DataCatalogAPIService.java | 4 +
.../datacatalog/api/sharing/SharingManager.java | 102 +++++++++++++++++++++
.../stubs/src/main/proto/DataCatalogAPI.proto | 18 ++++
5 files changed, 209 insertions(+), 5 deletions(-)
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
index c9a67d2..65b24e7 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
@@ -22,27 +22,28 @@ import jakarta.persistence.UniqueConstraint;
public class DataProductEntity {
@Id
- @SequenceGenerator(name="data_product_data_product_id_seq", sequenceName = "data_product_data_product_id_seq", allocationSize = 1)
+ @SequenceGenerator(name = "data_product_data_product_id_seq", sequenceName = "data_product_data_product_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "data_product_data_product_id_seq")
- @Column(name="data_product_id")
+ @Column(name = "data_product_id")
private Long dataProductId;
@ManyToOne(optional = true)
- @JoinColumn(name="parent_data_product_id", referencedColumnName = "data_product_id", nullable = true)
+ @JoinColumn(name = "parent_data_product_id", referencedColumnName = "data_product_id", nullable = true)
private DataProductEntity parentDataProductEntity;
@Basic
- @Column(name="external_id", nullable = false)
+ @Column(name = "external_id", nullable = false)
private String externalId;
@Basic
- @Column(name="name", nullable = false)
+ @Column(name = "name", nullable = false)
private String name;
@Type(JsonType.class)
@Column(name = "metadata", columnDefinition = "jsonb")
private JsonNode metadata;
+ // TODO: ManyToOne mapping to owner: UserEntity
public Long getDataProductId() {
return dataProductId;
}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/UserEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/UserEntity.java
new file mode 100644
index 0000000..0540ab2
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/UserEntity.java
@@ -0,0 +1,79 @@
+package org.apache.airavata.datacatalog.api.model;
+
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "user")
+public class UserEntity {
+
+ @Id
+ @SequenceGenerator(name = "user_user_id_seq", sequenceName = "user_user_id_seq", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_user_id_seq")
+ @Column(name = "user_id")
+ private Long userId;
+
+ @Basic
+ @Column(name = "external_id", nullable = false)
+ private String externalId;
+
+ @Basic
+ @Column(name = "name", nullable = false)
+ private String name;
+
+ public Long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Long userId) {
+ this.userId = userId;
+ }
+
+ public String getExternalId() {
+ return externalId;
+ }
+
+ public void setExternalId(String externalId) {
+ this.externalId = externalId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((userId == null) ? 0 : userId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ UserEntity other = (UserEntity) obj;
+ if (userId == null) {
+ if (other.userId != null)
+ return false;
+ } else if (!userId.equals(other.userId))
+ return false;
+ return true;
+ }
+
+}
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 fa979a6..e14c437 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
@@ -30,6 +30,7 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
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());
@@ -51,6 +52,9 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
}
DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity);
+ // TODO: SharingManager.grantPermissionToUser(userInfo, dataProduct,
+ // Permission.OWNER)
+
DataProductCreateResponse.Builder responseBuilder = DataProductCreateResponse.newBuilder();
responseBuilder.getDataProductBuilder()
.setDataProductId(savedDataProductEntity.getExternalId())
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
new file mode 100644
index 0000000..cbe470e
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
@@ -0,0 +1,102 @@
+package org.apache.airavata.datacatalog.api.sharing;
+
+import org.apache.airavata.datacatalog.api.DataProduct;
+import org.apache.airavata.datacatalog.api.GroupInfo;
+import org.apache.airavata.datacatalog.api.Permission;
+import org.apache.airavata.datacatalog.api.UserInfo;
+import org.apache.airavata.datacatalog.api.model.UserEntity;
+
+public interface SharingManager {
+
+ /**
+ * Get or create a {@link UserEntity}.
+ *
+ * @param userInfo
+ * @return
+ */
+ UserEntity resolveUser(UserInfo userInfo);
+
+ /**
+ * Return true if the user has access to the data product with the given
+ * permission.
+ *
+ * @param userInfo
+ * @param dataProduct
+ * @param permission
+ * @return
+ */
+ boolean userHasAccess(UserInfo userInfo, DataProduct dataProduct, Permission permission);
+
+ /**
+ * Return the name of the database view that includes sharing information
+ * for each data product. The view should contain the following columns:
+ * data_product_id, user_id, and permission_id where the permission_id
+ * should be a number as defined in the {@link Permission} enum.
+ *
+ * @return
+ */
+ String getDataProductSharingView();
+
+ /**
+ * Grant permission to the user for the given data product.
+ *
+ * @param userInfo
+ * @param dataProduct
+ * @param permission
+ */
+ void grantPermissionToUser(UserInfo userInfo, DataProduct dataProduct, Permission permission);
+
+ /**
+ * Revoke permission from the user for the given data product.
+ *
+ * @param userInfo
+ * @param dataProduct
+ * @param permission
+ */
+ void revokePermissionFromUser(UserInfo userInfo, DataProduct dataProduct, Permission permission);
+
+ /**
+ * Grant permission to the group for the given data product.
+ *
+ * @param groupInfo
+ * @param dataProduct
+ * @param permission
+ */
+ void grantPermissionToGroup(GroupInfo groupInfo, DataProduct dataProduct, Permission permission);
+
+ /**
+ * Revoke permission from the group for the given data product.
+ *
+ * @param groupInfo
+ * @param dataProduct
+ * @param permission
+ */
+ void revokePermissionFromGroup(GroupInfo groupInfo, DataProduct dataProduct, Permission permission);
+
+ /**
+ * Return true if public access at the given permission is granted for the
+ * given data product. Public access means anonymous access; no user information
+ * provided in the API request.
+ *
+ * @param dataProduct
+ * @param permission
+ * @return
+ */
+ boolean hasPublicAccess(DataProduct dataProduct, Permission permission);
+
+ /**
+ * Grant public access to the given data product.
+ *
+ * @param dataProduct
+ * @param permission
+ */
+ void grantPublicAccess(DataProduct dataProduct, Permission permission);
+
+ /**
+ * Revoke public access from the given data product.
+ *
+ * @param dataProduct
+ * @param permission
+ */
+ void revokePublicAccess(DataProduct dataProduct, Permission permission);
+}
diff --git a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
index 43854f9..bc8f656 100644
--- a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
+++ b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
@@ -20,6 +20,24 @@ syntax = "proto3";
option java_multiple_files = true;
option java_package = "org.apache.airavata.datacatalog.api";
+message UserInfo {
+ string user_id = 1;
+ optional string tenant_id = 2;
+}
+
+message GroupInfo {
+ string group_id = 1;
+ optional string tenant_id = 2;
+}
+
+enum Permission {
+ OWNER = 0;
+ READ = 1;
+ READ_METADATA = 2;
+ WRITE = 3;
+ WRITE_METADATA = 4;
+ MANAGE_SHARING = 5;
+}
message DataProduct {
string data_product_id = 1;