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 <[email protected]> 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)); + } }
