diff --git a/.docs/changelog.md b/.docs/changelog.md index f2bb1ab0571500d7cb4a80d955381d3ef03a2b52..e2bb59c3748fde0b9da1db9099e013fd6b928db8 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,6 +2,22 @@ author: Martin Weise --- +## v1.6.2 (2025-01-24) + +[:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.2) + +### What's Changed + +#### Changes + +* Added interface tests for the Python library in Gitlab CI/CD pipeline + in [#486](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/486). + +#### Fixes + +* Fixed a bug where no pagination was possible + in [#487](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/487). + ## v1.6.1 (2025-01-21) [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.1) @@ -15,7 +31,7 @@ author: Martin Weise #### Fixes -* Added init container that adds the admin user to the Metadata Database +* Added init container that adds the admin user to the Metadata Database in [#480](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/480). ## v1.6.0 (2025-01-07) diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 35c646674712a531ed475532220afed30ab01295..92ba523f367dc170bd0e60e7113334e34cc697de 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -723,11 +723,11 @@ public class TableEndpoint extends RestEndpoint { public ResponseEntity<TableStatisticDto> statistic(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("tableId") Long tableId) throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException, - MetadataServiceException, TableMalformedException, DatabaseNotFoundException { + MetadataServiceException, TableMalformedException { log.debug("endpoint generate table statistic, databaseId={}, tableId={}", databaseId, tableId); - final TableDto table = credentialService.getTable(databaseId, tableId); try { - return ResponseEntity.ok(tableService.getStatistics(credentialService.getDatabase(table.getTdbid()), table)); + return ResponseEntity.ok(tableService.getStatistics( + credentialService.getTable(databaseId, tableId))); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database", e); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java index 00553dce066641b63afa36da7df33fe6e9c192ca..3cecdb64570a6c9de282964a0ee07a220135360a 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java @@ -53,7 +53,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_4_ID)) - .thenReturn(USER_4_PRIVILEGED_DTO); + .thenReturn(USER_4_DTO); /* test */ final ResponseEntity<Void> response = accessEndpoint.create(DATABASE_1_ID, USER_4_ID, UPDATE_DATABASE_ACCESS_READ_DTO); @@ -70,7 +70,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_1_ID)) - .thenReturn(USER_1_PRIVILEGED_DTO); + .thenReturn(USER_1_DTO); /* test */ assertThrows(NotAllowedException.class, () -> { @@ -87,10 +87,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_4_ID)) - .thenReturn(USER_4_PRIVILEGED_DTO); + .thenReturn(USER_4_DTO); doThrow(SQLException.class) .when(accessService) - .create(DATABASE_1_DTO, USER_4_PRIVILEGED_DTO, AccessTypeDto.READ); + .create(DATABASE_1_DTO, USER_4_DTO, AccessTypeDto.READ); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { @@ -151,7 +151,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_1_ID)) - .thenReturn(USER_1_PRIVILEGED_DTO); + .thenReturn(USER_1_DTO); /* test */ final ResponseEntity<Void> response = accessEndpoint.update(DATABASE_1_ID, USER_1_ID, UPDATE_DATABASE_ACCESS_READ_DTO); @@ -168,10 +168,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_1_ID)) - .thenReturn(USER_1_PRIVILEGED_DTO); + .thenReturn(USER_1_DTO); doThrow(SQLException.class) .when(accessService) - .update(DATABASE_1_DTO, USER_1_PRIVILEGED_DTO, AccessTypeDto.READ); + .update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.READ); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { @@ -188,7 +188,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_4_ID)) - .thenReturn(USER_4_PRIVILEGED_DTO); + .thenReturn(USER_4_DTO); /* test */ assertThrows(NotAllowedException.class, () -> { @@ -250,7 +250,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_1_ID)) - .thenReturn(USER_1_PRIVILEGED_DTO); + .thenReturn(USER_1_DTO); doNothing() .when(accessService) .delete(any(DatabaseDto.class), any(UserDto.class)); @@ -270,7 +270,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_4_ID)) - .thenReturn(USER_4_PRIVILEGED_DTO); + .thenReturn(USER_4_DTO); /* test */ assertThrows(NotAllowedException.class, () -> { @@ -331,10 +331,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { when(credentialService.getDatabase(DATABASE_1_ID)) .thenReturn(DATABASE_1_DTO); when(credentialService.getUser(USER_1_ID)) - .thenReturn(USER_1_PRIVILEGED_DTO); + .thenReturn(USER_1_DTO); doThrow(SQLException.class) .when(accessService) - .delete(DATABASE_1_DTO, USER_1_PRIVILEGED_DTO); + .delete(DATABASE_1_DTO, USER_1_DTO); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java index 592063e03412f480db0e1bd796b4825445114e60..0c6f9d8521d1a1214e4ab1145e55fa8b3e9c3299 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java @@ -5,7 +5,10 @@ import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.user.UserDto; import at.tuwien.endpoints.DatabaseEndpoint; import at.tuwien.exception.*; -import at.tuwien.service.*; +import at.tuwien.service.AccessService; +import at.tuwien.service.ContainerService; +import at.tuwien.service.CredentialService; +import at.tuwien.service.DatabaseService; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; @@ -35,9 +38,6 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Autowired private DatabaseEndpoint databaseEndpoint; - @MockBean - private SubsetService queryService; - @MockBean private ContainerService containerService; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index 35df8f5dd91481e6c2ee9ae987df2f0b197982b0..c7a74de17fc6ecc15e410aefb1366a0ab0e81549 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -1,7 +1,6 @@ package at.tuwien.endpoint; import at.tuwien.api.database.DatabaseAccessDto; -import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.query.ImportDto; import at.tuwien.api.database.table.*; import at.tuwien.endpoints.TableEndpoint; @@ -166,12 +165,12 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void statistic_succeeds() throws DatabaseUnavailableException, TableNotFoundException, SQLException, - TableMalformedException, RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException { + TableMalformedException, RemoteUnavailableException, MetadataServiceException { /* mock */ when(credentialService.getTable(DATABASE_3_ID, TABLE_8_ID)) .thenReturn(TABLE_8_DTO); - when(tableService.getStatistics(any(DatabaseDto.class), any(TableDto.class))) + when(tableService.getStatistics(any(TableDto.class))) .thenReturn(TABLE_8_STATISTIC_DTO); /* test */ @@ -189,7 +188,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .thenReturn(TABLE_8_DTO); doThrow(SQLException.class) .when(tableService) - .getStatistics(any(DatabaseDto.class), any(TableDto.class)); + .getStatistics(any(TableDto.class)); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java index a8633836b88705db66ae2c163796c7fd34b270c1..a2ed7e38174bd9ba2258b5929b010f54313812f6 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java @@ -36,10 +36,6 @@ import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - @MockBean @Qualifier("internalRestTemplate") private RestTemplate internalRestTemplate; @@ -56,13 +52,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { public void getTableById_succeeds() throws TableNotFoundException, RemoteUnavailableException, MetadataServiceException { final HttpHeaders headers = new HttpHeaders(); - headers.set("X-Type", IMAGE_1_JDBC); - headers.set("X-Host", CONTAINER_1_HOST); - headers.set("X-Port", "" + CONTAINER_1_PORT); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); - headers.set("X-Database", DATABASE_1_INTERNALNAME); - headers.set("X-Table", TABLE_1_INTERNAL_NAME); /* mock */ when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class))) @@ -72,12 +63,11 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { /* test */ final TableDto response = metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID); - assertEquals(IMAGE_1_JDBC, response.getJdbcMethod()); - assertEquals(CONTAINER_1_HOST, response.getHost()); - assertEquals(CONTAINER_1_PORT, response.getPort()); - assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getUsername()); - assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getPassword()); - assertEquals(DATABASE_1_INTERNALNAME, response.getDatabase()); + assertEquals(IMAGE_1_JDBC, response.getDatabase().getContainer().getImage().getJdbcMethod()); + assertEquals(CONTAINER_1_HOST, response.getDatabase().getContainer().getHost()); + assertEquals(CONTAINER_1_PORT, response.getDatabase().getContainer().getPort()); + assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getDatabase().getContainer().getUsername()); + assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getDatabase().getContainer().getPassword()); assertEquals(TABLE_1_INTERNAL_NAME, response.getInternalName()); } @@ -147,13 +137,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { @Test public void getTableById_emptyBody_fails() { final HttpHeaders headers = new HttpHeaders(); - headers.set("X-Type", IMAGE_1_JDBC); - headers.set("X-Host", CONTAINER_1_HOST); - headers.set("X-Port", "" + CONTAINER_1_PORT); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); - headers.set("X-Database", DATABASE_1_INTERNALNAME); - headers.set("X-Table", TABLE_1_INTERNAL_NAME); /* mock */ when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class))) @@ -173,8 +158,6 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { final HttpHeaders headers = new HttpHeaders(); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); - headers.set("X-Host", CONTAINER_1_HOST); - headers.set("X-Port", "" + CONTAINER_1_PORT); /* mock */ when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseDto.class))) @@ -369,13 +352,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { @Test public void getViewById_succeeds() throws RemoteUnavailableException, ViewNotFoundException, MetadataServiceException { final HttpHeaders headers = new HttpHeaders(); - headers.set("X-Type", IMAGE_1_JDBC); - headers.set("X-Host", CONTAINER_1_HOST); - headers.set("X-Port", "" + CONTAINER_1_PORT); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); - headers.set("X-Database", DATABASE_1_INTERNALNAME); - headers.set("X-View", VIEW_1_INTERNAL_NAME); /* mock */ when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(ViewDto.class))) @@ -454,12 +432,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { @Test public void getViewById_emptyBody_fails() { final HttpHeaders headers = new HttpHeaders(); - headers.set("X-Type", IMAGE_1_JDBC); - headers.set("X-Host", CONTAINER_1_HOST); - headers.set("X-Port", "" + CONTAINER_1_PORT); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); - headers.set("X-Database", DATABASE_1_INTERNALNAME); /* mock */ when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class))) diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java index 44e5f88912627f20741a25967f9774c24b945f65..752a9b0e055e8084f29498af07e41f3acabf7794 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java @@ -57,8 +57,8 @@ public class DefaultListenerIntegrationTest extends AbstractUnitTest { public void beforeEach() throws SQLException { genesis(); /* database */ - MariaDbConfig.dropAllDatabases(CONTAINER_1_DTO); - MariaDbConfig.createInitDatabase(CONTAINER_1_DTO, DATABASE_1_DTO); + MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO); + MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java index b3a3bf639763cc0ff56837bff07d66c8d5a3b356..7a439ed55c54442df0e3babb034ce27120c4a208 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java @@ -51,9 +51,10 @@ public class DefaultListenerUnitTest extends AbstractUnitTest { @BeforeEach public void beforeEach() throws SQLException { + genesis(); /* metadata database */ - MariaDbConfig.dropAllDatabases(CONTAINER_1_DTO); - MariaDbConfig.createInitDatabase(CONTAINER_1_DTO, DATABASE_1_DTO); + MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO); + MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java index bc121c3b265be3e1b40be470e9261615aaa7b84e..2c174e0a3da88a30e2e8ed8d739cf0200fd5a237 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java @@ -44,16 +44,16 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void beforeEach() throws SQLException { genesis(); /* metadata database */ - MariaDbConfig.dropDatabase(CONTAINER_1_DTO, DATABASE_1_INTERNALNAME); - MariaDbConfig.createInitDatabase(CONTAINER_1_DTO, DATABASE_1_DTO); + MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); + MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); } @Test public void create_read_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.create(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.READ); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.create(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.READ); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); for (String privilege : grantDefaultRead.split(",")) { assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim()))); } @@ -63,8 +63,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void create_writeOwn_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.create(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.create(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); for (String privilege : grantDefaultWrite.split(",")) { assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim()))); } @@ -74,8 +74,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void create_writeAll_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.create(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.create(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); for (String privilege : grantDefaultWrite.split(",")) { assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim()))); } @@ -85,8 +85,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void update_read_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.READ); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.READ); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); for (String privilege : grantDefaultRead.split(",")) { assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim()))); } @@ -96,8 +96,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void update_writeOwn_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); for (String privilege : grantDefaultWrite.split(",")) { assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim()))); } @@ -107,8 +107,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void update_writeAll_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); for (String privilege : grantDefaultWrite.split(",")) { assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim()))); } @@ -119,7 +119,7 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { /* test */ assertThrows(DatabaseMalformedException.class, () -> { - accessService.update(DATABASE_1_DTO, USER_5_DTO, AccessTypeDto.WRITE_ALL); + accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_5_DTO, AccessTypeDto.WRITE_ALL); }); } @@ -127,8 +127,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { public void delete_succeeds() throws SQLException, DatabaseMalformedException { /* test */ - accessService.delete(DATABASE_1_DTO, USER_1_DTO); - final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME); + accessService.delete(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO); + final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); assertEquals(1, privileges.size()); assertEquals("USAGE", privileges.get(0)); } @@ -138,7 +138,7 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { /* test */ assertThrows(DatabaseMalformedException.class, () -> { - accessService.delete(DATABASE_1_DTO, USER_5_DTO); + accessService.delete(DATABASE_1_PRIVILEGED_DTO, USER_5_DTO); }); } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java index e793a8362c595eeeb9db6b4d9053ae94c40ac237..251dfe53c5c6a10782c0ec44a674e1fdba8c1e40 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java @@ -45,7 +45,7 @@ public class ContainerServiceIntegrationTest extends AbstractUnitTest { public void beforeEach() throws SQLException { genesis(); /* metadata database */ - MariaDbConfig.dropDatabase(CONTAINER_1_DTO, DATABASE_1_INTERNALNAME); + MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index 26ff951dda400984090eee3134b62813d8109638..ae1917202dbf519cf500892b8238b53eaecc0933 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -63,7 +63,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { public void beforeEach() throws SQLException { genesis(); /* metadata database */ - MariaDbConfig.dropDatabase(CONTAINER_1_DTO, DATABASE_1_INTERNALNAME); + MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index f8687d8e0d3f4c3aa9c6197fb523163b1262a276..cfab2600e51c682d0b6dce922d6c7c10b68b43a4 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -374,7 +374,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { public void getStatistics_succeeds() throws TableMalformedException, SQLException, TableNotFoundException { /* test */ - final TableStatisticDto response = tableService.getStatistics(DATABASE_1_DTO, TABLE_2_DTO); + final TableStatisticDto response = tableService.getStatistics(TABLE_2_DTO); assertEquals(TABLE_2_COLUMNS.size(), response.getColumns().size()); log.trace("response rows: {}", response.getRows()); assertEquals(3L, response.getRows()); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java index 650652d62fe9a922c434276f89ec427d628236be..7b02192b7ed0209bae55614808e5c236d03da6ef 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java @@ -100,7 +100,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find database with id {}: service responded unsuccessful: {}", id, response.getStatusCode()); throw new MetadataServiceException("Failed to find database: service responded unsuccessful: " + response.getStatusCode()); } - final List<String> expectedHeaders = List.of("X-Username", "X-Password", "X-Host", "X-Port", "X-Type"); + final List<String> expectedHeaders = List.of("X-Username", "X-Password"); if (!response.getHeaders().keySet().containsAll(expectedHeaders)) { log.error("Failed to find all database headers"); log.debug("expected headers: {}", expectedHeaders); @@ -112,12 +112,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { throw new MetadataServiceException("Failed to find database with id " + id + ": body is empty"); } final DatabaseDto database = response.getBody(); - database.setJdbcMethod(response.getHeaders().get("X-Type").get(0)); - database.setUsername(response.getHeaders().get("X-Username").get(0)); - database.setPassword(response.getHeaders().get("X-Password").get(0)); - database.setDatabase(database.getInternalName()); - database.setHost(response.getHeaders().get("X-Host").get(0)); - database.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0))); + database.getContainer().setUsername(response.getHeaders().get("X-Username").get(0)); + database.getContainer().setPassword(response.getHeaders().get("X-Password").get(0)); database.setLastRetrieved(Instant.now()); return database; } @@ -141,7 +137,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find table with id {}: service responded unsuccessful: {}", id, response.getStatusCode()); throw new MetadataServiceException("Failed to find table: service responded unsuccessful: " + response.getStatusCode()); } - final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-Table", "X-Type"); + final List<String> expectedHeaders = List.of("X-Username", "X-Password"); if (!response.getHeaders().keySet().containsAll(expectedHeaders)) { log.error("Failed to find all table headers"); log.debug("expected headers: {}", expectedHeaders); @@ -153,13 +149,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { throw new MetadataServiceException("Failed to find table with id " + id + ": body is empty"); } final TableDto table = metadataMapper.tableDtoToTableDto(response.getBody()); - table.setJdbcMethod(response.getHeaders().get("X-Type").get(0)); - table.setHost(response.getHeaders().get("X-Host").get(0)); - table.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0))); - table.setUsername(response.getHeaders().get("X-Username").get(0)); - table.setPassword(response.getHeaders().get("X-Password").get(0)); - table.setDatabase(response.getHeaders().get("X-Database").get(0)); - table.setInternalName(response.getHeaders().get("X-Table").get(0)); + table.getDatabase().getContainer().setUsername(response.getHeaders().get("X-Username").get(0)); + table.getDatabase().getContainer().setPassword(response.getHeaders().get("X-Password").get(0)); table.setLastRetrieved(Instant.now()); return table; } @@ -183,7 +174,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find view with id {}: service responded unsuccessful: {}", id, response.getStatusCode()); throw new MetadataServiceException("Failed to find view: service responded unsuccessful: " + response.getStatusCode()); } - final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-View", "X-Type"); + final List<String> expectedHeaders = List.of("X-Username", "X-Password"); if (!response.getHeaders().keySet().containsAll(expectedHeaders)) { log.error("Failed to find all view headers"); log.debug("expected headers: {}", expectedHeaders); @@ -195,13 +186,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { throw new MetadataServiceException("Failed to find view with id " + id + ": body is empty"); } final ViewDto view = metadataMapper.viewDtoToViewDto(response.getBody()); - view.setJdbcMethod(response.getHeaders().get("X-Type").get(0)); - view.setHost(response.getHeaders().get("X-Host").get(0)); - view.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0))); - view.setUsername(response.getHeaders().get("X-Username").get(0)); - view.setPassword(response.getHeaders().get("X-Password").get(0)); - view.setDatabase(response.getHeaders().get("X-Database").get(0)); - view.setInternalName(response.getHeaders().get("X-View").get(0)); + view.getDatabase().getContainer().setUsername(response.getHeaders().get("X-Username").get(0)); + view.getDatabase().getContainer().setPassword(response.getHeaders().get("X-Password").get(0)); view.setLastRetrieved(Instant.now()); return view; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java index b74c491abe0af3e02eb4aaa533b72ad6a772e112..636e12ceb687cb3c6ce9d3988931caea676ef7ad 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java @@ -17,14 +17,13 @@ public interface TableService { /** * Generate table statistic for a given table. Only numerical columns are calculated. * - * @param database The database. * @param table The table. * @return The table statistic, if successful. * @throws SQLException Failed to parse SQL query, contains invalid syntax. * @throws TableMalformedException The table statistic generation was unsuccessful, likely due to a bug in the mapping. * @throws TableNotFoundException The table could not be inspected in the data database. */ - TableStatisticDto getStatistics(DatabaseDto database, TableDto table) throws SQLException, TableMalformedException, + TableStatisticDto getStatistics(TableDto table) throws SQLException, TableMalformedException, TableNotFoundException; /** diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java index 16ace6dc9e68adf96762f8b5ef66fc1c02ad17af..be049663b7eb0e3ff2e0f10ccee8e3ee2fc5b759 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java @@ -17,7 +17,7 @@ import java.sql.SQLException; @Log4j2 @Service -public class AccessServiceMariaDbImpl extends DataConnector<DatabaseDto> implements AccessService { +public class AccessServiceMariaDbImpl extends DataConnector implements AccessService { @Value("${dbrepo.grant.default.read}") private String grantDefaultRead; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java index fc9b2d97c3a4a88342eaa44f5c9995a4b9f537e3..aedba1aed2902b35b424832d117e200dcc02aca9 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java @@ -19,7 +19,7 @@ import java.sql.SQLException; @Log4j2 @Service -public class ContainerServiceMariaDbImpl extends DataConnector<ContainerDto> implements ContainerService { +public class ContainerServiceMariaDbImpl extends DataConnector implements ContainerService { private final RabbitConfig rabbitConfig; private final MariaDbMapper mariaDbMapper; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java index 3a54b399d47e69263b355afb730e2800ca90a526..c21d37721b051bf4109b6062a1ffad493c503850 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java @@ -1,20 +1,22 @@ package at.tuwien.service.impl; -import at.tuwien.api.CacheableDto; +import at.tuwien.api.container.ContainerDto; +import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.ViewDto; +import at.tuwien.api.database.table.TableDto; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; @Log4j2 @Service -public abstract class DataConnector<T extends CacheableDto> { +public abstract class DataConnector { - public ComboPooledDataSource getDataSource(T entity) { + public ComboPooledDataSource getDataSource(ContainerDto container, String databaseName) { final ComboPooledDataSource dataSource = new ComboPooledDataSource(); - dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), - entity.getDatabase())); - dataSource.setUser(entity.getUsername()); - dataSource.setPassword(entity.getPassword()); + dataSource.setJdbcUrl(getJdbcUrl(container, databaseName)); + dataSource.setUser(container.getUsername()); + dataSource.setPassword(container.getPassword()); dataSource.setInitialPoolSize(5); dataSource.setMinPoolSize(5); dataSource.setAcquireIncrement(5); @@ -23,37 +25,48 @@ public abstract class DataConnector<T extends CacheableDto> { return dataSource; } - public ComboPooledDataSource getDataSource(T entity, String databaseName) { - final ComboPooledDataSource dataSource = new ComboPooledDataSource(); - dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), databaseName)); - dataSource.setUser(entity.getUsername()); - dataSource.setPassword(entity.getPassword()); - dataSource.setInitialPoolSize(5); - dataSource.setMinPoolSize(5); - dataSource.setAcquireIncrement(5); - dataSource.setMaxPoolSize(20); - dataSource.setMaxStatements(100); - return dataSource; + public ComboPooledDataSource getDataSource(ViewDto view) { + return getDataSource(view.getDatabase().getContainer(), null); + } + + public ComboPooledDataSource getDataSource(TableDto table) { + return getDataSource(table.getDatabase().getContainer(), null); } - public String getSparkUrl(String jdbcMethod, String host, Integer port, String databaseName) { - final StringBuilder sb = new StringBuilder(getJdbcUrl(jdbcMethod, host, port, databaseName)) + public ComboPooledDataSource getDataSource(ContainerDto container) { + return getDataSource(container, null); + } + + public ComboPooledDataSource getDataSource(DatabaseDto database) { + return getDataSource(database.getContainer(), database.getInternalName()); + } + + public String getSparkUrl(ContainerDto container, String databaseName) { + final StringBuilder sb = new StringBuilder(getJdbcUrl(container, databaseName)) .append("?sessionVariables=sql_mode='ANSI_QUOTES'"); log.trace("mapped container to spark url: {}", sb.toString()); return sb.toString(); } - public String getSparkUrl(T entity) { - return getSparkUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), entity.getDatabase()); + public String getSparkUrl(TableDto table) { + return getSparkUrl(table.getDatabase().getContainer(), null); + } + + public String getSparkUrl(DatabaseDto databaseDto) { + return getSparkUrl(databaseDto.getContainer(), null); + } + + public String getSparkUrl(ContainerDto container) { + return getSparkUrl(container, null); } - public String getJdbcUrl(String jdbcMethod, String host, Integer port, String databaseName) { + public String getJdbcUrl(ContainerDto container, String databaseName) { final StringBuilder stringBuilder = new StringBuilder("jdbc:") - .append(jdbcMethod) + .append(container.getImage().getJdbcMethod()) .append("://") - .append(host) + .append(container.getHost()) .append(":") - .append(port); + .append(container.getPort()); if (databaseName != null) { stringBuilder.append("/") .append(databaseName); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java index cfe43d8f8fdadbdc8e4eb3d1e316806681e47b74..c4afe44287abbb5c184fa6ec0f8873d17cf9edcb 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java @@ -29,7 +29,7 @@ import java.util.List; @Log4j2 @Service -public class DatabaseServiceMariaDbImpl extends DataConnector<DatabaseDto> implements DatabaseService { +public class DatabaseServiceMariaDbImpl extends DataConnector implements DatabaseService { private final DataMapper dataMapper; private final QueryConfig queryConfig; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java index 1a26a84ef68fb6e0626ece50dff129a8fb449135..4db29335fbfc4cbdbb8086a2009cb588613d1969 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java @@ -18,7 +18,7 @@ import java.util.Optional; @Log4j2 @Service -public class QueueServiceRabbitMqImpl extends DataConnector<TableDto> implements QueueService { +public class QueueServiceRabbitMqImpl extends DataConnector implements QueueService { private final DataMapper dataMapper; private final MetadataMapper metadataMapper; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java index 62b7c77a845d6d1ed6e317d43bbc1a18ae9943d7..0a208b2890e8702228fb07ca31654625a17b0dd2 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java @@ -13,7 +13,6 @@ import at.tuwien.mapper.MetadataMapper; import at.tuwien.service.DatabaseService; import at.tuwien.service.SubsetService; import at.tuwien.service.TableService; -import at.tuwien.service.ViewService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.Dataset; @@ -29,10 +28,9 @@ import java.util.UUID; @Log4j2 @Service -public class SubsetServiceMariaDbImpl extends DataConnector<DatabaseDto> implements SubsetService { +public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetService { private final DataMapper dataMapper; - private final ViewService viewService; private final TableService tableService; private final MariaDbMapper mariaDbMapper; private final MetadataMapper metadataMapper; @@ -40,11 +38,10 @@ public class SubsetServiceMariaDbImpl extends DataConnector<DatabaseDto> impleme private final MetadataServiceGateway metadataServiceGateway; @Autowired - public SubsetServiceMariaDbImpl(DataMapper dataMapper, ViewService viewService, TableService tableService, - MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper, - DatabaseService databaseService, MetadataServiceGateway metadataServiceGateway) { + public SubsetServiceMariaDbImpl(DataMapper dataMapper, TableService tableService, MariaDbMapper mariaDbMapper, + MetadataMapper metadataMapper, DatabaseService databaseService, + MetadataServiceGateway metadataServiceGateway) { this.dataMapper = dataMapper; - this.viewService = viewService; this.tableService = tableService; this.mariaDbMapper = mariaDbMapper; this.metadataMapper = metadataMapper; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index 482f874624dc2694d305d7fcac7d2b32cc971b26..4d4121f06049251cadebe498ebb32ef9f6a4d409 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -33,7 +33,7 @@ import java.util.Properties; @Log4j2 @Service -public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements TableService { +public class TableServiceMariaDbImpl extends DataConnector implements TableService { private final DataMapper dataMapper; private final SparkSession sparkSession; @@ -52,7 +52,7 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements } @Override - public TableStatisticDto getStatistics(DatabaseDto database, TableDto table) throws SQLException, TableMalformedException, + public TableStatisticDto getStatistics(TableDto table) throws SQLException, TableMalformedException, TableNotFoundException { final ComboPooledDataSource dataSource = getDataSource(table); final Connection connection = dataSource.getConnection(); @@ -62,14 +62,14 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements final long start = System.currentTimeMillis(); final String query = mariaDbMapper.tableColumnStatisticsSelectRawQuery(table.getColumns(), table.getInternalName()); if (query == null) { - log.debug("table {}.{} does not have columns that can be analysed for statistical properties (i.e. no numeric columns)", database.getInternalName(), table.getInternalName()); + log.debug("table {}.{} does not have columns that can be analysed for statistical properties (i.e. no numeric columns)", table.getDatabase().getInternalName(), table.getInternalName()); statistic = null; } else { final ResultSet resultSet = connection.prepareStatement(query) .executeQuery(); log.trace("executed statement in {} ms", System.currentTimeMillis() - start); statistic = dataMapper.resultSetToTableStatistic(resultSet); - final TableDto tmpTable = databaseService.inspectTable(database, table.getInternalName()); + final TableDto tmpTable = databaseService.inspectTable(table.getDatabase(), table.getInternalName()); statistic.setAvgRowLength(tmpTable.getAvgRowLength()); statistic.setDataLength(tmpTable.getDataLength()); statistic.setMaxDataLength(tmpTable.getMaxDataLength()); @@ -95,7 +95,7 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements @Override public void updateTable(TableDto table, TableUpdateDto data) throws SQLException, TableMalformedException { - final ComboPooledDataSource dataSource = getDataSource(table); + final ComboPooledDataSource dataSource = getDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); try { /* create table if not exists */ @@ -122,7 +122,7 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements @Override public void delete(TableDto table) throws SQLException, QueryMalformedException { - final ComboPooledDataSource dataSource = getDataSource(table); + final ComboPooledDataSource dataSource = getDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); try { /* create table if not exists */ @@ -144,14 +144,14 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements @Override public List<TableHistoryDto> history(TableDto table, Long size) throws SQLException, TableNotFoundException { - final ComboPooledDataSource dataSource = getDataSource(table); + final ComboPooledDataSource dataSource = getDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); final List<TableHistoryDto> history; try { /* find table data */ final long start = System.currentTimeMillis(); final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectHistoryRawQuery( - table.getDatabase(), table.getInternalName(), size)) + table.getDatabase().getInternalName(), table.getInternalName(), size)) .executeQuery(); log.trace("executed statement in {} ms", System.currentTimeMillis() - start); history = dataMapper.resultSetToTableHistory(resultSet); @@ -170,14 +170,14 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements @Override public Long getCount(TableDto table, Instant timestamp) throws SQLException, QueryMalformedException { - final ComboPooledDataSource dataSource = getDataSource(table); + final ComboPooledDataSource dataSource = getDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); final Long queryResult; try { /* find table data */ final long start = System.currentTimeMillis(); final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( - table.getDatabase(), table.getInternalName(), timestamp)) + table.getDatabase().getInternalName(), table.getInternalName(), timestamp)) .executeQuery(); log.trace("executed statement in {} ms", System.currentTimeMillis() - start); queryResult = mariaDbMapper.resultSetToNumber(resultSet); @@ -204,8 +204,8 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements final Dataset<Row> dataset = storageService.loadDataset(columns, data.getLocation(), String.valueOf(data.getSeparator()), data.getHeader()); final Properties properties = new Properties(); - properties.setProperty("user", table.getUsername()); - properties.setProperty("password", table.getPassword()); + properties.setProperty("user", table.getDatabase().getContainer().getUsername()); + properties.setProperty("password", table.getDatabase().getContainer().getPassword()); final String temporaryTable = table.getInternalName() + "_tmp"; try { log.trace("import dataset to temporary table: {}", temporaryTable); @@ -375,10 +375,9 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements try { return sparkSession.read() .format("jdbc") - .option("user", database.getUsername()) - .option("password", database.getPassword()) - .option("url", getSparkUrl(database.getJdbcMethod(), database.getHost(), database.getPort(), - database.getInternalName())) + .option("user", database.getContainer().getUsername()) + .option("password", database.getContainer().getPassword()) + .option("url", getSparkUrl(database)) .option("query", mariaDbMapper.defaultRawSelectQuery(database.getInternalName(), tableOrView, timestamp, page, size)) .load(); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java index 3224c371a34774978b72bd58f6acaadb8081af99..fff524047e10b575f773fe23656f86944514843a 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java @@ -17,7 +17,7 @@ import java.time.Instant; @Log4j2 @Service -public class ViewServiceMariaDbImpl extends DataConnector<ViewDto> implements ViewService { +public class ViewServiceMariaDbImpl extends DataConnector implements ViewService { private final MariaDbMapper mariaDbMapper; @@ -57,7 +57,7 @@ public class ViewServiceMariaDbImpl extends DataConnector<ViewDto> implements Vi /* find view data */ final long start = System.currentTimeMillis(); final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( - view.getDatabase(), view.getInternalName(), timestamp)) + view.getDatabase().getInternalName(), view.getInternalName(), timestamp)) .executeQuery(); log.trace("executed statement in {} ms", System.currentTimeMillis() - start); queryResult = mariaDbMapper.resultSetToNumber(resultSet); diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java index 4ff6f699d68d8b26ec576e6be1d40134722b0640..e947ece6320820e926a3674834310c785042603d 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java @@ -1,6 +1,5 @@ package at.tuwien.api; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.EqualsAndHashCode; @@ -20,28 +19,4 @@ public abstract class CacheableDto { @Schema(example = "2025-01-23T12:09:01") private Instant lastRetrieved; - @ToString.Exclude - @Schema(example = "mariadb") - private String jdbcMethod; - - @ToString.Exclude - @Schema(example = "data-db") - private String host; - - @ToString.Exclude - @Schema(example = "3306") - private Integer port; - - @ToString.Exclude - @Schema(example = "username") - private String username; - - @ToString.Exclude - @JsonIgnore - private String password; - - @ToString.Exclude - @Schema(example = "air_quality") - private String database; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java index 56d0df315f3875ac93e07e3e9a80b94179586c9b..913ab26d9d4469fb3335d5dc1da8463c9afc0bd6 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java @@ -2,7 +2,6 @@ package at.tuwien.api.container; import at.tuwien.api.CacheableDto; import at.tuwien.api.container.image.ImageDto; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -35,6 +34,12 @@ public class ContainerDto extends CacheableDto { @Schema(example = "air_quality") private String internalName; + @Schema(example = "data-db") + private String host; + + @Schema(example = "3306") + private Integer port; + @JsonProperty("ui_host") @Schema(example = "example.com") private String uiHost; @@ -54,34 +59,18 @@ public class ContainerDto extends CacheableDto { @Schema(example = "10") private Long count; - /* lombok limitations prevent from convenient builder functions */ - - @JsonProperty("last_retrieved") - @Schema(example = "2025-01-23T12:09:01") - private Instant lastRetrieved; - - @ToString.Exclude - @Schema(example = "mariadb") - private String jdbcMethod; - - @ToString.Exclude - @Schema(example = "data-db") - private String host; - - @ToString.Exclude - @Schema(example = "3306") - private Integer port; - @ToString.Exclude @Schema(example = "username") private String username; @ToString.Exclude - @JsonIgnore + @Schema(example = "p4ssw0rd") private String password; - @ToString.Exclude - @Schema(example = "air_quality") - private String database; + /* lombok limitations prevent from convenient builder functions */ + + @JsonProperty("last_retrieved") + @Schema(example = "2025-01-23T12:09:01") + private Instant lastRetrieved; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java index c6866c494b179db858875e555f87aa761dd3e5db..d6ea2bff9e2203439891e3a1a6aec6f17afc86a6 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java @@ -5,7 +5,6 @@ import at.tuwien.api.container.ContainerDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.UserBriefDto; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -67,7 +66,6 @@ public class DatabaseDto extends CacheableDto { @Schema(example = "true") private Boolean isSchemaPublic; - @NotNull private ContainerDto container; @NotNull @@ -94,28 +92,4 @@ public class DatabaseDto extends CacheableDto { @Schema(example = "2025-01-23T12:09:01") private Instant lastRetrieved; - @ToString.Exclude - @Schema(example = "mariadb") - private String jdbcMethod; - - @ToString.Exclude - @Schema(example = "data-db") - private String host; - - @ToString.Exclude - @Schema(example = "3306") - private Integer port; - - @ToString.Exclude - @Schema(example = "username") - private String username; - - @ToString.Exclude - @JsonIgnore - private String password; - - @ToString.Exclude - @Schema(example = "air_quality") - private String database; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java index 2785cf71075f3f254986290bacc184954b3d10bf..5f9373bb12148777dfadbceae94f1a97dc7dcb78 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java @@ -3,7 +3,6 @@ package at.tuwien.api.database; import at.tuwien.api.CacheableDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.UserBriefDto; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -66,6 +65,8 @@ public class ViewDto extends CacheableDto { @Schema(example = "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916") private String queryHash; + private DatabaseDto database; + @NotNull private UserBriefDto owner; @@ -78,28 +79,4 @@ public class ViewDto extends CacheableDto { @Schema(example = "2025-01-23T12:09:01") private Instant lastRetrieved; - @ToString.Exclude - @Schema(example = "mariadb") - private String jdbcMethod; - - @ToString.Exclude - @Schema(example = "data-db") - private String host; - - @ToString.Exclude - @Schema(example = "3306") - private Integer port; - - @ToString.Exclude - @Schema(example = "username") - private String username; - - @ToString.Exclude - @JsonIgnore - private String password; - - @ToString.Exclude - @Schema(example = "air_quality") - private String database; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java index ba80f473b8f248c2295359b2e8162c987324a3f4..e456908ed620d7883ee4287f09063ed9171e5c19 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java @@ -1,6 +1,8 @@ package at.tuwien.api.database.table; import at.tuwien.api.CacheableDto; +import at.tuwien.api.container.ContainerDto; +import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.constraints.ConstraintsDto; import at.tuwien.api.identifier.IdentifierDto; @@ -105,6 +107,8 @@ public class TableDto extends CacheableDto { @NotNull private List<ColumnDto> columns; + private DatabaseDto database; + @NotNull private ConstraintsDto constraints; @@ -114,28 +118,4 @@ public class TableDto extends CacheableDto { @Schema(example = "2025-01-23T12:09:01") private Instant lastRetrieved; - @ToString.Exclude - @Schema(example = "mariadb") - private String jdbcMethod; - - @ToString.Exclude - @Schema(example = "data-db") - private String host; - - @ToString.Exclude - @Schema(example = "3306") - private Integer port; - - @ToString.Exclude - @Schema(example = "username") - private String username; - - @ToString.Exclude - @JsonIgnore - private String password; - - @ToString.Exclude - @Schema(example = "air_quality") - private String database; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java index 26192f460f011b493056cd9778aa76e0f056c4ae..e7367e2fb4e513a9681783dfdec89b55e57519e0 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java @@ -1,7 +1,6 @@ package at.tuwien.api.user; import at.tuwien.api.CacheableDto; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; @@ -28,6 +27,15 @@ public class UserDto extends CacheableDto { @Schema(example = "Josiah Carberry") private String name; + @NotNull + @Schema(example = "username") + private String username; + + @NotNull + @ToString.Exclude + @Schema(example = "p4ssw0rd") + private String password; + @JsonProperty("qualified_name") @Schema(example = "Josiah Carberry — @jcarberry") private String qualifiedName; @@ -49,28 +57,4 @@ public class UserDto extends CacheableDto { @Schema(example = "2025-01-23T12:09:01") private Instant lastRetrieved; - @ToString.Exclude - @Schema(example = "mariadb") - private String jdbcMethod; - - @ToString.Exclude - @Schema(example = "data-db") - private String host; - - @ToString.Exclude - @Schema(example = "3306") - private Integer port; - - @ToString.Exclude - @Schema(example = "username") - private String username; - - @ToString.Exclude - @JsonIgnore - private String password; - - @ToString.Exclude - @Schema(example = "air_quality") - private String database; - } diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java index 75f589e4c5dba7f08f2a0e799f4f6238569eb38b..cd0b90f9f6458d4c921347586d99ada986f988d0 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -2,8 +2,8 @@ package at.tuwien.mapper; import at.tuwien.api.auth.SignupRequestDto; import at.tuwien.api.container.ContainerBriefDto; -import at.tuwien.api.container.CreateContainerDto; import at.tuwien.api.container.ContainerDto; +import at.tuwien.api.container.CreateContainerDto; import at.tuwien.api.container.image.DataTypeDto; import at.tuwien.api.container.image.ImageBriefDto; import at.tuwien.api.container.image.ImageCreateDto; @@ -833,9 +833,6 @@ public interface MetadataMapper { .trim(); } - @Mappings({ - @Mapping(target = "database", ignore = true) - }) ViewDto viewToViewDto(View data); @Mappings({ diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java index 4779a6428e33bde6be581921a9d15bd81a25c5b6..7ec1471f4d1f110e9d6eefff902b6190a4dbde5b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java @@ -1,10 +1,8 @@ package at.tuwien.endpoints; +import at.tuwien.api.container.ContainerDto; import at.tuwien.api.user.UserDetailsDto; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.service.UserService; import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.User; import java.security.Principal; import java.util.UUID; @@ -45,4 +43,11 @@ public abstract class AbstractEndpoint { throw new IllegalArgumentException("Unknown principal instance: " + authentication.getPrincipal().getClass()); } + public void removeInternalData(ContainerDto container) { + container.setPassword(null); + container.setUsername(null); + container.setHost(null); + container.setPort(null); + } + } 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 194f79d2554748750eac2ee90d01846f1ca64a8f..44d3c10c744ab7282186939444cd9fb7692307ed 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 @@ -549,10 +549,9 @@ public class DatabaseEndpoint extends AbstractEndpoint { if (isSystem(principal)) { headers.set("X-Username", database.getContainer().getPrivilegedUsername()); headers.set("X-Password", database.getContainer().getPrivilegedPassword()); - headers.set("X-Host", database.getContainer().getHost()); - headers.set("X-Port", "" + database.getContainer().getPort()); - headers.set("X-Type", database.getContainer().getImage().getJdbcMethod()); - headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port"); + headers.set("Access-Control-Expose-Headers", "X-Username X-Password"); + } else { + removeInternalData(dto.getContainer()); } return ResponseEntity.status(HttpStatus.OK) .headers(headers) 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 39d7f614608534c5252bcfe92cd749b251660ddb..61ba0d53e74c921ab3b21e3d850b32a8917b6a4b 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 @@ -358,9 +358,9 @@ public class TableEndpoint extends AbstractEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<TableDto> create(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @Valid @RequestBody TableCreateDto data, - @NotNull Principal principal) throws NotAllowedException, MalformedException, + public ResponseEntity<TableBriefDto> create(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @Valid @RequestBody TableCreateDto data, + @NotNull Principal principal) throws NotAllowedException, MalformedException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, UserNotFoundException, AccessNotFoundException, TableNotFoundException, TableExistsException, SearchServiceException, SearchServiceConnectionException, OntologyNotFoundException, SemanticEntityNotFoundException { @@ -370,7 +370,7 @@ public class TableEndpoint extends AbstractEndpoint { endpointValidator.validateOnlyAccess(database, principal, true); endpointValidator.validateColumnCreateConstraints(data); return ResponseEntity.status(HttpStatus.CREATED) - .body(metadataMapper.tableToTableDto( + .body(metadataMapper.tableToTableBriefDto( tableService.createTable(database, data, principal))); } @@ -413,10 +413,10 @@ public class TableEndpoint extends AbstractEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<TableDto> update(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId, - @NotNull @Valid @RequestBody TableUpdateDto data, - @NotNull Principal principal) throws NotAllowedException, + public ResponseEntity<TableBriefDto> update(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("tableId") Long tableId, + @NotNull @Valid @RequestBody TableUpdateDto data, + @NotNull Principal principal) throws NotAllowedException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException, SearchServiceConnectionException { log.debug("endpoint update table, databaseId={}, data.is_public={}, data.is_schema_public={}, principal.name={}", @@ -428,7 +428,7 @@ public class TableEndpoint extends AbstractEndpoint { throw new NotAllowedException("Failed to update table: not owner"); } return ResponseEntity.accepted() - .body(metadataMapper.tableToTableDto( + .body(metadataMapper.tableToTableBriefDto( tableService.updateTable(table, data))); } @@ -443,11 +443,6 @@ public class TableEndpoint extends AbstractEndpoint { description = "Find table successfully", headers = {@Header(name = "X-Username", description = "The authentication username", schema = @Schema(implementation = String.class)), @Header(name = "X-Password", description = "The authentication password", schema = @Schema(implementation = String.class)), - @Header(name = "X-Host", description = "The database hostname", schema = @Schema(implementation = String.class)), - @Header(name = "X-Port", description = "The database port number", schema = @Schema(implementation = Integer.class)), - @Header(name = "X-Type", description = "The JDBC connection type", schema = @Schema(implementation = String.class)), - @Header(name = "X-Database", description = "The database internal name", schema = @Schema(implementation = String.class)), - @Header(name = "X-Table", description = "The table internal name", schema = @Schema(implementation = String.class)), @Header(name = "Access-Control-Expose-Headers", description = "Expose custom headers", schema = @Schema(implementation = String.class))}, content = {@Content( mediaType = "application/json", @@ -500,20 +495,18 @@ public class TableEndpoint extends AbstractEndpoint { table.setColumns(List.of()); table.setConstraints(null); } + final TableDto dto = metadataMapper.tableToTableDto(table); final HttpHeaders headers = new HttpHeaders(); if (isSystem(principal)) { headers.set("X-Username", table.getDatabase().getContainer().getPrivilegedUsername()); headers.set("X-Password", table.getDatabase().getContainer().getPrivilegedPassword()); - headers.set("X-Host", table.getDatabase().getContainer().getHost()); - headers.set("X-Port", "" + table.getDatabase().getContainer().getPort()); - headers.set("X-Type", table.getDatabase().getContainer().getImage().getJdbcMethod()); - headers.set("X-Database", table.getDatabase().getInternalName()); - headers.set("X-Table", table.getInternalName()); - headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-Table"); + headers.set("Access-Control-Expose-Headers", "X-Username X-Password"); + } else { + removeInternalData(dto.getDatabase().getContainer()); } return ResponseEntity.ok() .headers(headers) - .body(metadataMapper.tableToTableDto(table)); + .body(dto); } @DeleteMapping("/{tableId}") 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 5a349ff3782f1c94a4aea6f4d609f3402437b9c0..da979b34f183d25a3696aaad4f2ca606fc8d76a5 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 @@ -139,14 +139,14 @@ public class UserEndpoint extends AbstractEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<UserDto> create(@NotNull @Valid @RequestBody SignupRequestDto data) + public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody SignupRequestDto data) throws UserExistsException, EmailExistsException, AuthServiceException, AuthServiceConnectionException, UserNotFoundException, CredentialsInvalidException { log.debug("endpoint create user, data.username={}", data.getUsername()); userService.validateUsernameNotExists(data.getUsername()); userService.validateEmailNotExists(data.getEmail()); return ResponseEntity.status(HttpStatus.CREATED) - .body(userMapper.userToUserDto( + .body(userMapper.userToUserBriefDto( userService.create(data, authenticationService.create(data).getAttributes().getLdapId()[0]))); } @@ -328,7 +328,7 @@ public class UserEndpoint extends AbstractEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<UserDto> modify(@NotNull @PathVariable("userId") UUID userId, + public ResponseEntity<UserBriefDto> modify(@NotNull @PathVariable("userId") UUID userId, @NotNull @Valid @RequestBody UserUpdateDto data, @NotNull Principal principal) throws NotAllowedException, UserNotFoundException, DatabaseNotFoundException { @@ -339,7 +339,7 @@ public class UserEndpoint extends AbstractEndpoint { throw new NotAllowedException("Failed to modify user: not current user " + user.getId()); } return ResponseEntity.accepted() - .body(userMapper.userToUserDto( + .body(userMapper.userToUserBriefDto( userService.modify(user, data))); } 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 8a4a087da20e4578a40801ac670a7ed5a3826521..abfbdb5d366f289c2d93fd07194241ce1b31a8d4 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 @@ -202,9 +202,13 @@ public class ViewEndpoint extends AbstractEndpoint { headers.set("X-View", view.getInternalName()); headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-View"); } + final ViewDto dto = metadataMapper.viewToViewDto(view); + if (!isSystem(principal)) { + removeInternalData(dto.getDatabase().getContainer()); + } return ResponseEntity.status(HttpStatus.OK) .headers(headers) - .body(metadataMapper.viewToViewDto(view)); + .body(dto); } @DeleteMapping("/{viewId}") @@ -248,9 +252,9 @@ public class ViewEndpoint extends AbstractEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("viewId") Long viewId, - @NotNull Principal principal) throws NotAllowedException, DataServiceException, + public ResponseEntity<Void> delete(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("viewId") Long viewId, + @NotNull Principal principal) throws NotAllowedException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException, SearchServiceConnectionException, UserNotFoundException { log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId); @@ -301,10 +305,10 @@ public class ViewEndpoint extends AbstractEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<ViewDto> update(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("viewId") Long viewId, - @NotNull @Valid @RequestBody ViewUpdateDto data, - @NotNull Principal principal) throws NotAllowedException, + public ResponseEntity<ViewBriefDto> update(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("viewId") Long viewId, + @NotNull @Valid @RequestBody ViewUpdateDto data, + @NotNull Principal principal) throws NotAllowedException, DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException, SearchServiceConnectionException, UserNotFoundException { log.debug("endpoint update view, databaseId={}, viewId={}", databaseId, viewId); @@ -315,7 +319,7 @@ public class ViewEndpoint extends AbstractEndpoint { throw new NotAllowedException("Failed to update view: not the database- or view owner"); } return ResponseEntity.accepted() - .body(metadataMapper.viewToViewDto( + .body(metadataMapper.viewToViewBriefDto( viewService.update(database, view, data))); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java index ef06d7f37fd01373df24be3c27f95919850b9fae..9cc0c4cc8baa09e15116a1048a95312f2e954ae6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java @@ -1040,7 +1040,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - final ResponseEntity<TableDto> response = generic_update(request, USER_1_PRINCIPAL); + final ResponseEntity<TableBriefDto> response = generic_update(request, USER_1_PRINCIPAL); assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); assertNotNull(response.getBody()); } @@ -1147,7 +1147,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { return tableEndpoint.list(databaseId, principal); } - protected ResponseEntity<TableDto> generic_create(Long databaseId, Database database, TableCreateDto data, + protected ResponseEntity<TableBriefDto> generic_create(Long databaseId, Database database, TableCreateDto data, Principal principal, User user, DatabaseAccess access) throws MalformedException, NotAllowedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, TableNotFoundException, @@ -1273,7 +1273,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { return tableEndpoint.updateColumn(databaseId, tableId, columnId, data, principal); } - protected ResponseEntity<TableDto> generic_update(TableUpdateDto data, Principal caller) + protected ResponseEntity<TableBriefDto> generic_update(TableUpdateDto data, Principal caller) throws TableNotFoundException, SearchServiceException, NotAllowedException, DataServiceException, DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException { 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 be0ea28c496d9c3bd65df14f8a312af5c9003069..8b653f9356b7814add62faa42636bbcfe5640aed 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 @@ -458,9 +458,9 @@ public class UserEndpointUnitTest extends AbstractUnitTest { .thenReturn(userDto); /* test */ - final ResponseEntity<UserDto> response = userEndpoint.create(data); + final ResponseEntity<UserBriefDto> response = userEndpoint.create(data); assertEquals(HttpStatus.CREATED, response.getStatusCode()); - final UserDto body = response.getBody(); + final UserBriefDto body = response.getBody(); assertNotNull(body); } @@ -496,9 +496,9 @@ public class UserEndpointUnitTest extends AbstractUnitTest { .thenReturn(user); /* test */ - final ResponseEntity<UserDto> response = userEndpoint.modify(userId, data, principal); + final ResponseEntity<UserBriefDto> response = userEndpoint.modify(userId, data, principal); assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final UserDto body = response.getBody(); + final UserBriefDto body = response.getBody(); assertNotNull(body); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java index 2815dd6c0557a31490dff959bcff7f60e559b805..4cd9296425a6e56c32f5f380a52d79e8945900e6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java @@ -571,7 +571,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { .thenReturn(VIEW_1); /* test */ - final ResponseEntity<ViewDto> response = viewEndpoint.update(DATABASE_1_ID, VIEW_1_ID, request, principal); + final ResponseEntity<ViewBriefDto> response = viewEndpoint.update(DATABASE_1_ID, VIEW_1_ID, request, principal); assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); assertNotNull(response.getBody()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java index 725d956f570e7ed6678047b4bb9d7baf85cbe33b..dc77ff263b37406845afb93e80a5afc27f59f380 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java @@ -132,7 +132,7 @@ public class ImageServiceUnitTest extends AbstractUnitTest { when(imageRepository.save(any())) .thenReturn(IMAGE_1); when(mockImageService.update(IMAGE_1, request)) - .thenReturn(CONTAINER_1_IMAGE); + .thenReturn(IMAGE_1); /* test */ final ContainerImage response = mockImageService.update(IMAGE_1, request); @@ -153,7 +153,7 @@ public class ImageServiceUnitTest extends AbstractUnitTest { when(imageRepository.save(any())) .thenReturn(IMAGE_1); when(mockImageService.update(IMAGE_1, request)) - .thenReturn(CONTAINER_1_IMAGE); + .thenReturn(IMAGE_1); /* test */ final ContainerImage response = mockImageService.update(IMAGE_1, request); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index 232b4cd28020819bba79b10f689f47352b797c42..9d5ab6b3d7648053236637bdae20e016af25167b 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -42,6 +42,8 @@ public abstract class AbstractUnitTest extends BaseTest { TABLE_1.setColumns(new LinkedList<>(TABLE_1_COLUMNS)); TABLE_1.setConstraints(TABLE_1_CONSTRAINTS); TABLE_1_DTO.setColumns(new LinkedList<>(TABLE_1_COLUMNS_DTO)); + TABLE_1_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); + TABLE_2_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); VIEW_1_DTO.setIdentifiers(VIEW_1_DTO_IDENTIFIERS); DATABASE_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4))); IDENTIFIER_1.setDatabase(DATABASE_1); @@ -76,10 +78,13 @@ public abstract class AbstractUnitTest extends BaseTest { VIEW_1.setDatabase(DATABASE_1); VIEW_1.setColumns(new LinkedList<>(VIEW_1_COLUMNS)); VIEW_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_3))); + VIEW_1_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); VIEW_2.setDatabase(DATABASE_1); VIEW_2.setColumns(new LinkedList<>(VIEW_2_COLUMNS)); + VIEW_2_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); VIEW_3.setDatabase(DATABASE_1); VIEW_3.setColumns(new LinkedList<>(VIEW_3_COLUMNS)); + VIEW_3_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); IDENTIFIER_1.setDatabase(DATABASE_1); IDENTIFIER_2.setDatabase(DATABASE_1); IDENTIFIER_3.setDatabase(DATABASE_1); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index d732a35843dd28784b03335d1c626fd210f75f8f..85999836878d6c0b8e930b07bad8ca91b70a79e0 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -133,7 +133,7 @@ import static java.time.temporal.ChronoUnit.MINUTES; * <li>Identifier 6 (Title=en, Description=en, Query=3)</li> * </ul> * <p> - * Database 4 (Public Data, Public Schema, User 4) -> Container 4 + * Database 4 (Public Data, Public Schema, User 4) -> Container 2 * <li>Table 9</li> * <li>Identifier 7</li> * <li>Query 7</li> @@ -548,17 +548,6 @@ public abstract class BaseTest { .build()) .build(); - public final static UserDto USER_1_PRIVILEGED_DTO = UserDto.builder() - .id(USER_1_ID) - .username(USER_1_USERNAME) - .password(USER_1_PASSWORD) - .attributes(USER_1_ATTRIBUTES_DTO) - .firstname(USER_1_FIRSTNAME) - .lastname(USER_1_LASTNAME) - .qualifiedName(USER_1_QUALIFIED_NAME) - .lastRetrieved(Instant.now()) - .build(); - public final static User USER_1 = User.builder() .id(USER_1_ID) .username(USER_1_USERNAME) @@ -736,17 +725,6 @@ public abstract class BaseTest { .tags(new String[]{}) .build(); - public final static UserDto USER_2_PRIVILEGED_DTO = UserDto.builder() - .id(USER_2_ID) - .username(USER_2_USERNAME) - .password(USER_2_PASSWORD) - .attributes(USER_2_ATTRIBUTES_DTO) - .firstname(USER_2_FIRSTNAME) - .lastname(USER_2_LASTNAME) - .qualifiedName(USER_2_QUALIFIED_NAME) - .lastRetrieved(Instant.now()) - .build(); - public final static Principal USER_2_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_2_DETAILS, USER_2_PASSWORD, USER_2_DETAILS.getAuthorities()); @@ -838,17 +816,6 @@ public abstract class BaseTest { .tags(new String[]{}) .build(); - public final static UserDto USER_3_PRIVILEGED_DTO = UserDto.builder() - .id(USER_3_ID) - .username(USER_3_USERNAME) - .password(USER_3_PASSWORD) - .attributes(USER_3_ATTRIBUTES_DTO) - .firstname(USER_3_FIRSTNAME) - .lastname(USER_3_LASTNAME) - .qualifiedName(USER_3_QUALIFIED_NAME) - .lastRetrieved(Instant.now()) - .build(); - public final static UUID USER_4_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0"); public final static UUID USER_4_LDAP_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0"); public final static String USER_4_USERNAME = "junit4"; @@ -920,17 +887,6 @@ public abstract class BaseTest { public final static Principal USER_4_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_4_DETAILS, USER_4_PASSWORD, USER_4_DETAILS.getAuthorities()); - public final static UserDto USER_4_PRIVILEGED_DTO = UserDto.builder() - .id(USER_4_ID) - .username(USER_4_USERNAME) - .password(USER_4_PASSWORD) - .attributes(USER_4_ATTRIBUTES_DTO) - .firstname(USER_4_FIRSTNAME) - .lastname(USER_4_LASTNAME) - .qualifiedName(USER_4_QUALIFIED_NAME) - .lastRetrieved(Instant.now()) - .build(); - public final static UUID USER_5_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); public final static UUID USER_5_LDAP_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); public final static String USER_5_USERNAME = "nobody"; @@ -968,17 +924,6 @@ public abstract class BaseTest { .attributes(USER_5_ATTRIBUTES_DTO) .build(); - public final static UserDto USER_5_PRIVILEGED_DTO = UserDto.builder() - .id(USER_5_ID) - .username(USER_5_USERNAME) - .firstname(USER_5_FIRSTNAME) - .lastname(USER_5_LASTNAME) - .qualifiedName(USER_5_QUALIFIED_NAME) - .password(USER_5_PASSWORD) - .attributes(USER_5_ATTRIBUTES_DTO) - .lastRetrieved(Instant.now()) - .build(); - public final static UserBriefDto USER_5_BRIEF_DTO = UserBriefDto.builder() .id(USER_5_ID) .username(USER_5_USERNAME) @@ -1132,8 +1077,6 @@ public abstract class BaseTest { .build())); public final static Long CONTAINER_1_ID = 1L; - public final static ContainerImage CONTAINER_1_IMAGE = IMAGE_1; - public final static ImageDto CONTAINER_1_IMAGE_DTO = IMAGE_1_DTO; public final static String CONTAINER_1_NAME = "u01"; public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-u01"; public final static String CONTAINER_1_UI_HOST = "localhost"; @@ -1152,7 +1095,7 @@ public abstract class BaseTest { .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) - .image(CONTAINER_1_IMAGE) + .image(IMAGE_1) .created(CONTAINER_1_CREATED) .host(CONTAINER_1_HOST) .port(CONTAINER_1_PORT) @@ -1168,7 +1111,7 @@ public abstract class BaseTest { .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) - .image(CONTAINER_1_IMAGE_DTO) + .image(IMAGE_1_DTO) .host(CONTAINER_1_HOST) .port(CONTAINER_1_PORT) .build(); @@ -1186,12 +1129,12 @@ public abstract class BaseTest { .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) - .image(CONTAINER_1_IMAGE_DTO) + .image(IMAGE_1_DTO) .host(CONTAINER_1_HOST) .port(CONTAINER_1_PORT) + .lastRetrieved(Instant.now()) .username(CONTAINER_1_PRIVILEGED_USERNAME) .password(CONTAINER_1_PRIVILEGED_PASSWORD) - .lastRetrieved(Instant.now()) .build(); public final static Long CONTAINER_2_ID = 2L; @@ -1245,9 +1188,9 @@ public abstract class BaseTest { .image(CONTAINER_2_IMAGE_DTO) .host(CONTAINER_2_HOST) .port(CONTAINER_2_PORT) + .lastRetrieved(Instant.now()) .username(CONTAINER_2_PRIVILEGED_USERNAME) .password(CONTAINER_2_PRIVILEGED_PASSWORD) - .lastRetrieved(Instant.now()) .build(); public final static Long CONTAINER_3_ID = 3L; @@ -1390,6 +1333,21 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) /* IDENTIFIER_6_DTO */ .build(); + public final static DatabaseDto DATABASE_3_PRIVILEGED_DTO = DatabaseDto.builder() + .id(DATABASE_3_ID) + .isPublic(DATABASE_3_PUBLIC) + .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC) + .name(DATABASE_3_NAME) + .internalName(DATABASE_3_INTERNALNAME) + .owner(USER_3_BRIEF_DTO) + .container(CONTAINER_1_PRIVILEGED_DTO) + .exchangeName(DATABASE_3_EXCHANGE) + .tables(new LinkedList<>()) /* TABLE_8_DTO */ + .views(new LinkedList<>()) /* VIEW_5_DTO */ + .identifiers(new LinkedList<>()) /* IDENTIFIER_6_DTO */ + .lastRetrieved(Instant.now()) + .build(); + public final static DatabaseBriefDto DATABASE_3_BRIEF_DTO = DatabaseBriefDto.builder() .id(DATABASE_3_ID) .isPublic(DATABASE_3_PUBLIC) @@ -1434,6 +1392,7 @@ public abstract class BaseTest { .isPublic(DATABASE_4_PUBLIC) .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) .name(DATABASE_4_NAME) + .container(CONTAINER_2_DTO) .description(DATABASE_4_DESCRIPTION) .internalName(DATABASE_4_INTERNALNAME) .exchangeName(DATABASE_4_EXCHANGE) @@ -1443,6 +1402,22 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) /* IDENTIFIER_7_DTO */ .build(); + public final static DatabaseDto DATABASE_4_PRIVILEGED_DTO = DatabaseDto.builder() + .id(DATABASE_4_ID) + .isPublic(DATABASE_4_PUBLIC) + .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) + .name(DATABASE_4_NAME) + .container(CONTAINER_2_PRIVILEGED_DTO) + .description(DATABASE_4_DESCRIPTION) + .internalName(DATABASE_4_INTERNALNAME) + .exchangeName(DATABASE_4_EXCHANGE) + .owner(USER_4_BRIEF_DTO) + .tables(new LinkedList<>()) /* TABLE_9_DTO */ + .views(new LinkedList<>()) + .identifiers(new LinkedList<>()) /* IDENTIFIER_7_DTO */ + .lastRetrieved(Instant.now()) + .build(); + public final static TableCreateDto TABLE_0_CREATE_DTO = TableCreateDto.builder() .name("full") .description("full example") @@ -1650,6 +1625,7 @@ public abstract class BaseTest { .dataLength(TABLE_1_DATA_LENGTH) .maxDataLength(TABLE_1_MAX_DATA_LENGTH) .lastRetrieved(Instant.now()) + .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); public final static Table TABLE_1 = Table.builder() @@ -1863,6 +1839,7 @@ public abstract class BaseTest { .dataLength(TABLE_2_DATA_LENGTH) .maxDataLength(TABLE_2_MAX_DATA_LENGTH) .lastRetrieved(Instant.now()) + .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); public final static TableDto TABLE_2_DTO = TableDto.builder() @@ -5169,6 +5146,7 @@ public abstract class BaseTest { .queryHash(VIEW_1_QUERY_HASH) .columns(VIEW_1_COLUMNS_DTO) .lastRetrieved(Instant.now()) + .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); public final static ViewBriefDto VIEW_1_BRIEF_DTO = ViewBriefDto.builder() @@ -5331,6 +5309,7 @@ public abstract class BaseTest { .queryHash(VIEW_2_QUERY_HASH) .columns(VIEW_2_COLUMNS_DTO) .lastRetrieved(Instant.now()) + .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); public final static ViewBriefDto VIEW_2_BRIEF_DTO = ViewBriefDto.builder() @@ -5431,6 +5410,7 @@ public abstract class BaseTest { .queryHash(VIEW_3_QUERY_HASH) .columns(VIEW_3_COLUMNS_DTO) .lastRetrieved(Instant.now()) + .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .build(); public final static List<ViewColumn> VIEW_3_COLUMNS = List.of( @@ -7564,6 +7544,20 @@ public abstract class BaseTest { .views(new LinkedList<>(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO))) .build(); + public final static DatabaseDto DATABASE_1_PRIVILEGED_DTO = DatabaseDto.builder() + .id(DATABASE_1_ID) + .isPublic(DATABASE_1_PUBLIC) + .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC) + .name(DATABASE_1_NAME) + .container(CONTAINER_1_PRIVILEGED_DTO) + .internalName(DATABASE_1_INTERNALNAME) + .exchangeName(DATABASE_1_EXCHANGE) + .identifiers(new LinkedList<>(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO))) + .tables(new LinkedList<>(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO))) + .views(new LinkedList<>(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO))) + .lastRetrieved(Instant.now()) + .build(); + public final static DatabaseBriefDto DATABASE_1_BRIEF_DTO = DatabaseBriefDto.builder() .id(DATABASE_1_ID) .isPublic(DATABASE_1_PUBLIC) @@ -7705,6 +7699,21 @@ public abstract class BaseTest { .build(); public final static DatabaseDto DATABASE_2_DTO = DatabaseDto.builder() + .id(DATABASE_2_ID) + .isPublic(DATABASE_2_PUBLIC) + .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC) + .name(DATABASE_2_NAME) + .container(CONTAINER_1_DTO) + .internalName(DATABASE_2_INTERNALNAME) + .exchangeName(DATABASE_2_EXCHANGE) + .identifiers(new LinkedList<>(List.of(IDENTIFIER_5_DTO))) + .tables(new LinkedList<>(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO))) + .views(new LinkedList<>(List.of(VIEW_4_DTO))) + .owner(USER_2_BRIEF_DTO) + .lastRetrieved(Instant.now()) + .build(); + + public final static DatabaseDto DATABASE_2_PRIVILEGED_DTO = DatabaseDto.builder() .id(DATABASE_2_ID) .isPublic(DATABASE_2_PUBLIC) .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC) diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py index 1f9f778a84460f018f8463153f14fb13533bb8a7..78861ffd048edaf9d451a02cab8cbf591acd3a21 100644 --- a/lib/python/dbrepo/RestClient.py +++ b/lib/python/dbrepo/RestClient.py @@ -252,7 +252,7 @@ class RestClient: f'201 (CREATED): {response.text}') def update_user(self, user_id: str, theme: str, language: str, firstname: str = None, lastname: str = None, - affiliation: str = None, orcid: str = None) -> User: + affiliation: str = None, orcid: str = None) -> UserBrief: """ Updates a user with given user id. @@ -277,7 +277,7 @@ class RestClient: lastname=lastname, affiliation=affiliation, orcid=orcid)) if response.status_code == 202: body = response.json() - return User.model_validate(body) + return UserBrief.model_validate(body) if response.status_code == 400: raise MalformedError(f'Failed to update user: {response.text}') if response.status_code == 403: @@ -287,15 +287,13 @@ class RestClient: raise ResponseCodeError(f'Failed to update user: response code: {response.status_code} is not ' f'202 (ACCEPTED): {response.text}') - def update_user_password(self, user_id: str, password: str) -> User: + def update_user_password(self, user_id: str, password: str) -> None: """ Updates the password of a user with given user id. :param user_id: The user id of the user that should be updated. :param password: The updated user password. - :returns: The user, if successful. - :raises MalformedError: If the payload was rejected by the service. :raises ForbiddenError: If something went wrong with the authorization. :raises NotExistsError: If the user does not exist. @@ -306,8 +304,7 @@ class RestClient: url = f'/api/user/{user_id}/password' response = self._wrapper(method="put", url=url, force_auth=True, payload=UpdateUserPassword(password=password)) if response.status_code == 202: - body = response.json() - return User.model_validate(body) + return None if response.status_code == 400: raise MalformedError(f'Failed to update user password: {response.text}') if response.status_code == 403: @@ -617,7 +614,7 @@ class RestClient: def create_table(self, database_id: int, name: str, is_public: bool, is_schema_public: bool, columns: List[CreateTableColumn], constraints: CreateTableConstraints, - description: str = None) -> Table: + description: str = None) -> TableBrief: """ Updates the database owner of a database with given database id. @@ -645,7 +642,7 @@ class RestClient: description=description, columns=columns, constraints=constraints)) if response.status_code == 201: body = response.json() - return Table.model_validate(body) + return TableBrief.model_validate(body) if response.status_code == 400: raise MalformedError(f'Failed to create table: {response.text}') if response.status_code == 403: @@ -871,7 +868,7 @@ class RestClient: raise ResponseCodeError(f'Failed to find view: response code: {response.status_code} is not ' f'200 (OK): {response.text}') - def update_view(self, database_id: int, view_id: int, is_public: bool) -> View: + def update_view(self, database_id: int, view_id: int, is_public: bool) -> ViewBrief: """ Get a view of a database with given database id and view id. @@ -889,7 +886,7 @@ class RestClient: response = self._wrapper(method="put", url=url, payload=UpdateView(is_public=is_public)) if response.status_code == 202: body = response.json() - return View.model_validate(body) + return ViewBrief.model_validate(body) if response.status_code == 403: raise ForbiddenError(f'Failed to update view: not allowed') if response.status_code == 404: