diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 99d70b613229b3fcc81638d99d038034b58ef9d6..4defcfdba05c03f477737f6e819f41e8bfbfe056 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -175,20 +175,20 @@ }, "boto3": { "hashes": [ - "sha256:7d398f66a11e67777c189d1f58c0a75d9d60f98d0ee51b8817e828930bf19e4e", - "sha256:8e49416216a6e3a62c2a0c44fba4dd2852c85472e7b702516605b1363867d220" + "sha256:4b6274b4fe9d7113f978abea66a1f20c8a397c268c9d1b2a6c96b14a256da4a5", + "sha256:d0224e1499d7189b47aa7f469d96522d98df6f5702fccb20a95a436582ebcd9d" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.35.97" + "version": "==1.35.98" }, "botocore": { "hashes": [ - "sha256:88f2fab29192ffe2f2115d5bafbbd823ff4b6eb2774296e03ec8b5b0fe074f61", - "sha256:fed4f156b1a9b8ece53738f702ba5851b8c6216b4952de326547f349cc494f14" + "sha256:4f1c0b687488663a774ad3a5e81a5f94fae1bcada2364cfdc48482c4dbf794d5", + "sha256:d11742b3824bdeac3c89eeeaf5132351af41823bbcef8fc15e95c8250b1de09c" ], "markers": "python_version >= '3.8'", - "version": "==1.35.97" + "version": "==1.35.98" }, "certifi": { "hashes": [ @@ -412,7 +412,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7cddcbdcb3eade84f67db01fa32e0649ecc01d4c3cc5e7542d3c402ad52efc19" + "sha256:c7cc16e8cc8d14ee91c843f00ea5d10ecb5bc66b19b372b55558e98257e2d8f4" ], "path": "./lib/dbrepo-1.6.1.tar.gz" }, @@ -1612,7 +1612,7 @@ "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.9'", "version": "==2.3.0" }, "werkzeug": { @@ -2236,7 +2236,7 @@ "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.9'", "version": "==2.3.0" }, "wrapt": { diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.6.1.tar.gz index a1197ff6465d77567108f3389aae9d54dc9c8ab6..2bd95d66c26e1a1df90f6e6c76175910ea408265 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.6.1.tar.gz and b/dbrepo-analyse-service/lib/dbrepo-1.6.1.tar.gz differ diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index 03d89895cb607cee20bc84cd8cd3195c029a9ab8..b5f592d570cb73677baaa00666af945901e1d256 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -74,7 +74,7 @@ dbrepo: default: read: "${GRANT_DEFAULT_READ:SELECT}" write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" - credentialCacheTimeout: "${CREDENTIAL_CACHE_TIMEOUT:3600}" + credentialCacheTimeout: "${CREDENTIAL_CACHE_TIMEOUT:60}" minConcurrent: "${MIN_CONCURRENT_CONSUMERS:2}" maxConcurrent: "${MAX_CONCURRENT_CONSUMERS:6}" requeueRejected: ${REQUEUE_REJECTED:false} diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java index aef7ebd7b8e5cfe718814f18c30ea0e5b157e37a..d90a702db33c759a511480fa0e89c37efc2773fc 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -33,10 +33,11 @@ import static jakarta.persistence.GenerationType.IDENTITY; }) @NamedQueries({ @NamedQuery(name = "Database.findAllDesc", query = "select distinct d from Database d order by d.id desc"), - @NamedQuery(name = "Database.findAllPublicDesc", query = "select distinct d from Database d where d.isPublic = true or d.isSchemaPublic = true order by d.id desc"), - @NamedQuery(name = "Database.findAllPublicOrReadAccessDesc", query = "select distinct d from Database d where d.isPublic = true or d.isSchemaPublic = true or exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"), - @NamedQuery(name = "Database.findAllPublicOrReadAccessByInternalNameDesc", query = "select distinct d from Database d where (d.isPublic = true or d.isSchemaPublic = true) and d.internalName = ?2 or exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"), - @NamedQuery(name = "Database.findAllPublicByInternalNameDesc", query = "select distinct d from Database d where (d.isPublic = true or d.isSchemaPublic = true) and d.internalName = ?1 order by d.id desc"), + @NamedQuery(name = "Database.findAllAtLestReadAccessDesc", query = "select distinct d from Database d where exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"), + @NamedQuery(name = "Database.findAllPublicOrSchemaPublicDesc", query = "select distinct d from Database d where d.isPublic = true or d.isSchemaPublic = true order by d.id desc"), + @NamedQuery(name = "Database.findAllPublicOrSchemaPublicOrReadAccessDesc", query = "select distinct d from Database d where d.isPublic = true or d.isSchemaPublic = true or exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"), + @NamedQuery(name = "Database.findAllPublicOrSchemaPublicOrReadAccessByInternalNameDesc", query = "select distinct d from Database d where (d.isPublic = true or d.isSchemaPublic = true) and d.internalName = ?2 or exists(select a.hdbid from DatabaseAccess a where a.huserid = ?1 and a.hdbid = d.id) order by d.id desc"), + @NamedQuery(name = "Database.findAllPublicOrSchemaPublicByInternalNameDesc", query = "select distinct d from Database d where (d.isPublic = true or d.isSchemaPublic = true) and d.internalName = ?1 order by d.id desc"), }) public class Database implements Serializable { diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java index 3c1a79f16e59941c7b4602a0879b725e36329043..38a0a8044162cbf3abe9178de26fca4a21e7ee4c 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/DatabaseRepository.java @@ -13,12 +13,14 @@ public interface DatabaseRepository extends JpaRepository<Database, Long> { List<Database> findAllDesc(); - List<Database> findAllPublicDesc(); + List<Database> findAllPublicOrSchemaPublicDesc(); - List<Database> findAllPublicOrReadAccessDesc(UUID id); + List<Database> findAllAtLestReadAccessDesc(UUID id); - List<Database> findAllPublicOrReadAccessByInternalNameDesc(UUID id, String internalName); + List<Database> findAllPublicOrSchemaPublicOrReadAccessDesc(UUID id); - List<Database> findAllPublicByInternalNameDesc(String internalName); + List<Database> findAllPublicOrSchemaPublicOrReadAccessByInternalNameDesc(UUID id, String internalName); + + List<Database> findAllPublicOrSchemaPublicByInternalNameDesc(String internalName); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index 793cf45a8d6a51cb51018b4affaf63054f96bab3..ad72fb0756f20fac58bc717c0da601f9b5bb1c74 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -82,18 +82,18 @@ public class DatabaseEndpoint extends AbstractEndpoint { if (principal != null) { if (internalName != null) { log.debug("filter request to contain only public databases or where user with id {} has at least read access that match internal name {}", getId(principal), internalName); - databases = databaseService.findAllPublicOrReadAccessByInternalName(getId(principal), internalName); + databases = databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(getId(principal), internalName); } else { - log.debug("filter request to contain only public databases or where user with id {} has at least read access", getId(principal)); - databases = databaseService.findAllPublicOrReadAccess(getId(principal)); + log.debug("filter request to contain only databases where user with id {} has at least read access", getId(principal)); + databases = databaseService.findAllPublicOrSchemaPublicOrReadAccess(getId(principal)); } } else { if (internalName != null) { log.debug("filter request to contain only public databases that match internal name {}", internalName); - databases = databaseService.findAllPublicByInternalName(internalName); + databases = databaseService.findAllPublicOrSchemaPublicByInternalName(internalName); } else { log.debug("filter request to contain only public databases"); - databases = databaseService.findAllPublic(); + databases = databaseService.findAllPublicOrSchemaPublic(); } } final HttpHeaders headers = new HttpHeaders(); @@ -520,11 +520,11 @@ public class DatabaseEndpoint extends AbstractEndpoint { /* reduce metadata */ database.setTables(database.getTables() .stream() - .filter(t -> t.getIsPublic() || optional.isPresent()) + .filter(t -> t.getIsPublic() || t.getIsSchemaPublic() || optional.isPresent()) .toList()); database.setViews(database.getViews() .stream() - .filter(v -> v.getIsPublic() || optional.isPresent()) + .filter(v -> v.getIsPublic() || v.getIsSchemaPublic() || optional.isPresent()) .toList()); if (!isSystem(principal) && !database.getOwner().getId().equals(getId(principal))) { log.trace("authenticated user {} is not owner: remove access list", principal.getName()); @@ -538,11 +538,11 @@ public class DatabaseEndpoint extends AbstractEndpoint { /* reduce metadata */ database.setTables(database.getTables() .stream() - .filter(Table::getIsPublic) + .filter(t -> t.getIsPublic() || t.getIsSchemaPublic()) .toList()); database.setViews(database.getViews() .stream() - .filter(View::getIsPublic) + .filter(v -> v.getIsPublic() || v.getIsSchemaPublic()) .toList()); database.setAccesses(List.of()); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 6ed865ca25923bea14c9ed39c3d8b18bacbc7f63..9f4542fc023f8aaf336fc2de196d0c36ab93cea4 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -98,7 +98,7 @@ public class TableEndpoint extends AbstractEndpoint { endpointValidator.validateOnlyPrivateSchemaHasRole(database, principal, "list-tables"); return ResponseEntity.ok(database.getTables() .stream() - .filter(Table::getIsPublic) + .filter(t -> t.getIsPublic() || t.getIsSchemaPublic()) .map(metadataMapper::tableToTableBriefDto) .collect(Collectors.toList())); } @@ -484,21 +484,16 @@ public class TableEndpoint extends AbstractEndpoint { boolean isOwner = false; if (principal != null) { isOwner = table.getOwner().getId().equals(getId(principal)); - if (table.getIsSchemaPublic()) { + if (!table.getIsSchemaPublic()) { try { accessService.find(table.getDatabase(), userService.findById(getId(principal))); } catch (UserNotFoundException | AccessNotFoundException e) { if (!isOwner && !isSystem(principal)) { - log.error("Failed to find table with id {}: private and not authorized", table); - throw new NotAllowedException("Failed to find table with id " + tableId + ": private and not authorized"); + log.error("Failed to find table with id {}: private and no access permission", table); + throw new NotAllowedException("Failed to find table with id " + tableId + ": private and no access permission"); } } } - } else { - if (!table.getIsSchemaPublic()) { - log.error("Failed to find table with id {}: private and not authorized", table); - throw new NotAllowedException("Failed to find table with id " + tableId + ": private and not authorized"); - } } if (!table.getIsSchemaPublic() && !isOwner && !isSystem(principal)) { log.debug("remove schema from table: {}.{}", database.getInternalName(), table.getInternalName()); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index b8952b5c56f034511f9040654096e4103c44dbce..5a349ff3782f1c94a4aea6f4d609f3402437b9c0 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -391,7 +391,7 @@ public class UserEndpoint extends AbstractEndpoint { throw new NotAllowedException("Failed to modify user password: not current user"); } authenticationService.updatePassword(user, data); - for (Database database : databaseService.findAllPublicOrReadAccess(userId)) { + for (Database database : databaseService.findAllAtLestReadAccess(userId)) { databaseService.updatePassword(database, user); } userService.updatePassword(user, data); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index 556a2a958de4878528f2477c65c9e119c63dbde2..11d64faf8b9562ff42ab2120d5f6fa151710d462 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -276,7 +276,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void list_anonymous_succeeds() throws DatabaseNotFoundException, UserNotFoundException { /* mock */ - when(databaseService.findAllPublic()) + when(databaseService.findAllPublicOrSchemaPublic()) .thenReturn(List.of(DATABASE_1)); /* test */ @@ -291,7 +291,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { assertTrue(DATABASE_3_PUBLIC); /* mock */ - when(databaseService.findAllPublicOrReadAccess(any(UUID.class))) + when(databaseService.findAllPublicOrSchemaPublicOrReadAccess(any(UUID.class))) .thenReturn(List.of(DATABASE_3)); /* test */ @@ -306,7 +306,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { assertTrue(DATABASE_3_PUBLIC); /* mock */ - when(databaseService.findAllPublicOrReadAccess(USER_1_ID)) + when(databaseService.findAllPublicOrSchemaPublicOrReadAccess(USER_1_ID)) .thenReturn(List.of(DATABASE_3)); /* test */ @@ -318,7 +318,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void list_hasRoleFilter_succeeds() throws DatabaseNotFoundException, UserNotFoundException { /* mock */ - when(databaseService.findAllPublicOrReadAccessByInternalName(USER_1_ID, DATABASE_3_INTERNALNAME)) + when(databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(USER_1_ID, DATABASE_3_INTERNALNAME)) .thenReturn(List.of(DATABASE_3)); /* test */ @@ -330,7 +330,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void list_hasRoleFilterNoResult_succeeds() throws DatabaseNotFoundException, UserNotFoundException { /* mock */ - when(databaseService.findAllPublicOrReadAccessByInternalName(USER_1_ID, "i_do_not_exist")) + when(databaseService.findAllPublicOrSchemaPublicOrReadAccessByInternalName(USER_1_ID, "i_do_not_exist")) .thenReturn(List.of()); /* test */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java index 39e305923ff6e7fe51b002c2eccc786e09fcd621..be0ea28c496d9c3bd65df14f8a312af5c9003069 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java @@ -512,7 +512,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { doNothing() .when(userService) .updatePassword(USER_1, data); - when(databaseService.findAllPublicOrReadAccess(USER_1_ID)) + when(databaseService.findAllAtLestReadAccess(USER_1_ID)) .thenReturn(List.of(DATABASE_1)); doNothing() .when(databaseService) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java index 9240da4c96f0865711b7a66107597a9fd0d401a4..f323d2837541d7bff7e15d51273bc9e5f6840d58 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java @@ -32,9 +32,6 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { @Autowired private DatabaseService databaseService; - @Autowired - private AccessService accessService; - @Autowired private UserRepository userRepository; @@ -68,29 +65,29 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { @Test @Transactional(readOnly = true) - public void findAllPublicByInternalName_succeeds() { + public void findAllPublicOrSchemaPublicByInternalName_succeeds() { /* test */ - final List<Database> response = databaseService.findAllPublicByInternalName(DATABASE_3_INTERNALNAME); + final List<Database> response = databaseService.findAllPublicOrSchemaPublicByInternalName(DATABASE_3_INTERNALNAME); assertEquals(1, response.size()); assertEquals(DATABASE_3, response.get(0)); } @Test @Transactional(readOnly = true) - public void findAllPublicByInternalName_privateEmpty_succeeds() { + public void findAllPublicOrSchemaPublicByInternalName_privateEmpty_succeeds() { /* test */ - final List<Database> response = databaseService.findAllPublicByInternalName(DATABASE_1_INTERNALNAME); + final List<Database> response = databaseService.findAllPublicOrSchemaPublicByInternalName(DATABASE_1_INTERNALNAME); assertEquals(0, response.size()); } @Test @Transactional(readOnly = true) - public void findAllPublicOrReadAccess_privateNoAccessEmpty_succeeds() { + public void findAllAtLestReadAccess_privateNoAccessEmpty_succeeds() { /* test */ - final List<Database> response = databaseService.findAllPublicOrReadAccess(USER_4_ID); + final List<Database> response = databaseService.findAllAtLestReadAccess(USER_4_ID); assertEquals(3, response.size()); assertEquals(DATABASE_4, response.get(0)); assertEquals(DATABASE_3, response.get(1)); @@ -99,10 +96,10 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { @Test @Transactional(readOnly = true) - public void findAllPublicOrReadAccess_privateAccess_succeeds() { + public void findAllAtLestReadAccess_privateAccess_succeeds() { /* test */ - final List<Database> response = databaseService.findAllPublicOrReadAccess(USER_2_ID); + final List<Database> response = databaseService.findAllAtLestReadAccess(USER_2_ID); assertEquals(4, response.size()); assertEquals(DATABASE_4, response.get(0)); assertEquals(DATABASE_3, response.get(1)); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index 9a80ec1e423ae0e38e45528c73fffe61508ee8e0..1b6570abd821337fe032bead021cf9d5a4b9fc8c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -92,7 +92,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { DataServiceConnectionException { /* mock */ - when(databaseRepository.findAllPublicOrReadAccessDesc(USER_1_ID)) + when(databaseRepository.findAllAtLestReadAccessDesc(USER_1_ID)) .thenReturn(List.of(DATABASE_1)); doNothing() .when(dataServiceGateway) diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java index 93abb7304c323f93742ef09efce1605923230cc8..3000ece11e91cc2b58f2edcfac85f6a0f8a60528 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java @@ -21,9 +21,9 @@ public interface DatabaseService { */ List<Database> findAll(); - List<Database> findAllPublic(); + List<Database> findAllPublicOrSchemaPublic(); - List<Database> findAllPublicOrReadAccessByInternalName(UUID userId, String internalName); + List<Database> findAllPublicOrSchemaPublicOrReadAccessByInternalName(UUID userId, String internalName); /** * Finds all databases stored in the metadata database. @@ -31,13 +31,21 @@ public interface DatabaseService { * @param userId The user id. * @return List of databases. */ - List<Database> findAllPublicOrReadAccess(UUID userId); + List<Database> findAllAtLestReadAccess(UUID userId); + + /** + * Finds all databases stored in the metadata database. + * + * @param userId The user id. + * @return List of databases. + */ + List<Database> findAllPublicOrSchemaPublicOrReadAccess(UUID userId); /** * @param internalName The database internal name. * @return The databases if found. */ - List<Database> findAllPublicByInternalName(String internalName); + List<Database> findAllPublicOrSchemaPublicByInternalName(String internalName); /** * Find a database by id, only used in the authentication service diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index 11ba1c03196d09da8f0b3020a90e959a510714b5..7415ded56a8a2a926742ef3b44b025f7fb535baa 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -59,23 +59,28 @@ public class DatabaseServiceImpl implements DatabaseService { } @Override - public List<Database> findAllPublic() { - return databaseRepository.findAllPublicDesc(); + public List<Database> findAllPublicOrSchemaPublic() { + return databaseRepository.findAllPublicOrSchemaPublicDesc(); } @Override - public List<Database> findAllPublicOrReadAccessByInternalName(UUID userId, String internalName) { - return databaseRepository.findAllPublicOrReadAccessByInternalNameDesc(userId, internalName); + public List<Database> findAllPublicOrSchemaPublicOrReadAccessByInternalName(UUID userId, String internalName) { + return databaseRepository.findAllPublicOrSchemaPublicOrReadAccessByInternalNameDesc(userId, internalName); } @Override - public List<Database> findAllPublicOrReadAccess(UUID userId) { - return databaseRepository.findAllPublicOrReadAccessDesc(userId); + public List<Database> findAllAtLestReadAccess(UUID userId) { + return databaseRepository.findAllAtLestReadAccessDesc(userId); } @Override - public List<Database> findAllPublicByInternalName(String internalName) { - return databaseRepository.findAllPublicByInternalNameDesc(internalName); + public List<Database> findAllPublicOrSchemaPublicOrReadAccess(UUID userId) { + return databaseRepository.findAllPublicOrSchemaPublicOrReadAccessDesc(userId); + } + + @Override + public List<Database> findAllPublicOrSchemaPublicByInternalName(String internalName) { + return databaseRepository.findAllPublicOrSchemaPublicByInternalNameDesc(internalName); } @Override @@ -141,7 +146,7 @@ public class DatabaseServiceImpl implements DatabaseService { @Transactional(readOnly = true) public void updatePassword(Database database, User user) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException { - final List<Database> databases = databaseRepository.findAllPublicOrReadAccessDesc(user.getId()) + final List<Database> databases = databaseRepository.findAllAtLestReadAccessDesc(user.getId()) .stream() .distinct() .toList(); diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 9a33916adfdf47848c302c03e7110bba5dc8d09c..3e6cfafc458b461ad4fbf3c89de1a8988de652ad 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -360,7 +360,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7cddcbdcb3eade84f67db01fa32e0649ecc01d4c3cc5e7542d3c402ad52efc19" + "sha256:c7cc16e8cc8d14ee91c843f00ea5d10ecb5bc66b19b372b55558e98257e2d8f4" ], "path": "./lib/dbrepo-1.6.1.tar.gz" }, diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index 93c8b4291603d19deb3fbc79bd23e8d55e8379e4..14a228982b579ff634443be53c08353895786e81 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -254,7 +254,7 @@ }, "dbrepo": { "hashes": [ - "sha256:7cddcbdcb3eade84f67db01fa32e0649ecc01d4c3cc5e7542d3c402ad52efc19" + "sha256:c7cc16e8cc8d14ee91c843f00ea5d10ecb5bc66b19b372b55558e98257e2d8f4" ], "path": "./lib/dbrepo-1.6.1.tar.gz" }, diff --git a/dbrepo-search-service/init/clients/opensearch_client.py b/dbrepo-search-service/init/clients/opensearch_client.py index 7d25fcded5a29e87524523785133d7aaa56f314d..030a56ffd53b126b15baabab3dd720d7f5e7f73f 100644 --- a/dbrepo-search-service/init/clients/opensearch_client.py +++ b/dbrepo-search-service/init/clients/opensearch_client.py @@ -1,17 +1,16 @@ """ The opensearch_client.py is used by the different API endpoints in routes.py to handle requests to the opensearch db """ +import logging import os +from collections.abc import MutableMapping from json import dumps, load -import logging from dbrepo.api.dto import Database -from collections.abc import MutableMapping +from opensearchpy import OpenSearch, NotFoundError -from opensearchpy import OpenSearch, TransportError, RequestError, NotFoundError - -from omlib.measure import om from omlib.constants import OM_IDS +from omlib.measure import om from omlib.omconstants import OM from omlib.unit import Unit @@ -54,7 +53,7 @@ class OpenSearchClient: @throws: opensearchpy.exceptions.NotFoundError If the database was not found in the Search Database. """ response: dict = self._instance().get(index="database", id=database_id) - return Database.parse_obj(response["_source"]) + return Database.model_validate(response["_source"]) def update_database(self, database_id: int, data: Database) -> Database: """ @@ -69,7 +68,7 @@ class OpenSearchClient: logging.debug(f"updating database with id: {database_id} in search database") self._instance().index(index="database", id=database_id, body=dumps(data.model_dump())) response: dict = self._instance().get(index="database", id=database_id) - database = Database.parse_obj(response["_source"]) + database = Database.model_validate(response["_source"]) logging.info(f"Updated database with id {database_id} in index 'database'") return database diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.1.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.6.1.tar.gz index a1197ff6465d77567108f3389aae9d54dc9c8ab6..2bd95d66c26e1a1df90f6e6c76175910ea408265 100644 Binary files a/dbrepo-search-service/init/lib/dbrepo-1.6.1.tar.gz and b/dbrepo-search-service/init/lib/dbrepo-1.6.1.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.6.1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.6.1.tar.gz index a1197ff6465d77567108f3389aae9d54dc9c8ab6..2bd95d66c26e1a1df90f6e6c76175910ea408265 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.6.1.tar.gz and b/dbrepo-search-service/lib/dbrepo-1.6.1.tar.gz differ diff --git a/dbrepo-search-service/test/test_opensearch_client.py b/dbrepo-search-service/test/test_opensearch_client.py index ab95e29e1e88c0c5c43b5674dc0f252fc29106b7..e37a96db10aaf44c9f588907295a2622c1fc0d38 100644 --- a/dbrepo-search-service/test/test_opensearch_client.py +++ b/dbrepo-search-service/test/test_opensearch_client.py @@ -42,9 +42,9 @@ req = Database(id=1, ord=0, internal_name="id", type=ColumnType.BIGINT, - is_public=True, is_null_allowed=False, - size=20, d=0, + size=20, + d=0, concept=ConceptBrief(id=1, uri="http://www.wikidata.org/entity/Q2221906"), unit=UnitBrief(id=1, uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"), @@ -84,7 +84,6 @@ class OpenSearchClientTest(unittest.TestCase): name="ID", internal_name="id", type=ColumnType.BIGINT, - is_public=True, is_null_allowed=False)])] database = OpenSearchClient().update_database(database_id=req.id, data=req) self.assertEqual(1, database.id) @@ -118,7 +117,6 @@ class OpenSearchClientTest(unittest.TestCase): self.assertEqual(ColumnType.BIGINT, database.tables[0].columns[0].type) self.assertEqual(1, database.tables[0].columns[0].database_id) self.assertEqual(1, database.tables[0].columns[0].table_id) - self.assertEqual(True, database.tables[0].columns[0].is_public) self.assertEqual(False, database.tables[0].columns[0].is_null_allowed) def test_update_database_create_succeeds(self): diff --git a/dbrepo-ui/components/ResourceStatus.vue b/dbrepo-ui/components/ResourceStatus.vue index 36544b1c299ac09ba0fcf339ff2bf04d418980ee..5167d899ea6e73c150db478f8fc3b063a3ba1e12 100644 --- a/dbrepo-ui/components/ResourceStatus.vue +++ b/dbrepo-ui/components/ResourceStatus.vue @@ -38,14 +38,12 @@ export default { if (!this.resource) { return null } - if (!this.resource.is_public) { - if (!this.resource.is_schema_public) { - return 'draft' - } - return 'private' - } - if (!this.resource.is_schema_public) { - return 'private' + if (!this.resource.is_public && !this.resource.is_schema_public) { + return 'draft' + } else if(!this.resource.is_public && this.resource.is_schema_public) { + return 'schema' + } else if(this.resource.is_public && !this.resource.is_schema_public) { + return 'data' } return 'public' }, @@ -57,10 +55,11 @@ export default { }, color () { switch (this.mode) { - case 'private': - return 'secondary' - case 'draft': + case 'schema': + case 'data': return 'warning' + case 'draft': + return 'error' case 'public': return 'success' } diff --git a/dbrepo-ui/components/identifier/Select.vue b/dbrepo-ui/components/identifier/Select.vue index bacbab44149b75289a81741afc52fd4c2983283f..e1de8d1b26bc021bdf54d98c106d7e79cd8ec65d 100644 --- a/dbrepo-ui/components/identifier/Select.vue +++ b/dbrepo-ui/components/identifier/Select.vue @@ -86,7 +86,7 @@ export default { if (!this.user) { return this.identifiers.filter(i => i.status === 'published') } - return this.identifiers.filter(i => i.status === 'published' || i.creator.id === this.user.id) + return this.identifiers.filter(i => i.status === 'published' || i.owner.id === this.user.id) }, listVariant () { const runtimeConfig = useRuntimeConfig() diff --git a/dbrepo-ui/components/subset/SubsetList.vue b/dbrepo-ui/components/subset/SubsetList.vue index 6d84a6a48ea91bbbbbf7ef6fa869c2230ecbcd29..62a456eb793ae1f95a49fda7569e8fb8799b9ccb 100644 --- a/dbrepo-ui/components/subset/SubsetList.vue +++ b/dbrepo-ui/components/subset/SubsetList.vue @@ -26,8 +26,6 @@ :to="link(item)" :href="link(item)"> <template v-slot:append> - <ResourceStatus - :resource="item" /> <v-tooltip v-if="hasPublishedIdentifier(item)" :text="$t('pages.identifier.pid.title')" diff --git a/dbrepo-ui/components/subset/SubsetToolbar.vue b/dbrepo-ui/components/subset/SubsetToolbar.vue index 4d1f8d7c4aef6081b8992deb2bf67daddb444f1d..405bb6d00fe4989a2e73c6abb2bf518194ff5b1a 100644 --- a/dbrepo-ui/components/subset/SubsetToolbar.vue +++ b/dbrepo-ui/components/subset/SubsetToolbar.vue @@ -158,7 +158,7 @@ export default { if (!this.user || !this.subset || !this.database) { return false } - return this.database.owner.id === this.user.id || (this.subset.creator.id === this.user.id && this.hasReadAccess) + return this.database.owner.id === this.user.id || (this.subset.owner.id === this.user.id && this.hasReadAccess) }, title () { if (!this.identifier) { diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue index b91ce9a6ee1b95fecb873fc730f9e01cc1a0f0a9..9821cb6fe4bbbbcfb4ad5de1df1160fedb84c722 100644 --- a/dbrepo-ui/components/table/TableToolbar.vue +++ b/dbrepo-ui/components/table/TableToolbar.vue @@ -149,7 +149,7 @@ export default { if (!this.user) { return false } - return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id + return this.hasReadAccess || this.table.owner.id === this.user.id || this.database.owner.id === this.user.id }, canViewSchema () { if (!this.table) { @@ -161,7 +161,7 @@ export default { if (!this.user) { return false } - return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id + return this.hasReadAccess || this.table.owner.id === this.user.id || this.database.owner.id === this.user.id }, canImportCsv () { if (!this.roles || !this.table || !this.user) { diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index c4d5ef5eba6f9d6592ef2f47c86644530d82c1e7..2e94f572ec68f7f3c595254ed5c9a5e14099e623 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -607,7 +607,8 @@ "status": { "title": "Status", "public": "Public", - "private": "Private", + "data": "Data-only", + "schema": "Schema-only", "draft": "Draft" }, "resource": { diff --git a/dbrepo-ui/pages/database/[database_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/info.vue index 4d88b2c6c86dfdb86e9e61c7a601212e0c7293ad..0cb01e8d4c481d088bd330d1865840841c0d84ee 100644 --- a/dbrepo-ui/pages/database/[database_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/info.vue @@ -273,7 +273,7 @@ export default { if (!this.user) { return this.identifiers.filter(i => i.status === 'published') } - return this.identifiers.filter(i => i.status === 'published' || i.creator.id === this.user.id) + return this.identifiers.filter(i => i.status === 'published' || i.owner.id === this.user.id) }, identifier () { if (this.pid) { diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue index f7b025e98298fd37181d551822e9a4b18b849e16..5fc351216dbf90ec71843bc65c11889a4c883f9c 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue @@ -157,7 +157,7 @@ export default { if (!this.user) { return this.identifiers.filter(i => i.status === 'published') } - return this.identifiers.filter(i => i.status === 'published' || i.creator.id === this.user.id) + return this.identifiers.filter(i => i.status === 'published' || i.owner.id === this.user.id) }, identifier () { if (this.pid) { diff --git a/dbrepo-ui/pages/search.vue b/dbrepo-ui/pages/search.vue index 04f94a2d8e19e7cfe8747a7bc8bf5d64ad541ae0..d822643204c47860ef8a9be87a8a25b3571bdadb 100644 --- a/dbrepo-ui/pages/search.vue +++ b/dbrepo-ui/pages/search.vue @@ -215,7 +215,7 @@ export default { } return title } else if (this.isUser(item)) { - return item.creator.qualified_name + return item.owner.qualified_name } return null }, @@ -296,7 +296,7 @@ export default { } else if (this.isUnit(item)) { } else if (this.isConcept(item)) { } else if (this.isUser(item)) { - if (item.creator.attributes.orcid) { + if (item.owner.attributes.orcid) { tags.push({ text: 'ORCID', color: 'success' }) } }