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:42 UTC
[airavata-data-catalog] 03/09: simple public sharing implementation
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 2f91e244f814741f90799cec830047e89a7b21d6
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue Apr 25 11:04:29 2023 -0400
simple public sharing implementation
---
.../sharing/simple/SimplePublicSharingEntity.java | 97 ++++++++++++++++++++++
.../simple/SimplePublicSharingRepository.java | 15 ++++
.../sharing/simple/SimpleUserRepository.java | 3 +
.../api/sharing/SimpleSharingManagerImpl.java | 46 ++++++++--
.../api/sharing/SimpleSharingManagerImplTest.java | 50 +++++++++++
5 files changed, 205 insertions(+), 6 deletions(-)
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
new file mode 100644
index 0000000..c20282c
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/sharing/simple/SimplePublicSharingEntity.java
@@ -0,0 +1,97 @@
+package org.apache.airavata.datacatalog.api.model.sharing.simple;
+
+import org.apache.airavata.datacatalog.api.Permission;
+import org.apache.airavata.datacatalog.api.model.DataProductEntity;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "simple_public_sharing")
+public class SimplePublicSharingEntity {
+
+ @Id
+ @SequenceGenerator(name = "simple_public_sharing_sharing_id", sequenceName = "simple_public_sharing_sharing_id", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "simple_public_sharing_sharing_id")
+ @Column(name = "sharing_id")
+ private Long sharingId;
+
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "data_product_id", referencedColumnName = "data_product_id", nullable = false, updatable = false)
+ private DataProductEntity dataProduct;
+
+ @Column(name = "permission_id")
+ @Enumerated(EnumType.STRING)
+ private Permission permission;
+
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "simple_tenant_id", referencedColumnName = "simple_tenant_id", nullable = false, updatable = false)
+ private SimpleTenantEntity simpleTenant;
+
+ public Long getSharingId() {
+ return sharingId;
+ }
+
+ public void setSharingId(Long sharingId) {
+ this.sharingId = sharingId;
+ }
+
+ public DataProductEntity getDataProduct() {
+ return dataProduct;
+ }
+
+ public void setDataProduct(DataProductEntity dataProduct) {
+ this.dataProduct = dataProduct;
+ }
+
+ public Permission getPermission() {
+ return permission;
+ }
+
+ public void setPermission(Permission permission) {
+ this.permission = permission;
+ }
+
+ public SimpleTenantEntity getSimpleTenant() {
+ return simpleTenant;
+ }
+
+ public void setSimpleTenant(SimpleTenantEntity simpleTenant) {
+ this.simpleTenant = simpleTenant;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((sharingId == null) ? 0 : sharingId.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;
+ SimplePublicSharingEntity other = (SimplePublicSharingEntity) obj;
+ if (sharingId == null) {
+ if (other.sharingId != null)
+ return false;
+ } else if (!sharingId.equals(other.sharingId))
+ return false;
+ return true;
+ }
+
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimplePublicSharingRepository.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimplePublicSharingRepository.java
new file mode 100644
index 0000000..ad15a91
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimplePublicSharingRepository.java
@@ -0,0 +1,15 @@
+package org.apache.airavata.datacatalog.api.repository.sharing.simple;
+
+import java.util.Optional;
+
+import org.apache.airavata.datacatalog.api.Permission;
+import org.apache.airavata.datacatalog.api.model.sharing.simple.SimplePublicSharingEntity;
+import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleTenantEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface SimplePublicSharingRepository extends JpaRepository<SimplePublicSharingEntity, Long> {
+
+ Optional<SimplePublicSharingEntity> findBySimpleTenantAndDataProduct_DataProductIdAndPermission(
+ SimpleTenantEntity simpleTenant, Long dataProductId, Permission permission);
+
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimpleUserRepository.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimpleUserRepository.java
index cc26c73..e47d40c 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimpleUserRepository.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/sharing/simple/SimpleUserRepository.java
@@ -2,6 +2,7 @@ package org.apache.airavata.datacatalog.api.repository.sharing.simple;
import java.util.Optional;
+import org.apache.airavata.datacatalog.api.model.UserEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleTenantEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleUserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
@@ -12,4 +13,6 @@ public interface SimpleUserRepository extends JpaRepository<SimpleUserEntity, Lo
Optional<SimpleUserEntity> findByExternalIdAndSimpleTenant_ExternalId(String externalId,
String tenantId);
+
+ SimpleUserEntity findByUser(UserEntity user);
}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImpl.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImpl.java
index f5d42d3..d942a64 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImpl.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImpl.java
@@ -12,6 +12,7 @@ import org.apache.airavata.datacatalog.api.model.TenantEntity;
import org.apache.airavata.datacatalog.api.model.UserEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleGroupEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleGroupSharingEntity;
+import org.apache.airavata.datacatalog.api.model.sharing.simple.SimplePublicSharingEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleTenantEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleUserEntity;
import org.apache.airavata.datacatalog.api.model.sharing.simple.SimpleUserSharingEntity;
@@ -20,6 +21,7 @@ import org.apache.airavata.datacatalog.api.repository.TenantRepository;
import org.apache.airavata.datacatalog.api.repository.UserRepository;
import org.apache.airavata.datacatalog.api.repository.sharing.simple.SimpleGroupRepository;
import org.apache.airavata.datacatalog.api.repository.sharing.simple.SimpleGroupSharingRepository;
+import org.apache.airavata.datacatalog.api.repository.sharing.simple.SimplePublicSharingRepository;
import org.apache.airavata.datacatalog.api.repository.sharing.simple.SimpleTenantRepository;
import org.apache.airavata.datacatalog.api.repository.sharing.simple.SimpleUserRepository;
import org.apache.airavata.datacatalog.api.repository.sharing.simple.SimpleUserSharingRepository;
@@ -48,6 +50,9 @@ public class SimpleSharingManagerImpl implements SharingManager {
@Autowired
private SimpleGroupSharingRepository simpleGroupSharingRepository;
+ @Autowired
+ private SimplePublicSharingRepository simplePublicSharingRepository;
+
@Autowired
private SimpleTenantRepository simpleTenantRepository;
@@ -167,20 +172,49 @@ public class SimpleSharingManagerImpl implements SharingManager {
@Override
public boolean hasPublicAccess(DataProduct dataProduct, Permission permission) throws SharingException {
- // TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'hasPublicAccess'");
+ DataProductEntity dataProductEntity = resolveDataProduct(dataProduct);
+ SimpleUserEntity simpleUser = simpleUserRepository.findByUser(dataProductEntity.getOwner());
+ SimpleTenantEntity simpleTenant = simpleUser.getSimpleTenant();
+
+ Optional<SimplePublicSharingEntity> maybeSimplePublicSharingEntity = simplePublicSharingRepository
+ .findBySimpleTenantAndDataProduct_DataProductIdAndPermission(simpleTenant,
+ dataProductEntity.getDataProductId(), permission);
+ return maybeSimplePublicSharingEntity.isPresent();
}
@Override
public void grantPublicAccess(DataProduct dataProduct, Permission permission) throws SharingException {
- // TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'grantPublicAccess'");
+
+ DataProductEntity dataProductEntity = resolveDataProduct(dataProduct);
+ SimpleUserEntity simpleUser = simpleUserRepository.findByUser(dataProductEntity.getOwner());
+ SimpleTenantEntity simpleTenant = simpleUser.getSimpleTenant();
+
+ Optional<SimplePublicSharingEntity> maybeSimplePublicSharingEntity = simplePublicSharingRepository
+ .findBySimpleTenantAndDataProduct_DataProductIdAndPermission(simpleTenant,
+ dataProductEntity.getDataProductId(), permission);
+
+ if (maybeSimplePublicSharingEntity.isEmpty()) {
+ SimplePublicSharingEntity simplePublicSharingEntity = new SimplePublicSharingEntity();
+ simplePublicSharingEntity.setDataProduct(dataProductEntity);
+ simplePublicSharingEntity.setPermission(permission);
+ simplePublicSharingEntity.setSimpleTenant(simpleTenant);
+ simplePublicSharingRepository.save(simplePublicSharingEntity);
+ }
}
@Override
public void revokePublicAccess(DataProduct dataProduct, Permission permission) throws SharingException {
- // TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'revokePublicAccess'");
+ DataProductEntity dataProductEntity = resolveDataProduct(dataProduct);
+ SimpleUserEntity simpleUser = simpleUserRepository.findByUser(dataProductEntity.getOwner());
+ SimpleTenantEntity simpleTenant = simpleUser.getSimpleTenant();
+
+ Optional<SimplePublicSharingEntity> maybeSimplePublicSharingEntity = simplePublicSharingRepository
+ .findBySimpleTenantAndDataProduct_DataProductIdAndPermission(simpleTenant,
+ dataProductEntity.getDataProductId(), permission);
+
+ maybeSimplePublicSharingEntity.ifPresent(simplePublicSharingEntity -> {
+ simplePublicSharingRepository.delete(simplePublicSharingEntity);
+ });
}
private SimpleGroupEntity resolveGroup(GroupInfo groupInfo) {
diff --git a/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImplTest.java b/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImplTest.java
index 7d6d49f..6fe117f 100644
--- a/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImplTest.java
+++ b/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalog/api/sharing/SimpleSharingManagerImplTest.java
@@ -270,4 +270,54 @@ public class SimpleSharingManagerImplTest {
assertFalse(simpleSharingManagerImpl.userHasAccess(userB, dataProduct, Permission.READ));
assertFalse(simpleSharingManagerImpl.userHasAccess(userC, dataProduct, Permission.READ));
}
+
+ @Test
+ public void testGrantPublicAccess() throws SharingException {
+
+ UserInfo userA = UserInfo.newBuilder().setTenantId("tenantId").setUserId("userA").build();
+ UserEntity testUserA = simpleSharingManagerImpl.resolveUser(userA);
+
+ // Create a data product
+ DataProductEntity dataProductEntity = new DataProductEntity();
+ dataProductEntity.setExternalId(UUID.randomUUID().toString());
+ dataProductEntity.setOwner(testUserA);
+ dataProductEntity.setName("test data product");
+ dataProductRepository.save(dataProductEntity);
+
+ DataProduct dataProduct = DataProduct.newBuilder()
+ .setDataProductId(dataProductEntity.getExternalId()) // only need the data product id
+ .build();
+
+ assertFalse(simpleSharingManagerImpl.hasPublicAccess(dataProduct, Permission.READ));
+
+ simpleSharingManagerImpl.grantPublicAccess(dataProduct, Permission.READ);
+
+ assertTrue(simpleSharingManagerImpl.hasPublicAccess(dataProduct, Permission.READ));
+ }
+
+ @Test
+ public void testRevokePublicAccess() throws SharingException {
+
+ UserInfo userA = UserInfo.newBuilder().setTenantId("tenantId").setUserId("userA").build();
+ UserEntity testUserA = simpleSharingManagerImpl.resolveUser(userA);
+
+ // Create a data product
+ DataProductEntity dataProductEntity = new DataProductEntity();
+ dataProductEntity.setExternalId(UUID.randomUUID().toString());
+ dataProductEntity.setOwner(testUserA);
+ dataProductEntity.setName("test data product");
+ dataProductRepository.save(dataProductEntity);
+
+ DataProduct dataProduct = DataProduct.newBuilder()
+ .setDataProductId(dataProductEntity.getExternalId()) // only need the data product id
+ .build();
+
+ simpleSharingManagerImpl.grantPublicAccess(dataProduct, Permission.READ);
+
+ assertTrue(simpleSharingManagerImpl.hasPublicAccess(dataProduct, Permission.READ));
+
+ simpleSharingManagerImpl.revokePublicAccess(dataProduct, Permission.READ);
+
+ assertFalse(simpleSharingManagerImpl.hasPublicAccess(dataProduct, Permission.READ));
+ }
}