diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java index 355e1d1487d31a000033a415bef15acbbdb6cda3..6772eee5b7087573b1eeda511f707bc32ecf42ef 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java @@ -16,6 +16,7 @@ import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.entities.database.table.columns.TableColumnType; import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey; import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference; +import at.tuwien.entities.identifier.Identifier; import at.tuwien.exception.ImageNotSupportedException; import at.tuwien.exception.QueryMalformedException; import at.tuwien.exception.QueryStoreException; @@ -70,6 +71,12 @@ public interface QueryMapper { }) QueryBriefDto queryToQueryBriefDto(Query data); + @Mappings({ + @Mapping(target = "id", source = "queryId"), + @Mapping(target = "isPersisted", expression = "java(true)"), + }) + Query identifierToQuery(Identifier data); + @Named("internalMapping") default String nameToInternalName(String data) { if (data == null || data.length() == 0) { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java index 7142dbc27ac1a81ce326f1af83af1a9440e12442..7206a5cd9d434cb5b17a0ca7c565e1b1b9d41785 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java @@ -6,9 +6,11 @@ import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.entities.database.Database; +import at.tuwien.entities.identifier.Identifier; import at.tuwien.exception.*; import at.tuwien.querystore.Query; import at.tuwien.service.DatabaseService; +import at.tuwien.service.IdentifierService; import at.tuwien.service.QueryService; import at.tuwien.service.StoreService; import at.tuwien.utils.PrincipalUtil; @@ -35,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.security.Principal; +import java.util.List; @Log4j2 @RestController @@ -171,8 +174,8 @@ public class QueryEndpoint { AccessDeniedException, QueryNotFoundException { log.debug("endpoint re-execute query, databaseId={}, queryId={}, page={}, size={}, sortDirection={}, sortColumn={}, {}", databaseId, queryId, page, size, sortDirection, sortColumn, PrincipalUtil.formatForDebug(principal)); + final Database database = databaseService.findById(databaseId); endpointValidator.validateDataParams(page, size, sortDirection, sortColumn); - endpointValidator.validateOnlyAccessOrPublic(databaseId, principal); /* execute */ final Query query = storeService.findOne(databaseId, queryId, principal); final Long count = queryService.reExecuteCount(databaseId, query, principal); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java index c5751ed5888c849724b18ceab759a21714c6cbb9..408d9a86086ec03deee5c52404f3c712963fed33 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java @@ -6,16 +6,15 @@ import at.tuwien.api.database.query.QueryPersistDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.UserDto; +import at.tuwien.entities.database.Database; import at.tuwien.entities.identifier.Identifier; +import at.tuwien.entities.identifier.IdentifierType; import at.tuwien.exception.*; import at.tuwien.mapper.IdentifierMapper; import at.tuwien.mapper.QueryMapper; import at.tuwien.mapper.UserMapper; import at.tuwien.querystore.Query; -import at.tuwien.service.AccessService; -import at.tuwien.service.IdentifierService; -import at.tuwien.service.StoreService; -import at.tuwien.service.UserService; +import at.tuwien.service.*; import at.tuwien.utils.PrincipalUtil; import at.tuwien.utils.UserUtil; import at.tuwien.validation.EndpointValidator; @@ -54,19 +53,21 @@ public class StoreEndpoint { private final UserService userService; private final StoreService storeService; private final AccessService accessService; + private final DatabaseService databaseService; private final IdentifierMapper identifierMapper; private final EndpointValidator endpointValidator; private final IdentifierService identifierService; @Autowired public StoreEndpoint(UserMapper userMapper, QueryMapper queryMapper, UserService userService, StoreService storeService, - AccessService accessService, IdentifierMapper identifierMapper, + AccessService accessService, DatabaseService databaseService, IdentifierMapper identifierMapper, EndpointValidator endpointValidator, IdentifierService identifierService) { this.userMapper = userMapper; this.queryMapper = queryMapper; this.userService = userService; this.storeService = storeService; this.accessService = accessService; + this.databaseService = databaseService; this.identifierMapper = identifierMapper; this.endpointValidator = endpointValidator; this.identifierService = identifierService; @@ -125,14 +126,23 @@ public class StoreEndpoint { DatabaseConnectionException, TableMalformedException, UserNotFoundException, NotAllowedException, AccessDeniedException { log.debug("endpoint list queries, databaseId={}, persisted={}, {}", databaseId, persisted, PrincipalUtil.formatForDebug(principal)); - endpointValidator.validateOnlyAccessOrPublic(databaseId, principal); + final Database database = databaseService.findById(databaseId); /* find all from data database */ - final List<Query> queries = storeService.findAll(databaseId, persisted, principal); - /* add identifiers and creator from metadata database */ final List<IdentifierDto> identifiers = identifierService.findAllSubsetIdentifiers() .stream() .map(identifierMapper::identifierToIdentifierDto) .toList(); + final List<Query> queries; + if (!database.getIsPublic() && principal == null) { + queries = identifierService.findAllSubsetIdentifiers() + .stream() + .filter(i -> i.getType().equals(IdentifierType.SUBSET)) + .map(queryMapper::identifierToQuery) + .toList(); + } else { + queries = storeService.findAll(databaseId, persisted, principal); + } + /* add identifiers and creator from metadata database */ final List<UserDto> users = userService.findAll() .stream() .map(userMapper::userToUserDto) diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index 9f9c8f85e357a5d96ef887749ac66340fcdc2ee6..e33b9cb5c8458574584e7c0ebe8425d6fc6f7f2c 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -291,7 +291,8 @@ public class ViewEndpoint { /* check */ endpointValidator.validateDataParams(page, size); final Database database = databaseService.find(databaseId); - if (!database.getIsPublic()) { + final View view = viewService.findById(databaseId, viewId, principal); + if (!database.getIsPublic() && !view.getIsPublic()) { if (principal == null) { log.error("Failed to view data of private view: principal is null"); throw new NotAllowedException("Failed to view data of private view: principal is null"); @@ -312,7 +313,6 @@ public class ViewEndpoint { } /* find */ log.debug("find view data for database with id {}", databaseId); - final View view = viewService.findById(databaseId, viewId, principal); final Long count = queryService.viewCount(databaseId, view, principal); final HttpHeaders headers = new HttpHeaders(); headers.set("X-Count", "" + count); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java index df8df65792718d259b73b91ca75901ff2f20502d..59d69125c3e56c894fb00dba5a2a899e610a63e0 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java @@ -3,6 +3,7 @@ package at.tuwien.service.impl; import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.QueryPersistDto; import at.tuwien.entities.database.Database; +import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.mapper.StoreMapper; diff --git a/dbrepo-ui/components/subset/SubsetToolbar.vue b/dbrepo-ui/components/subset/SubsetToolbar.vue index aa481ac4921c51ff4396ae5c6f3cf1fca8e2109b..63d325d263c97993ceee56489f9e41889d29eb64 100644 --- a/dbrepo-ui/components/subset/SubsetToolbar.vue +++ b/dbrepo-ui/components/subset/SubsetToolbar.vue @@ -66,6 +66,7 @@ :text="$t('navigation.info')" :to="`/database/${$route.params.database_id}/subset/${$route.params.subset_id}/info`" /> <v-tab + v-if="canViewData" :text="$t('navigation.data')" :to="`/database/${$route.params.database_id}/subset/${$route.params.subset_id}/data`" /> </v-tabs> @@ -120,6 +121,12 @@ export default { } return this.database.subsets.filter(s => s.query_id === Number(this.$route.params.subset_id)) }, + canViewData () { + if (!this.database) { + return false + } + return this.database.is_public + }, identifier () { /* mount pid */ if (this.pid) { diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue index 83850ebf93c12fc6c5c14e260269b8dc16129241..6dc9804315eb3f2354387f9725582b984fa2e782 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue @@ -17,6 +17,7 @@ <v-divider v-if="subset && identifier" /> <v-card + v-if="subset" variant="flat" rounded="0" :title="$t('pages.subset.title')">