From 7f37cf74867d8c71a3608f4f92a2cc8cb625cd16 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Mon, 17 Apr 2023 22:28:52 +0200 Subject: [PATCH] Modified the JPA model - Use proper UUID class for keycloak stuff - Use UUID if present for the tests - Add a simple model for JPA tests to easy insert them and the linked, complex model for unit tests --- .../java/at/tuwien/mapper/UserMapper.java | 10 + .../repository/jpa/RealmRepository.java | 3 +- .../tuwien/repository/jpa/UserRepository.java | 3 +- .../endpoint/AccessEndpointUnitTest.java | 3 +- .../service/AccessServiceIntegrationTest.java | 275 ++++++++---------- ...DatabaseServiceIntegrationElasticTest.java | 2 +- .../DatabaseServiceIntegrationTest.java | 99 ++++--- .../java/at/tuwien/mapper/UserMapper.java | 7 + .../jpa/DatabaseAccessRepository.java | 3 +- .../repository/jpa/RealmRepository.java | 4 +- .../tuwien/repository/jpa/UserRepository.java | 3 +- .../java/at/tuwien/service/AccessService.java | 2 +- .../java/at/tuwien/service/UserService.java | 4 +- .../service/impl/AccessServiceImpl.java | 6 +- .../tuwien/service/impl/UserServiceImpl.java | 4 +- .../java/at/tuwien/mapper/UserMapper.java | 9 +- .../repository/jpa/RealmRepository.java | 15 + .../tuwien/repository/jpa/UserRepository.java | 3 +- .../at/tuwien/api/auth/TokenBriefDto.java | 0 .../java/at/tuwien/api/auth/TokenDto.java | 0 .../api/database/DatabaseAccessDto.java | 3 +- .../at/tuwien/api/user/UserAttributeDto.java | 5 +- .../java/at/tuwien/api/user/UserBriefDto.java | 3 +- .../main/java/at/tuwien/api/user/UserDto.java | 3 +- .../entities/database/DatabaseAccess.java | 5 +- .../entities/database/DatabaseAccessKey.java | 3 +- .../tuwien/entities/database/table/Table.java | 3 +- .../at/tuwien/entities/user/Credential.java | 9 +- .../java/at/tuwien/entities/user/Realm.java | 5 +- .../java/at/tuwien/entities/user/Role.java | 5 +- .../at/tuwien/entities/user/RoleMapping.java | 10 +- .../tuwien/entities/user/RoleMappingKey.java | 5 +- .../java/at/tuwien/entities/user/User.java | 14 +- .../tuwien/entities/user/UserAttribute.java | 10 +- .../main/java/at/tuwien/test/BaseTest.java | 216 +++++++++----- .../endpoint/StoreEndpointUnitTest.java | 22 +- .../RabbitMqListenerIntegrationTest.java | 22 +- .../TableServiceIntegrationReadTest.java | 30 +- .../java/at/tuwien/mapper/UserMapper.java | 9 +- .../java/at/tuwien/mapper/ViewMapper.java | 15 +- .../repository/jpa/RealmRepository.java | 14 + .../tuwien/repository/jpa/UserRepository.java | 3 +- .../java/at/tuwien/service/UserService.java | 20 +- .../tuwien/service/impl/UserServiceImpl.java | 45 --- .../endpoint/TableEndpointUnitTest.java | 56 ++-- .../MessageQueueServiceIntegrationTest.java | 8 +- .../TableServiceIntegrationReadTest.java | 30 +- .../TableServiceIntegrationWriteTest.java | 41 ++- .../src/test/resources/application.properties | 3 + .../java/at/tuwien/mapper/UserMapper.java | 10 +- .../repository/jpa/RealmRepository.java | 12 + .../tuwien/repository/jpa/UserRepository.java | 3 +- dbrepo-user-service/pom.xml | 10 +- dbrepo-user-service/report/pom.xml | 8 +- dbrepo-user-service/rest-service/pom.xml | 8 +- .../java/at/tuwien/endpoint/UserEndpoint.java | 12 +- dbrepo-user-service/services/pom.xml | 8 +- .../tuwien/mapper/AuthenticationMapper.java | 2 +- .../java/at/tuwien/mapper/UserMapper.java | 12 +- .../repository/jpa/CredentialRepository.java | 4 +- .../repository/jpa/RealmRepository.java | 5 +- .../repository/jpa/RoleMappingRepository.java | 4 +- .../tuwien/repository/jpa/RoleRepository.java | 3 +- .../jpa/UserAttributeRepository.java | 7 +- .../tuwien/repository/jpa/UserRepository.java | 3 +- .../java/at/tuwien/service/RealmService.java | 2 +- .../tuwien/service/UserAttributeService.java | 7 +- .../java/at/tuwien/service/UserService.java | 23 +- .../tuwien/service/impl/RealmServiceImpl.java | 2 +- .../impl/UserAttributeServiceImpl.java | 10 +- .../tuwien/service/impl/UserServiceImpl.java | 37 +-- 71 files changed, 643 insertions(+), 621 deletions(-) create mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java delete mode 100644 dbrepo-metadata-db/api/src/main/java/at/tuwien/api/auth/TokenBriefDto.java delete mode 100644 dbrepo-metadata-db/api/src/main/java/at/tuwien/api/auth/TokenDto.java create mode 100644 dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java create mode 100644 dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java diff --git a/dbrepo-container-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-container-service/services/src/main/java/at/tuwien/mapper/UserMapper.java index 5e47ebae63..cb6d20fd10 100644 --- a/dbrepo-container-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ b/dbrepo-container-service/services/src/main/java/at/tuwien/mapper/UserMapper.java @@ -22,6 +22,12 @@ public interface UserMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserMapper.class); + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) + UserDetailsDto userDtoToUserDetailsDto(UserDto data); + /* keep */ @Mappings({ @Mapping(target = "orcid", expression = "java(userToOrcid(data))") @@ -43,6 +49,10 @@ public interface UserMapper { return orcid.map(UserAttribute::getValue).orElse(null); } + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) UserDetailsDto userBriefDtoToUserDetailsDto(UserBriefDto data); default UserDetailsDto tokenIntrospectDtoToUserDetailsDto(TokenIntrospectDto data) { diff --git a/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java b/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java index 0505e07c3a..c1a5d756b7 100644 --- a/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java +++ b/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java @@ -6,8 +6,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface RealmRepository extends JpaRepository<Realm, String> { +public interface RealmRepository extends JpaRepository<Realm, UUID> { } diff --git a/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java b/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java index e77de8f6a8..9eb0b51902 100644 --- a/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java +++ b/dbrepo-container-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository<User, String> { +public interface UserRepository extends JpaRepository<User, UUID> { Optional<User> findByUsername(String username); diff --git a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java index e8e9192e1c..e08b535f2d 100644 --- a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java +++ b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java @@ -30,6 +30,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; import java.util.Optional; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; @@ -209,7 +210,7 @@ public class AccessEndpointUnitTest extends BaseUnitTest { } protected void generic_find(Long containerId, Long databaseId, Database database, DatabaseAccess access, - String username, String userId, Principal principal) throws AccessDeniedException, + String username, UUID userId, Principal principal) throws AccessDeniedException, NotAllowedException { /* mock */ diff --git a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java index b8f79bee73..549b9489a0 100644 --- a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java +++ b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java @@ -9,13 +9,18 @@ import at.tuwien.config.H2Utils; import at.tuwien.config.IndexConfig; import at.tuwien.config.ReadyConfig; import at.tuwien.entities.database.AccessType; +import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; +import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.repository.jpa.*; import com.rabbitmq.client.Channel; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -24,6 +29,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.io.File; import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -43,9 +50,6 @@ public class AccessServiceIntegrationTest extends BaseUnitTest { @MockBean private Channel channel; - @Autowired - private DatabaseAccessRepository databaseAccessRepository; - @Autowired private ImageRepository imageRepository; @@ -55,12 +59,18 @@ public class AccessServiceIntegrationTest extends BaseUnitTest { @Autowired private DatabaseRepository databaseRepository; + @Autowired + private DatabaseAccessRepository databaseAccessRepository; + @Autowired private AccessService accessService; @Autowired private UserRepository userRepository; + @Autowired + private RealmRepository realmRepository; + @Autowired private H2Utils h2Utils; @@ -84,11 +94,13 @@ public class AccessServiceIntegrationTest extends BaseUnitTest { DockerConfig.createAllNetworks(); /* metadata database */ h2Utils.runScript("schema.sql"); + realmRepository.save(REALM_DBREPO); imageRepository.save(IMAGE_1); userRepository.save(USER_1_SIMPLE); userRepository.save(USER_2_SIMPLE); + userRepository.save(USER_3_SIMPLE); containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); + databaseRepository.save(DATABASE_1); } @AfterEach @@ -97,205 +109,156 @@ public class AccessServiceIntegrationTest extends BaseUnitTest { DockerConfig.removeAllNetworks(); } - @Test - public void create_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException, - DatabaseNotFoundException, DatabaseMalformedException, InterruptedException { - - /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - - /* test */ - create_generic(AccessTypeDto.READ, AccessType.READ, USER_2_USERNAME, USER_2_ID); + public static Stream<Arguments> create_succeeds_parameters() { + return Stream.of( + Arguments.arguments("general", AccessTypeDto.READ, AccessType.READ, USER_3_USERNAME, USER_3_ID) + ); } - @Test - public void create_multiple_fails() throws InterruptedException { - - /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - databaseAccessRepository.save(DATABASE_1_DEVELOPER_READ_ACCESS); + public static Stream<Arguments> create_fails_parameters() { + return Stream.of( + Arguments.arguments("general", NotAllowedException.class, AccessTypeDto.READ, USER_2_USERNAME) + ); + } - /* test */ - assertThrows(NotAllowedException.class, () -> { - create_generic(AccessTypeDto.READ, AccessType.READ, USER_2_USERNAME, USER_2_ID); - }); + public static Stream<Arguments> update_succeeds_parameters() { + return Stream.of( + Arguments.arguments("same access", CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.READ, AccessType.READ, + USER_2_USERNAME, USER_2_ID), + Arguments.arguments("write own access", CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.WRITE_OWN, + AccessType.WRITE_OWN, USER_2_USERNAME, USER_2_ID), + Arguments.arguments("write all access", CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.WRITE_ALL, + AccessType.WRITE_ALL, USER_2_USERNAME, USER_2_ID) + ); } - @Test - public void update_same_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException, - DatabaseNotFoundException, DatabaseMalformedException, InterruptedException { + public static Stream<Arguments> update_fails_parameters() { + return Stream.of( + Arguments.arguments("user not found", UserNotFoundException.class, CONTAINER_1_ID, DATABASE_1_ID, + AccessTypeDto.READ, "l33tsp34k"), + Arguments.arguments("database not found", DatabaseNotFoundException.class, CONTAINER_2_ID, DATABASE_2_ID, + AccessTypeDto.READ, USER_2_USERNAME) + ); + } - /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - databaseAccessRepository.save(DATABASE_1_DEVELOPER_READ_ACCESS); + public static Stream<Arguments> delete_fails_parameters() { + return Stream.of( + Arguments.arguments("user not found", UserNotFoundException.class, "l33tsp34k"), + Arguments.arguments("is owner", NotAllowedException.class, USER_1_USERNAME) + ); + } - /* test */ - update_generic(CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.READ, AccessType.READ, USER_2_USERNAME, USER_2_ID); + public static Stream<Arguments> delete_succeeds_parameters() { + return Stream.of( + Arguments.arguments("general", USER_2_USERNAME) + ); } - @Test - public void update_writeOwn_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException, - DatabaseNotFoundException, DatabaseMalformedException, InterruptedException { + /* ################################################################################################### */ + /* ## GENERIC TEST CASES ## */ + /* ################################################################################################### */ + + @ParameterizedTest + @MethodSource("create_fails_parameters") + protected <T extends Throwable> void create_fails(String test, Class<T> expectedException, + AccessTypeDto accessTypeDto, String username) { + final DatabaseGiveAccessDto request = DatabaseGiveAccessDto.builder() + .type(accessTypeDto) + .username(username) + .build(); /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); + databaseAccessRepository.save(DATABASE_1_DEVELOPER_READ_ACCESS); /* test */ - update_generic(CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.WRITE_OWN, AccessType.WRITE_OWN, USER_2_USERNAME, USER_2_ID); + assertThrows(expectedException, () -> { + accessService.create(CONTAINER_1_ID, DATABASE_1_ID, request); + }); } - @Test - public void update_writeAll_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException, - DatabaseNotFoundException, DatabaseMalformedException, InterruptedException { + @ParameterizedTest + @MethodSource("create_succeeds_parameters") + protected <T extends Throwable> void create_succeeds(String test, AccessTypeDto accessTypeDto, AccessType access, + String username, UUID userId) + throws UserNotFoundException, NotAllowedException, QueryMalformedException, DatabaseNotFoundException, + DatabaseMalformedException, InterruptedException { + final DatabaseGiveAccessDto request = DatabaseGiveAccessDto.builder() + .type(accessTypeDto) + .username(username) + .build(); /* mock */ DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); /* test */ - update_generic(CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.WRITE_ALL, AccessType.WRITE_ALL, USER_2_USERNAME, USER_2_ID); + accessService.create(CONTAINER_1_ID, DATABASE_1_ID, request); + final List<DatabaseAccess> response = databaseAccessRepository.findAll(); + assertEquals(1, response.size()); + assertEquals(access, response.get(0).getType()); + assertEquals(DATABASE_1_ID, response.get(0).getHdbid()); + assertEquals(userId, response.get(0).getHuserid()); } - @Test - public void update_userNotFound_fails() throws InterruptedException { + @ParameterizedTest + @MethodSource("update_succeeds_parameters") + protected void update_succeeds(String test, Long containerId, Long databaseId, AccessTypeDto accessTypeDto, AccessType access, + String username) throws UserNotFoundException, NotAllowedException, + QueryMalformedException, DatabaseNotFoundException, DatabaseMalformedException, AccessDeniedException, InterruptedException { + final DatabaseModifyAccessDto request = DatabaseModifyAccessDto.builder() + .type(accessTypeDto) + .build(); /* mock */ + databaseAccessRepository.save(DATABASE_1_DEVELOPER_READ_ACCESS); DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); /* test */ - assertThrows(UserNotFoundException.class, () -> { - update_generic(CONTAINER_1_ID, DATABASE_1_ID, AccessTypeDto.READ, AccessType.READ, "l33tsp34k", null); - }); + accessService.update(containerId, databaseId, username, request); + final List<DatabaseAccess> response = databaseAccessRepository.findAll(); + assertEquals(1, response.size()); + assertEquals(access, response.get(0).getType()); + assertEquals(databaseId, response.get(0).getHdbid()); } - @Test - public void update_databaseNotFound_fails() throws InterruptedException { - - /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_2, CONTAINER_2_ENV); - DockerConfig.startContainer(CONTAINER_2); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - containerRepository.save(CONTAINER_2); - databaseRepository.save(DATABASE_1_SIMPLE); + @ParameterizedTest + @MethodSource("update_fails_parameters") + protected <T extends Throwable> void update_fails(String name, Class<T> expectedException, Long containerId, + Long databaseId, AccessTypeDto accessTypeDto, + String username) { + final DatabaseModifyAccessDto request = DatabaseModifyAccessDto.builder() + .type(accessTypeDto) + .build(); /* test */ - assertThrows(DatabaseNotFoundException.class, () -> { - update_generic(CONTAINER_2_ID, DATABASE_2_ID, AccessTypeDto.READ, AccessType.READ, USER_2_USERNAME, USER_2_ID); + assertThrows(expectedException, () -> { + accessService.update(containerId, databaseId, username, request); }); } - @Test - public void delete_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException, - DatabaseNotFoundException, DatabaseMalformedException, InterruptedException { - - /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); + @ParameterizedTest + @MethodSource("delete_fails_parameters") + protected <T extends Throwable> void delete_fails(String name, Class<T> expectedException, String username) { /* test */ - accessService.delete(CONTAINER_1_ID, DATABASE_1_ID, USER_2_USERNAME); - } - - @Test - public void delete_isOwner_fails() throws InterruptedException { - - /* mock */ - DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - userRepository.save(USER_1_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - - /* test */ - assertThrows(NotAllowedException.class, () -> { - accessService.delete(CONTAINER_1_ID, DATABASE_1_ID, USER_1_USERNAME); + assertThrows(expectedException, () -> { + accessService.delete(CONTAINER_1_ID, DATABASE_1_ID, username); }); } - @Test - public void delete_notExists_fails() throws InterruptedException { + @ParameterizedTest + @MethodSource("delete_succeeds_parameters") + protected <T extends Throwable> void delete_succeeds(String name, String username) throws InterruptedException, + UserNotFoundException, NotAllowedException, QueryMalformedException, DatabaseNotFoundException, + DatabaseMalformedException { /* mock */ DockerConfig.createContainer(BIND_WEATHER, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); DockerConfig.startContainer(CONTAINER_1_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - accessService.delete(CONTAINER_1_ID, DATABASE_1_ID, "l33tsp34k"); - }); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected void create_generic(AccessTypeDto accessTypeDto, AccessType access, String username, String userId) - throws UserNotFoundException, NotAllowedException, QueryMalformedException, DatabaseNotFoundException, - DatabaseMalformedException { - final DatabaseGiveAccessDto request = DatabaseGiveAccessDto.builder() - .type(accessTypeDto) - .username(username) - .build(); /* test */ - accessService.create(CONTAINER_1_ID, DATABASE_1_ID, request); - final List<DatabaseAccess> response = databaseAccessRepository.findAll(); - assertEquals(1, response.size()); - assertEquals(access, response.get(0).getType()); - assertEquals(DATABASE_1_ID, response.get(0).getHdbid()); - assertEquals(userId, response.get(0).getHuserid()); - } - - protected void update_generic(Long containerId, Long databaseId, AccessTypeDto accessTypeDto, AccessType access, - String username, String userId) throws UserNotFoundException, NotAllowedException, - QueryMalformedException, DatabaseNotFoundException, DatabaseMalformedException { - final DatabaseModifyAccessDto request = DatabaseModifyAccessDto.builder() - .type(accessTypeDto) - .build(); - - /* test */ - accessService.update(containerId, databaseId, username, request); - final List<DatabaseAccess> response = databaseAccessRepository.findAll(); - assertEquals(1, response.size()); - assertEquals(access, response.get(0).getType()); - assertEquals(databaseId, response.get(0).getHdbid()); - assertEquals(userId, response.get(0).getHuserid()); + accessService.delete(CONTAINER_1_ID, DATABASE_1_ID, username); } } diff --git a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java index 7d680ea0af..370972f192 100644 --- a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java +++ b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java @@ -82,7 +82,7 @@ public class DatabaseServiceIntegrationElasticTest extends BaseUnitTest { afterEach(); /* metadata database */ h2Utils.runScript("schema.sql"); - imageRepository.save(IMAGE_1_SIMPLE); + imageRepository.save(IMAGE_1); userRepository.save(USER_1_SIMPLE); } diff --git a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index 0da52ebd92..85c0e90563 100644 --- a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -8,6 +8,7 @@ import at.tuwien.config.IndexConfig; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.ReadyConfig; import at.tuwien.entities.database.Database; +import at.tuwien.entities.user.User; import at.tuwien.exception.QueryMalformedException; import at.tuwien.repository.elastic.DatabaseIdxRepository; import at.tuwien.repository.jpa.*; @@ -26,6 +27,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.io.File; import java.security.Principal; import java.sql.SQLException; +import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; @@ -47,18 +49,27 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { @MockBean private IndexConfig indexConfig; - @MockBean - private ContainerRepository containerRepository; - @MockBean private DatabaseIdxRepository databaseIdxRepository; - @MockBean - private MariaDbServiceImpl databaseService; + @Autowired + private ContainerRepository containerRepository; - @MockBean + @Autowired private DatabaseRepository databaseRepository; + @Autowired + private ImageRepository imageRepository; + + @Autowired + private RealmRepository realmRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private MariaDbServiceImpl databaseService; + @Autowired private MariaDbConfig mariaDbConfig; @@ -82,6 +93,12 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { public void beforeEach() { afterEach(); DockerConfig.createAllNetworks(); + /* metadata database */ + imageRepository.save(IMAGE_1); + realmRepository.save(REALM_DBREPO); + userRepository.save(USER_1_SIMPLE); + userRepository.save(USER_2_SIMPLE); + userRepository.save(USER_3_SIMPLE); } @AfterEach @@ -98,11 +115,10 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { DockerConfig.startContainer(CONTAINER_3_SIMPLE); MariaDbConfig.dropDatabase(CONTAINER_3_INTERNALNAME, DATABASE_3_INTERNALNAME, "root", "mariadb"); when(databaseIdxRepository.save(any(DatabaseDto.class))) - .thenReturn(DATABASE_1_DTO); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_1); + .thenReturn(DATABASE_3_DTO); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_create(CONTAINER_3_ID, DATABASE_3_CREATE, DATABASE_3); @@ -121,11 +137,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_2_DTO) .thenReturn(DATABASE_3_DTO); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3_SIMPLE)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_2) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE); + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_create(CONTAINER_2_ID, DATABASE_2_CREATE, DATABASE_2); @@ -145,11 +159,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_3_DTO) .thenReturn(DATABASE_2_DTO); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_2) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE); + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_create(CONTAINER_3_ID, DATABASE_3_CREATE, DATABASE_3); @@ -162,10 +174,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ DockerConfig.createContainer(BIND_MUSICOLOGY, CONTAINER_3_SIMPLE, CONTAINER_3_ENV); DockerConfig.startContainer(CONTAINER_3_SIMPLE); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_insert(QUERY_4_STATEMENT, 1L); @@ -178,10 +189,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ DockerConfig.createContainer(BIND_MUSICOLOGY, CONTAINER_3_SIMPLE, CONTAINER_3_ENV); DockerConfig.startContainer(CONTAINER_3_SIMPLE); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_insert(QUERY_4_STATEMENT, 1L); @@ -195,10 +205,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ DockerConfig.createContainer(BIND_MUSICOLOGY, CONTAINER_3_SIMPLE, CONTAINER_3_ENV); DockerConfig.startContainer(CONTAINER_3_SIMPLE); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_system_insert("root", "mariadb"); @@ -210,10 +219,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ DockerConfig.createContainer(BIND_MUSICOLOGY, CONTAINER_3_SIMPLE, CONTAINER_3_ENV); DockerConfig.startContainer(CONTAINER_3_SIMPLE); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ assertThrows(SQLException.class, () -> { @@ -227,10 +235,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ DockerConfig.createContainer(BIND_MUSICOLOGY, CONTAINER_3_SIMPLE, CONTAINER_3_ENV); DockerConfig.startContainer(CONTAINER_3_SIMPLE); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_user_insert("root", "mariadb"); @@ -242,10 +249,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ DockerConfig.createContainer(BIND_MUSICOLOGY, CONTAINER_3_SIMPLE, CONTAINER_3_ENV); DockerConfig.startContainer(CONTAINER_3_SIMPLE); - when(containerRepository.findById(CONTAINER_3_ID)) - .thenReturn(Optional.of(CONTAINER_3)); - when(databaseRepository.save(any(Database.class))) - .thenReturn(DATABASE_3); + containerRepository.save(CONTAINER_1_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_2_SIMPLE) /* increase id */; + containerRepository.save(CONTAINER_3_SIMPLE); /* test */ generic_user_insert("junit1", "junit1"); @@ -268,10 +274,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { protected void generic_create(Long containerId, DatabaseCreateDto createDto, Database database) throws Exception { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* test */ - final Database response = databaseService.create(containerId, createDto, principal); + final Database response = databaseService.create(containerId, createDto, USER_1_PRINCIPAL); assertEquals(database.getName(), response.getName()); assertEquals(containerId, database.getId()); } diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-database-service/services/src/main/java/at/tuwien/mapper/UserMapper.java index c8c386119e..cb3679d1c3 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/mapper/UserMapper.java @@ -6,10 +6,13 @@ import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDetailsDto; import at.tuwien.api.user.UserDto; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import java.util.Arrays; +import java.util.UUID; import java.util.stream.Collectors; @Mapper(componentModel = "spring") @@ -17,6 +20,10 @@ public interface UserMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserMapper.class); + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) UserDetailsDto userDtoToUserDetailsDto(UserDto data); UserBriefDto userDtoToUserBriefDto(UserDto data); diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/DatabaseAccessRepository.java b/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/DatabaseAccessRepository.java index 62123403ef..3cf7c7ad00 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/DatabaseAccessRepository.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/DatabaseAccessRepository.java @@ -8,11 +8,12 @@ import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; +import java.util.UUID; @Repository public interface DatabaseAccessRepository extends JpaRepository<DatabaseAccess, Long> { - void deleteByHdbidAndHuserid(Long databaseId, String userId); + void deleteByHdbidAndHuserid(Long databaseId, UUID userId); Optional<DatabaseAccess> findByHdbidAndHuserid(Long databaseId, String userId); diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java b/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java index 74d99176b0..99f75a4104 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java @@ -4,6 +4,8 @@ import at.tuwien.entities.user.Realm; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + @Repository -public interface RealmRepository extends JpaRepository<Realm, String> { +public interface RealmRepository extends JpaRepository<Realm, UUID> { } diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java b/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java index 3772a12f59..9eb0b51902 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository<User, Long> { +public interface UserRepository extends JpaRepository<User, UUID> { Optional<User> findByUsername(String username); diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-database-service/services/src/main/java/at/tuwien/service/AccessService.java index c32cd3579f..97eed76ada 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/service/AccessService.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/service/AccessService.java @@ -50,7 +50,7 @@ public interface AccessService { * @throws DatabaseMalformedException The database has an invalid state. */ void update(Long containerId, Long databaseId, String username, DatabaseModifyAccessDto accessDto) - throws DatabaseNotFoundException, UserNotFoundException, NotAllowedException, QueryMalformedException, DatabaseMalformedException; + throws DatabaseNotFoundException, UserNotFoundException, NotAllowedException, QueryMalformedException, DatabaseMalformedException, AccessDeniedException; /** * Revokes access to a database of container. diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-database-service/services/src/main/java/at/tuwien/service/UserService.java index 2a05264654..cec9cf42e7 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/service/UserService.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/service/UserService.java @@ -3,9 +3,11 @@ package at.tuwien.service; import at.tuwien.entities.user.User; import at.tuwien.exception.UserNotFoundException; +import java.util.UUID; + public interface UserService { User findByUsername(String username) throws UserNotFoundException; - User find(Long id) throws UserNotFoundException; + User find(UUID id) throws UserNotFoundException; } diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java index 3aa6ab4ea3..a94df13990 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java @@ -102,7 +102,7 @@ public class AccessServiceImpl extends HibernateConnector implements AccessServi @Transactional public void update(Long containerId, Long databaseId, String username, DatabaseModifyAccessDto accessDto) throws DatabaseNotFoundException, UserNotFoundException, NotAllowedException, QueryMalformedException, - DatabaseMalformedException { + DatabaseMalformedException, AccessDeniedException { /* check */ final Database database = databaseService.findById(containerId, databaseId); final Container container = database.getContainer(); @@ -111,6 +111,7 @@ public class AccessServiceImpl extends HibernateConnector implements AccessServi log.error("Failed to modify access of user with username {}, because it is the owner", username); throw new NotAllowedException("Failed modify access"); } + find(databaseId, username); final User root = databaseMapper.containerToPrivilegedUser(container); final ComboPooledDataSource dataSource = getDataSource(container.getImage(), container, database, root); final DatabaseGiveAccessDto giveAccess = databaseMapper.databaseModifyAccessToDatabaseGiveAccessDto(username, accessDto); @@ -133,8 +134,7 @@ public class AccessServiceImpl extends HibernateConnector implements AccessServi dataSource.close(); } /* update access */ - final DatabaseAccess access = databaseMapper.databaseModifyAccessDtoToDatabaseAccess(database, user, accessDto); - final DatabaseAccess entity = databaseAccessRepository.save(access); + databaseAccessRepository.save(databaseMapper.databaseModifyAccessDtoToDatabaseAccess(database, user, accessDto)); log.info("Modified access to database with id {} for user with username {}", databaseId, username); } diff --git a/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java index d0c7fdb2d0..003f54c319 100644 --- a/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ b/dbrepo-database-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java @@ -8,7 +8,9 @@ import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; +import java.util.UUID; @Log4j2 @Service @@ -32,7 +34,7 @@ public class UserServiceImpl implements UserService { } @Override - public User find(Long id) throws UserNotFoundException { + public User find(UUID id) throws UserNotFoundException { final Optional<User> optional = userRepository.findById(id); if (optional.isEmpty()) { log.error("Failed to retrieve user with id {}", id); diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java index f14430e967..bac8f626c2 100644 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java @@ -1,16 +1,23 @@ package at.tuwien.mapper; import at.tuwien.api.user.GrantedAuthorityDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDetailsDto; import at.tuwien.api.user.UserDto; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; @Mapper(componentModel = "spring") public interface UserMapper { - UserDetailsDto userDtoToUserDetailsDto(UserDto data); + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) + UserDetailsDto userBriefDtoToUserDetailsDto(UserBriefDto data); default GrantedAuthority grantedAuthorityDtoToGrantedAuthority(GrantedAuthorityDto data) { return new SimpleGrantedAuthority(data.getAuthority()); diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java new file mode 100644 index 0000000000..122095a168 --- /dev/null +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java @@ -0,0 +1,15 @@ + +package at.tuwien.repository.jpa; + +import at.tuwien.entities.user.Realm; +import at.tuwien.entities.user.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface RealmRepository extends JpaRepository<Realm, UUID> { + +} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java index 8368703d88..01b143f6f8 100644 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java @@ -6,9 +6,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository<User, Long> { +public interface UserRepository extends JpaRepository<User, UUID> { Optional<User> findByUsername(String username); diff --git a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/auth/TokenBriefDto.java b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/auth/TokenBriefDto.java deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/auth/TokenDto.java b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/auth/TokenDto.java deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java index 5824512e7a..be111aa08c 100644 --- a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java +++ b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java @@ -9,6 +9,7 @@ import lombok.*; import javax.validation.constraints.NotNull; import java.time.Instant; +import java.util.UUID; @Getter @Setter @@ -21,7 +22,7 @@ public class DatabaseAccessDto { @NotNull @JsonIgnore @ToString.Exclude - private String huserid; + private UUID huserid; @NotNull @JsonIgnore diff --git a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserAttributeDto.java b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserAttributeDto.java index c5f7b7b0b3..fc95f67dc6 100644 --- a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserAttributeDto.java +++ b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserAttributeDto.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import javax.validation.constraints.NotNull; +import java.util.UUID; @Getter @Setter @@ -16,12 +17,12 @@ public class UserAttributeDto { @NotNull @JsonIgnore - private String id; + private UUID id; @NotNull @JsonIgnore @Schema(example = "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4") - private String userId; + private UUID userId; @Schema(example = "theme_dark") private String name; diff --git a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserBriefDto.java b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserBriefDto.java index d11d345a0d..62dfb946fe 100644 --- a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserBriefDto.java +++ b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserBriefDto.java @@ -9,6 +9,7 @@ import org.springframework.security.core.userdetails.UserDetails; import javax.validation.constraints.NotNull; import java.util.List; +import java.util.UUID; @Getter @Setter @@ -20,7 +21,7 @@ public class UserBriefDto { @NotNull @Schema(example = "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4") - private String id; + private UUID id; @NotNull @Schema(example = "jcarberry", description = "Only contains lowercase characters") diff --git a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserDto.java b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserDto.java index d3b081ade0..2c824f4aca 100644 --- a/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserDto.java +++ b/dbrepo-metadata-db/api/src/main/java/at/tuwien/api/user/UserDto.java @@ -7,6 +7,7 @@ import lombok.*; import javax.validation.constraints.NotNull; import java.util.List; +import java.util.UUID; @Getter @Setter @@ -19,7 +20,7 @@ public class UserDto { @NotNull @Schema(example = "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4") - private String id; + private UUID id; @NotNull @Schema(example = "jcarberry", description = "Only contains lowercase characters") diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java index bc5ba2b798..5f6e684785 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java @@ -7,6 +7,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; import java.time.Instant; +import java.util.UUID; @Data @Entity @@ -21,8 +22,8 @@ public class DatabaseAccess { @Id @EqualsAndHashCode.Include - @Column(name = "user_id", updatable = false) - private String huserid; + @Column(name = "user_id", updatable = false, columnDefinition = "VARCHAR(36)") + private UUID huserid; @Id @EqualsAndHashCode.Include diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccessKey.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccessKey.java index 6b4b8f2bc8..8380606852 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccessKey.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/DatabaseAccessKey.java @@ -3,11 +3,12 @@ package at.tuwien.entities.database; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.UUID; @EqualsAndHashCode public class DatabaseAccessKey implements Serializable { - private String huserid; + private UUID huserid; private Long hdbid; } diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 23bd4c566c..0840dca2e7 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -15,6 +15,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; import java.time.Instant; import java.util.List; +import java.util.UUID; @Data @Entity @@ -42,7 +43,7 @@ public class Table { @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumns({ - @JoinColumn(name = "createdBy", referencedColumnName = "ID") + @JoinColumn(name = "createdBy", referencedColumnName = "ID", columnDefinition = "VARCHAR(36)") }) private User creator; diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Credential.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Credential.java index f3da481c38..a422eed5e9 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Credential.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Credential.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; +import java.util.UUID; @Data @Entity @@ -19,16 +20,14 @@ public class Credential { @Id @EqualsAndHashCode.Include - @GeneratedValue(generator = "credential-uuid") - @GenericGenerator(name = "credential-uuid", strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") - private String id; + private UUID id; @Column(nullable = false) private String type; - @Column(name = "user_id", nullable = false) - private String userId; + @Column(name = "user_id", nullable = false, columnDefinition = "VARCHAR(36)") + private UUID userId; @Column(nullable = false) private Long createdDate; diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Realm.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Realm.java index c87b90bc69..96ba2ec661 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Realm.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Realm.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.List; +import java.util.UUID; @Data @Entity @@ -21,10 +22,8 @@ public class Realm { @Id @EqualsAndHashCode.Include - @GeneratedValue(generator = "realm-uuid") - @GenericGenerator(name = "realm-uuid", strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") - private String id; + private UUID id; @Column(nullable = false) private Boolean enabled; diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Role.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Role.java index f1a8b1031b..5d25bce86b 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Role.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/Role.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; +import java.util.UUID; @Data @Entity @@ -19,10 +20,8 @@ public class Role { @Id @EqualsAndHashCode.Include - @GeneratedValue(generator = "role-uuid") - @GenericGenerator(name = "role-uuid", strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") - private String id; + private UUID id; @Column(name = "NAME", nullable = false) private String name; diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMapping.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMapping.java index 4ef61ea2ef..7317453872 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMapping.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMapping.java @@ -1,10 +1,10 @@ package at.tuwien.entities.user; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; +import java.util.UUID; @Data @Entity @@ -20,12 +20,12 @@ public class RoleMapping { @Id @EqualsAndHashCode.Include - @Column(name = "USER_ID", nullable = false) - private String userId; + @Column(name = "USER_ID", nullable = false, columnDefinition = "VARCHAR(36)") + private UUID userId; @Id @EqualsAndHashCode.Include - @Column(name = "ROLE_ID", nullable = false) - private String roleId; + @Column(name = "ROLE_ID", nullable = false, columnDefinition = "VARCHAR(36)") + private UUID roleId; } diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMappingKey.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMappingKey.java index 7e96f96b1f..ffe719a710 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMappingKey.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/RoleMappingKey.java @@ -3,12 +3,13 @@ package at.tuwien.entities.user; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.UUID; @EqualsAndHashCode public class RoleMappingKey implements Serializable { - private String userId; + private UUID userId; - private String roleId; + private UUID roleId; } diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java index 2d36a68aff..b4469d77bf 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java @@ -9,6 +9,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; import java.util.List; +import java.util.UUID; @Data @Entity @@ -31,10 +32,8 @@ public class User { @Id @EqualsAndHashCode.Include - @GeneratedValue(generator = "user-uuid") - @GenericGenerator(name = "user-uuid", strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") - private String id; + private UUID id; @Column(nullable = false) private String username; @@ -45,8 +44,8 @@ public class User { @Column(name = "LAST_NAME") private String lastname; - @Column(name = "REALM_ID") - private String realmId; + @Column(name = "REALM_ID", columnDefinition = "VARCHAR(36)") + private UUID realmId; @Column(nullable = false) private String email; @@ -95,4 +94,9 @@ public class User { @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "creator") private List<Identifier> identifiers; + @Transient + @ToString.Exclude + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "creator") + private List<at.tuwien.entities.database.table.Table> tables; + } diff --git a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/UserAttribute.java b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/UserAttribute.java index fbcfc82cf5..976fc09f81 100644 --- a/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/UserAttribute.java +++ b/dbrepo-metadata-db/entities/src/main/java/at/tuwien/entities/user/UserAttribute.java @@ -1,11 +1,11 @@ package at.tuwien.entities.user; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.*; import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; +import java.util.UUID; @Data @Entity @@ -20,14 +20,12 @@ public class UserAttribute { @Id @EqualsAndHashCode.Include - @GeneratedValue(generator = "attribute-uuid") - @GenericGenerator(name = "attribute-uuid", strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") - private String id; + private UUID id; @ToString.Exclude - @Column(name = "USER_ID", nullable = false) - private String userId; + @Column(name = "USER_ID", nullable = false, columnDefinition = "VARCHAR(36)") + private UUID userId; @Column(name = "NAME", nullable = false) private String name; diff --git a/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java index cb509b750d..d6a515b397 100644 --- a/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java @@ -165,7 +165,7 @@ public abstract class BaseTest { .themeDark(false) .build(); - public final static String REALM_DBREPO_ID = "6264bf7b-d1d3-4562-9c07-ce4364a8f9d3"; + public final static UUID REALM_DBREPO_ID = UUID.fromString("6264bf7b-d1d3-4562-9c07-ce4364a8f9d3"); public final static String REALM_DBREPO_NAME = "dbrepo"; public final static Boolean REALM_DBREPO_ENABLED = true; @@ -182,7 +182,7 @@ public abstract class BaseTest { .username(USER_BROKER_USERNAME) .build(); - public final static String USER_1_ID = "cd5bab0d-7799-4069-85fb-c5d738572a0b"; + public final static UUID USER_1_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b"); public final static String USER_1_EMAIL = "john.doe@example.com"; public final static String USER_1_USERNAME = "junit1"; public final static String USER_1_PASSWORD = "s3cr3t1nf0rm4t10n"; @@ -200,41 +200,41 @@ public abstract class BaseTest { public final static Boolean USER_1_THEME_DARK = false; public final static Instant USER_1_CREATED = Instant.ofEpochSecond(1677399441) /* 2023-02-26 08:17:21 (UTC) */; public final static Instant USER_1_LAST_MODIFIED = USER_1_CREATED; - public final static String USER_1_REALM_ID = REALM_DBREPO_ID; + public final static UUID USER_1_REALM_ID = REALM_DBREPO_ID; public final static List<UserAttribute> USER_1_ATTRIBUTES = List.of(UserAttribute.builder() - .id("c466a105-5bbd-4afc-87ae-751d5037d9ab") + .id(UUID.fromString("c466a105-5bbd-4afc-87ae-751d5037d9ab")) .userId(USER_1_ID) .name("theme_dark") .value("false") .build(), UserAttribute.builder() - .id("0870498b-d6ac-4543-bef1-830142de96d7") + .id(UUID.fromString("0870498b-d6ac-4543-bef1-830142de96d7")) .userId(USER_1_ID) .name("orcid") .value(USER_1_ORCID_UNCOMPRESSED) .build(), UserAttribute.builder() - .id("42b06e7f-9df2-4b1c-bdfb-904401d6ad36") + .id(UUID.fromString("42b06e7f-9df2-4b1c-bdfb-904401d6ad36")) .userId(USER_1_ID) .name("affiliation") .value(USER_1_AFFILIATION) .build()); public final static List<UserAttributeDto> USER_1_ATTRIBUTES_DTO = List.of(UserAttributeDto.builder() - .id("c466a105-5bbd-4afc-87ae-751d5037d9ab") + .id(UUID.fromString("c466a105-5bbd-4afc-87ae-751d5037d9ab")) .userId(USER_1_ID) .name("theme_dark") .value("false") .build(), UserAttributeDto.builder() - .id("0870498b-d6ac-4543-bef1-830142de96d7") + .id(UUID.fromString("0870498b-d6ac-4543-bef1-830142de96d7")) .userId(USER_1_ID) .name("orcid") .value(USER_1_ORCID_UNCOMPRESSED) .build(), UserAttributeDto.builder() - .id("42b06e7f-9df2-4b1c-bdfb-904401d6ad36") + .id(UUID.fromString("42b06e7f-9df2-4b1c-bdfb-904401d6ad36")) .userId(USER_1_ID) .name("affiliation") .value(USER_1_AFFILIATION) @@ -302,7 +302,7 @@ public abstract class BaseTest { .tags(new String[]{"administrator"}) .build(); - public final static String USER_2_ID = "eeb9a51b-4cd8-4039-90bf-e24f17372f7c"; + public final static UUID USER_2_ID = UUID.fromString("eeb9a51b-4cd8-4039-90bf-e24f17372f7c"); public final static String USER_2_EMAIL = "jane.doe@example.com"; public final static String USER_2_USERNAME = "junit2"; public final static String USER_2_FIRSTNAME = "Jane"; @@ -317,41 +317,41 @@ public abstract class BaseTest { public final static Boolean USER_2_THEME_DARK = false; public final static Instant USER_2_CREATED = Instant.ofEpochSecond(1677399528) /* 2023-02-26 08:18:48 (UTC) */; public final static Instant USER_2_LAST_MODIFIED = USER_1_CREATED; - public final static String USER_2_REALM_ID = REALM_DBREPO_ID; + public final static UUID USER_2_REALM_ID = REALM_DBREPO_ID; public final static List<UserAttribute> USER_2_ATTRIBUTES = List.of(UserAttribute.builder() - .id("23da2c08-cb8a-4e18-a7f0-70c30de2771e") + .id(UUID.fromString("23da2c08-cb8a-4e18-a7f0-70c30de2771e")) .userId(USER_2_ID) .name("theme_dark") .value("false") .build(), UserAttribute.builder() - .id("83223dfd-1c80-4132-8c74-a38994f45f4a") + .id(UUID.fromString("83223dfd-1c80-4132-8c74-a38994f45f4a")) .userId(USER_2_ID) .name("orcid") .value(USER_2_ORCID_UNCOMPRESSED) .build(), UserAttribute.builder() - .id("a29879fd-9801-4adf-bf3a-16bbff6ea207") + .id(UUID.fromString("a29879fd-9801-4adf-bf3a-16bbff6ea207")) .userId(USER_2_ID) .name("affiliation") .value(USER_2_AFFILIATION) .build()); public final static List<UserAttributeDto> USER_2_ATTRIBUTES_DTO = List.of(UserAttributeDto.builder() - .id("23da2c08-cb8a-4e18-a7f0-70c30de2771e") + .id(UUID.fromString("23da2c08-cb8a-4e18-a7f0-70c30de2771e")) .userId(USER_2_ID) .name("theme_dark") .value("false") .build(), UserAttributeDto.builder() - .id("83223dfd-1c80-4132-8c74-a38994f45f4a") + .id(UUID.fromString("83223dfd-1c80-4132-8c74-a38994f45f4a")) .userId(USER_2_ID) .name("orcid") .value(USER_2_ORCID_UNCOMPRESSED) .build(), UserAttributeDto.builder() - .id("a29879fd-9801-4adf-bf3a-16bbff6ea207") + .id(UUID.fromString("a29879fd-9801-4adf-bf3a-16bbff6ea207")) .userId(USER_2_ID) .name("affiliation") .value(USER_2_AFFILIATION) @@ -401,7 +401,7 @@ public abstract class BaseTest { .build(); public final static UserDetails USER_2_DETAILS = UserDetailsDto.builder() - .id(USER_2_ID) + .id(USER_2_ID.toString()) .username(USER_2_USERNAME) .email(USER_2_EMAIL) .password(USER_2_PASSWORD) @@ -416,7 +416,7 @@ public abstract class BaseTest { public final static Principal USER_2_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_2_DETAILS, USER_2_PASSWORD, USER_2_DETAILS.getAuthorities()); - public final static String USER_3_ID = "7b080e33-d8db-4276-9d53-47208e657006"; + public final static UUID USER_3_ID = UUID.fromString("7b080e33-d8db-4276-9d53-47208e657006"); public final static String USER_3_USERNAME = "junit3"; public final static String USER_3_FIRSTNAME = "System"; public final static String USER_3_LASTNAME = "System"; @@ -429,7 +429,45 @@ public abstract class BaseTest { public final static Boolean USER_3_ENABLED = true; public final static Boolean USER_3_THEME_DARK = false; public final static Instant USER_3_CREATED = Instant.ofEpochSecond(1677399559) /* 2023-02-26 08:19:19 (UTC) */; - public final static String USER_3_REALM_ID = REALM_DBREPO_ID; + public final static UUID USER_3_REALM_ID = REALM_DBREPO_ID; + + public final static List<UserAttribute> USER_3_ATTRIBUTES = List.of(UserAttribute.builder() + .id(UUID.fromString("58062219-7b99-4c0d-b00b-136b7d916c04")) + .userId(USER_3_ID) + .name("theme_dark") + .value(USER_3_THEME_DARK.toString()) + .build(), + UserAttribute.builder() + .id(UUID.fromString("384851ee-83c4-4cda-805e-be0c1bab71eb")) + .userId(USER_3_ID) + .name("orcid") + .value(null) + .build(), + UserAttribute.builder() + .id(UUID.fromString("c2cb2357-5e34-453f-b080-ca1c97f56d4a")) + .userId(USER_3_ID) + .name("affiliation") + .value(USER_3_AFFILIATION) + .build()); + + public final static List<UserAttributeDto> USER_3_ATTRIBUTES_DTO = List.of(UserAttributeDto.builder() + .id(UUID.fromString("58062219-7b99-4c0d-b00b-136b7d916c04")) + .userId(USER_3_ID) + .name("theme_dark") + .value(USER_3_THEME_DARK.toString()) + .build(), + UserAttributeDto.builder() + .id(UUID.fromString("384851ee-83c4-4cda-805e-be0c1bab71eb")) + .userId(USER_3_ID) + .name("orcid") + .value(null) + .build(), + UserAttributeDto.builder() + .id(UUID.fromString("c2cb2357-5e34-453f-b080-ca1c97f56d4a")) + .userId(USER_3_ID) + .name("affiliation") + .value(USER_3_AFFILIATION) + .build()); public final static User USER_3 = User.builder() .id(USER_3_ID) @@ -437,8 +475,26 @@ public abstract class BaseTest { .email(USER_3_EMAIL) .emailVerified(true) .databasePassword(USER_3_DATABASE_PASSWORD) + .firstname(USER_3_FIRSTNAME) + .lastname(USER_3_LASTNAME) + .emailVerified(USER_3_VERIFIED) .enabled(USER_3_ENABLED) .realmId(USER_3_REALM_ID) + .attributes(USER_3_ATTRIBUTES) + .build(); + + public final static User USER_3_SIMPLE = User.builder() + .id(USER_3_ID) + .username(USER_3_USERNAME) + .email(USER_3_EMAIL) + .emailVerified(true) + .databasePassword(USER_3_DATABASE_PASSWORD) + .firstname(USER_3_FIRSTNAME) + .lastname(USER_3_LASTNAME) + .emailVerified(USER_3_VERIFIED) + .enabled(USER_3_ENABLED) + .realmId(USER_3_REALM_ID) + .attributes(List.of() /* for jpa */) .build(); public final static UserDto USER_3_DTO = UserDto.builder() @@ -465,7 +521,7 @@ public abstract class BaseTest { .tags(new String[]{}) .build(); - public final static String USER_4_ID = "791d58c5-bfab-4520-b4fc-b44d4ab9feb0"; + public final static UUID USER_4_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0"); public final static String USER_4_USERNAME = "junit4"; public final static String USER_4_FIRSTNAME = "JUnit"; public final static String USER_4_LASTNAME = "4"; @@ -478,7 +534,7 @@ public abstract class BaseTest { public final static Boolean USER_4_ENABLED = true; public final static Boolean USER_4_THEME_DARK = false; public final static Instant USER_4_CREATED = Instant.ofEpochSecond(1677399592) /* 2023-02-26 08:19:52 (UTC) */; - public final static String USER_4_REALM_ID = REALM_DBREPO_ID; + public final static UUID USER_4_REALM_ID = REALM_DBREPO_ID; public final static User USER_4 = User.builder() .id(USER_4_ID) @@ -509,7 +565,7 @@ 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 String USER_5_ID = "28ff851d-d7bc-4422-959c-edd7a5b15630"; + public final static UUID USER_5_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630"); public final static String USER_5_USERNAME = "system"; public final static String USER_5_FIRSTNAME = "System"; public final static String USER_5_LASTNAME = "System"; @@ -521,7 +577,7 @@ public abstract class BaseTest { public final static Boolean USER_5_VERIFIED = true; public final static Boolean USER_5_THEME_DARK = false; public final static Instant USER_5_CREATED = Instant.ofEpochSecond(1677399592) /* 2023-02-26 08:19:52 (UTC) */; - public final static String USER_5_REALM_ID = REALM_DBREPO_ID; + public final static UUID USER_5_REALM_ID = REALM_DBREPO_ID; public final static User USER_5 = User.builder() .id(USER_5_ID) @@ -1448,6 +1504,33 @@ public abstract class BaseTest { public final static Instant TABLE_7_CREATED = Instant.ofEpochSecond(1677400175) /* 2023-02-26 08:29:35 (UTC) */; public final static Instant TABLE_7_LAST_MODIFIED = Instant.ofEpochSecond(1677400175) /* 2023-02-26 08:29:35 (UTC) */; + public final static List<TableColumn> TABLE_7_COLUMNS = List.of(TableColumn.builder() + .id(1L) + .ordinalPosition(0) + .cdbid(DATABASE_1_ID) + .tid(TABLE_1_ID) + .name("Timestamp") + .internalName("timestamp") + .columnType(TableColumnType.TIMESTAMP) + .dfid(IMAGE_DATE_3_ID) + .isNullAllowed(false) + .autoGenerated(false) + .isPrimaryKey(true) + .build(), + TableColumn.builder() + .id(2L) + .ordinalPosition(1) + .cdbid(DATABASE_1_ID) + .tid(TABLE_1_ID) + .name("Value") + .internalName("value") + .columnType(TableColumnType.DECIMAL) + .dfid(null) + .isNullAllowed(true) + .autoGenerated(false) + .isPrimaryKey(false) + .build()); + public final static Table TABLE_7 = Table.builder() .id(TABLE_7_ID) .created(Instant.now()) @@ -1457,37 +1540,27 @@ public abstract class BaseTest { .tdbid(DATABASE_1_ID) .queueName(TABLE_7_QUEUE_NAME) .routingKey(TABLE_7_ROUTING_KEY) - .columns(List.of(TableColumn.builder() - .id(1L) - .ordinalPosition(0) - .cdbid(DATABASE_1_ID) - .tid(TABLE_1_ID) - .name("Timestamp") - .internalName("timestamp") - .columnType(TableColumnType.TIMESTAMP) - .dfid(IMAGE_DATE_3_ID) - .isNullAllowed(false) - .autoGenerated(false) - .isPrimaryKey(true) - .build(), - TableColumn.builder() - .id(2L) - .ordinalPosition(1) - .cdbid(DATABASE_1_ID) - .tid(TABLE_1_ID) - .name("Value") - .internalName("value") - .columnType(TableColumnType.DECIMAL) - .dfid(null) - .isNullAllowed(true) - .autoGenerated(false) - .isPrimaryKey(false) - .build())) + .columns(TABLE_7_COLUMNS) .creator(USER_1) .created(TABLE_7_CREATED) .lastModified(TABLE_7_LAST_MODIFIED) .build(); + public final static Table TABLE_7_SIMPLE = Table.builder() + .id(TABLE_7_ID) + .created(Instant.now()) + .internalName(TABLE_7_INTERNAL_NAME) + .description(TABLE_7_DESCRIPTION) + .name(TABLE_7_NAME) + .tdbid(DATABASE_1_ID) + .queueName(TABLE_7_QUEUE_NAME) + .routingKey(TABLE_7_ROUTING_KEY) + .columns(List.of() /* for jpa */) + .creator(null /* for jpa */) + .created(TABLE_7_CREATED) + .lastModified(TABLE_7_LAST_MODIFIED) + .build(); + public final static Long TABLE_8_ID = 8L; public final static String TABLE_8_NAME = "mfcc"; public final static String TABLE_8_INTERNAL_NAME = "mfcc"; @@ -2066,7 +2139,7 @@ public abstract class BaseTest { .resultHash(QUERY_1_RESULT_HASH) .created(QUERY_1_CREATED) .execution(QUERY_1_EXECUTION) - .createdBy(USER_1_ID) + .createdBy(USER_1_ID.toString()) .creator(USER_1_DTO) .build(); @@ -2079,7 +2152,7 @@ public abstract class BaseTest { .resultHash(QUERY_1_RESULT_HASH) .created(QUERY_1_CREATED) .execution(QUERY_1_EXECUTION) - .createdBy(USER_1_ID) + .createdBy(USER_1_ID.toString()) .creator(USER_1_DTO) .build(); @@ -2385,8 +2458,9 @@ public abstract class BaseTest { .lastModified(TABLE_1_LAST_MODIFIED) .build(); - public final static Table TABLE_1_NOCOLS = Table.builder() + public final static Table TABLE_1_SIMPLE = Table.builder() .id(TABLE_1_ID) + .database(null /* for jpa */) .created(Instant.now()) .internalName(TABLE_1_INTERNALNAME) .description(TABLE_1_DESCRIPTION) @@ -2395,8 +2469,9 @@ public abstract class BaseTest { .tdbid(DATABASE_1_ID) .queueName(TABLE_1_QUEUE_NAME) .routingKey(TABLE_1_ROUTING_KEY) - .columns(List.of()) - .creator(USER_1) + .columns(List.of() /* for jpa */) + .constraints(null /* for jpa */) /* TABLE_1_CONSTRAINTS */ + .creator(null /* for jpa */) .created(TABLE_1_CREATED) .lastModified(TABLE_1_LAST_MODIFIED) .build(); @@ -2461,8 +2536,9 @@ public abstract class BaseTest { .lastModified(TABLE_2_LAST_MODIFIED) .build(); - public final static Table TABLE_2_NOCOLS = Table.builder() + public final static Table TABLE_2_SIMPLE = Table.builder() .id(TABLE_2_ID) + .database(null /* for jpa */) .created(Instant.now()) .internalName(TABLE_2_INTERNALNAME) .description(TABLE_2_DESCRIPTION) @@ -2471,8 +2547,8 @@ public abstract class BaseTest { .tdbid(DATABASE_1_ID) .queueName(TABLE_2_QUEUE_NAME) .routingKey(TABLE_2_ROUTING_KEY) - .columns(List.of()) - .creator(USER_1) + .columns(List.of() /* for jpa */) + .creator(null /* for jpa */) .created(TABLE_2_CREATED) .lastModified(TABLE_2_LAST_MODIFIED) .build(); @@ -2970,8 +3046,9 @@ public abstract class BaseTest { .lastModified(TABLE_3_LAST_MODIFIED) .build(); - public final static Table TABLE_3_NOCOLS = Table.builder() + public final static Table TABLE_3_SIMPLE = Table.builder() .id(TABLE_3_ID) + .database(null /* for jpa */) .created(Instant.now()) .internalName(TABLE_3_INTERNALNAME) .description(TABLE_3_DESCRIPTION) @@ -2980,8 +3057,9 @@ public abstract class BaseTest { .tdbid(DATABASE_1_ID) .queueName(TABLE_3_QUEUE_NAME) .routingKey(TABLE_3_ROUTING_KEY) - .columns(List.of()) - .creator(USER_1) + .columns(List.of() /* for jpa */) + .constraints(TABLE_3_CONSTRAINTS) + .creator(null /* for jpa */) .created(TABLE_3_CREATED) .lastModified(TABLE_3_LAST_MODIFIED) .build(); @@ -3300,22 +3378,6 @@ public abstract class BaseTest { .creator(USER_1) .build(); - public final static Table TABLE_4_NOCOLS = Table.builder() - .id(TABLE_4_ID) - .created(Instant.now()) - .internalName(TABLE_4_INTERNALNAME) - .description(TABLE_4_DESCRIPTION) - .name(TABLE_4_NAME) - .lastModified(TABLE_4_LAST_MODIFIED) - .tdbid(DATABASE_1_ID) - .queueName(TABLE_4_QUEUE_NAME) - .routingKey(TABLE_4_ROUTING_KEY) - .columns(List.of()) - .creator(USER_1) - .created(TABLE_4_CREATED) - .lastModified(TABLE_4_LAST_MODIFIED) - .build(); - public final static List<ForeignKeyCreateDto> TABLE_4_FOREIGN_KEYS_INVALID_CREATE = List.of(ForeignKeyCreateDto.builder() .columns(List.of("somecolumn")) .referencedTable("sometable") diff --git a/dbrepo-query-service/rest-service/src/test/java/at/tuwien/endpoint/StoreEndpointUnitTest.java b/dbrepo-query-service/rest-service/src/test/java/at/tuwien/endpoint/StoreEndpointUnitTest.java index 2a7a024b70..de175df709 100644 --- a/dbrepo-query-service/rest-service/src/test/java/at/tuwien/endpoint/StoreEndpointUnitTest.java +++ b/dbrepo-query-service/rest-service/src/test/java/at/tuwien/endpoint/StoreEndpointUnitTest.java @@ -10,14 +10,12 @@ import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.BrokerServiceGateway; -import at.tuwien.listener.MessageQueueListener; import at.tuwien.listener.impl.RabbitMqListenerImpl; import at.tuwien.querystore.Query; import at.tuwien.repository.jpa.IdentifierRepository; import at.tuwien.service.AccessService; import at.tuwien.service.DatabaseService; import at.tuwien.service.QueryService; -import at.tuwien.service.UserService; import at.tuwien.service.impl.StoreServiceImpl; import com.rabbitmq.client.Channel; import lombok.extern.log4j.Log4j2; @@ -34,6 +32,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; import java.util.List; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.doReturn; @@ -70,9 +69,6 @@ public class StoreEndpointUnitTest extends BaseUnitTest { @MockBean private StoreServiceImpl storeService; - @MockBean - private UserService userService; - @MockBean private IdentifierRepository identifierRepository; @@ -309,13 +305,6 @@ public class StoreEndpointUnitTest extends BaseUnitTest { /* mock */ doReturn(List.of(QUERY_1)).when(storeService) .findAll(containerId, databaseId, true, principal); - if (user != null) { - when(userService.findAll()) - .thenReturn(List.of(user)); - } else { - when(userService.findAll()) - .thenReturn(List.of()); - } when(databaseService.find(containerId, databaseId)) .thenReturn(database); @@ -330,7 +319,7 @@ public class StoreEndpointUnitTest extends BaseUnitTest { } protected QueryDto find_generic(Long containerId, Long databaseId, Database database, Long queryId, Query query, - String userId, User user, Principal principal) throws QueryStoreException, + UUID userId, User user, Principal principal) throws QueryStoreException, QueryNotFoundException, DatabaseNotFoundException, ImageNotSupportedException, UserNotFoundException, NotAllowedException, DatabaseConnectionException { @@ -342,13 +331,6 @@ public class StoreEndpointUnitTest extends BaseUnitTest { when(storeService.findOne(containerId, databaseId, queryId, principal)) .thenThrow(QueryNotFoundException.class); } - if (user != null) { - when(userService.find(userId)) - .thenReturn(user); - } else { - when(userService.find(userId)) - .thenThrow(UserNotFoundException.class); - } if (database != null) { when(databaseService.find(containerId, databaseId)) .thenReturn(database); diff --git a/dbrepo-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java b/dbrepo-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java index 84b278ad27..09cd52fefd 100644 --- a/dbrepo-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java +++ b/dbrepo-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java @@ -47,6 +47,12 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { @Autowired private ContainerRepository containerRepository; + @Autowired + private RealmRepository realmRepository; + + @Autowired + private UserRepository userRepository; + @Autowired private DatabaseRepository databaseRepository; @@ -85,14 +91,14 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { public void beforeEach() { /* metadata database */ h2Utils.runScript("schema.sql"); - imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1); - DATABASE_1.setTables(List.of()); - databaseRepository.save(DATABASE_1); - DATABASE_1.setTables(List.of(TABLE_1, TABLE_2, TABLE_3)); - tableRepository.save(TABLE_1_NOCOLS); - tableRepository.save(TABLE_2_NOCOLS); - tableRepository.save(TABLE_3_NOCOLS); + imageRepository.save(IMAGE_1_SIMPLE); + realmRepository.save(REALM_DBREPO); + userRepository.save(USER_1_SIMPLE); + containerRepository.save(CONTAINER_1_SIMPLE); + databaseRepository.save(DATABASE_1_SIMPLE); + tableRepository.save(TABLE_1_SIMPLE); + tableRepository.save(TABLE_2_SIMPLE); + tableRepository.save(TABLE_3_SIMPLE); } @Test diff --git a/dbrepo-query-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java b/dbrepo-query-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java index ed559e4423..9eaa311b10 100644 --- a/dbrepo-query-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java +++ b/dbrepo-query-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java @@ -8,10 +8,7 @@ import at.tuwien.config.ReadyConfig; import at.tuwien.exception.*; import at.tuwien.gateway.BrokerServiceGateway; import at.tuwien.listener.impl.RabbitMqListenerImpl; -import at.tuwien.repository.jpa.ContainerRepository; -import at.tuwien.repository.jpa.DatabaseRepository; -import at.tuwien.repository.jpa.ImageRepository; -import at.tuwien.repository.jpa.TableRepository; +import at.tuwien.repository.jpa.*; import com.rabbitmq.client.Channel; import at.tuwien.config.DockerConfig; import lombok.extern.log4j.Log4j2; @@ -65,6 +62,12 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { @Autowired private ContainerRepository containerRepository; + @Autowired + private RealmRepository realmRepository; + + @Autowired + private UserRepository userRepository; + @Autowired private DatabaseRepository databaseRepository; @@ -97,15 +100,16 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { /* metadata db */ h2Utils.runScript("schema.sql"); /* metadata db */ - imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1); - tableRepository.save(TABLE_1_NOCOLS); - tableRepository.save(TABLE_2_NOCOLS); - tableRepository.save(TABLE_3_NOCOLS); - tableRepository.save(TABLE_7_NOCOLS); - DATABASE_1.setTables(List.of()); - DATABASE_1.setViews(List.of()); - databaseRepository.save(DATABASE_1); + imageRepository.save(IMAGE_1_SIMPLE); + realmRepository.save(REALM_DBREPO); + userRepository.save(USER_1_SIMPLE); + userRepository.save(USER_2_SIMPLE); + containerRepository.save(CONTAINER_1_SIMPLE); + databaseRepository.save(DATABASE_1_SIMPLE); + tableRepository.save(TABLE_1_SIMPLE); + tableRepository.save(TABLE_2_SIMPLE); + tableRepository.save(TABLE_3_SIMPLE); + tableRepository.save(TABLE_7_SIMPLE); } @Test diff --git a/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/UserMapper.java index 4352af3a59..cf803c0f13 100644 --- a/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ b/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/UserMapper.java @@ -1,10 +1,13 @@ package at.tuwien.mapper; import at.tuwien.api.user.GrantedAuthorityDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDetailsDto; import at.tuwien.api.user.UserDto; import at.tuwien.entities.user.User; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -13,7 +16,11 @@ public interface UserMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserMapper.class); - UserDetailsDto userDtoToUserDetailsDto(UserDto data); + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) + UserDetailsDto userBriefDtoToUserDetailsDto(UserBriefDto data); UserDto userToUserDto(User data); diff --git a/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/ViewMapper.java b/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/ViewMapper.java index 04234f583f..91fb6bc00c 100644 --- a/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/ViewMapper.java +++ b/dbrepo-query-service/services/src/main/java/at/tuwien/mapper/ViewMapper.java @@ -3,30 +3,19 @@ package at.tuwien.mapper; import at.tuwien.api.database.ViewBriefDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.entities.database.View; import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.QueryStoreException; -import at.tuwien.exception.TableMalformedException; -import at.tuwien.querystore.Query; -import org.apache.commons.codec.digest.DigestUtils; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.Named; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; -import javax.persistence.Column; import java.sql.*; import java.text.Normalizer; -import java.time.Instant; -import java.util.LinkedList; -import java.util.List; import java.util.Locale; import java.util.regex.Pattern; -@Mapper(componentModel = "spring", uses = {ContainerMapper.class}) +@Mapper(componentModel = "spring", uses = {ContainerMapper.class, UserMapper.class}) public interface ViewMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ViewMapper.class); @@ -52,7 +41,7 @@ public interface ViewMapper { ViewDto viewToViewDto(View data); @Mappings({ - @Mapping(target = "createdBy", source = "creator.id") + @Mapping(target = "createdBy", expression = "java(data.getCreator().getId().toString())") }) ViewBriefDto viewToViewBriefDto(View data); diff --git a/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java b/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java new file mode 100644 index 0000000000..c1a5d756b7 --- /dev/null +++ b/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java @@ -0,0 +1,14 @@ +package at.tuwien.repository.jpa; + +import at.tuwien.entities.user.Realm; +import at.tuwien.entities.user.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface RealmRepository extends JpaRepository<Realm, UUID> { + +} diff --git a/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java b/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java index e77de8f6a8..9eb0b51902 100644 --- a/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java +++ b/dbrepo-query-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository<User, String> { +public interface UserRepository extends JpaRepository<User, UUID> { Optional<User> findByUsername(String username); diff --git a/dbrepo-query-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-query-service/services/src/main/java/at/tuwien/service/UserService.java index 830efcaf6b..a96834b648 100644 --- a/dbrepo-query-service/services/src/main/java/at/tuwien/service/UserService.java +++ b/dbrepo-query-service/services/src/main/java/at/tuwien/service/UserService.java @@ -6,6 +6,7 @@ import at.tuwien.exception.UserNotFoundException; import java.security.Principal; import java.util.List; +import java.util.UUID; public interface UserService { @@ -24,23 +25,4 @@ public interface UserService { * @throws UserNotFoundException The user was not found in the metadata database. */ User findByUsername(String username) throws UserNotFoundException; - - /** - * Finds a user by user principal or uses the anonymous user - * - * @param principal The user principal. - * @param container The container which is used to detetermine the image's default anonymous user - * @return A user, if successful. - * @throws UserNotFoundException No user was found. - */ - User findByPrincipalOrAnonymous(Principal principal, Container container) throws UserNotFoundException; - - /** - * Finds a user by id. - * - * @param id The id. - * @return The user. - * @throws UserNotFoundException The user was not found in the metadata database. - */ - User find(String id) throws UserNotFoundException; } diff --git a/dbrepo-query-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-query-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java index 89a95b3678..d3c8b16596 100644 --- a/dbrepo-query-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ b/dbrepo-query-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java @@ -1,8 +1,5 @@ package at.tuwien.service.impl; -import at.tuwien.entities.container.Container; -import at.tuwien.entities.container.image.ContainerImageEnvironmentItem; -import at.tuwien.entities.container.image.ContainerImageEnvironmentItemType; import at.tuwien.entities.user.User; import at.tuwien.exception.UserNotFoundException; import at.tuwien.repository.jpa.UserRepository; @@ -10,12 +7,9 @@ import at.tuwien.service.UserService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.security.Principal; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; @Log4j2 @Service @@ -43,43 +37,4 @@ public class UserServiceImpl implements UserService { return optional.get(); } - @Override - @Transactional(readOnly = true) - public User findByPrincipalOrAnonymous(Principal principal, Container container) throws UserNotFoundException { - log.trace("find user or anonymous, principal={}, container={}", principal, container); - if (principal == null) { - final String username = container.getImage() - .getEnvironment() - .stream() - .filter(e -> e.getType().equals(ContainerImageEnvironmentItemType.PRIVILEGED_USERNAME)) - .map(ContainerImageEnvironmentItem::getValue) - .collect(Collectors.toList()) - .get(0); - final String password = container.getImage() - .getEnvironment() - .stream() - .filter(e -> e.getType().equals(ContainerImageEnvironmentItemType.PRIVILEGED_PASSWORD)) - .map(ContainerImageEnvironmentItem::getValue) - .collect(Collectors.toList()) - .get(0); - final User user = User.builder() - .username(username) - .databasePassword(password) - .build(); - log.trace("mapped anonymous user {}", user); - return user; - } - return findByUsername(principal.getName()); - } - - @Override - public User find(String id) throws UserNotFoundException { - final Optional<User> optional = userRepository.findById(id); - if (optional.isEmpty()) { - log.error("Failed to retrieve user with id {}", id); - throw new UserNotFoundException("Failed to retrieve user"); - } - return optional.get(); - } - } diff --git a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index 9b4db6f4f0..04daf45d0b 100644 --- a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -7,10 +7,10 @@ import at.tuwien.endpoints.TableEndpoint; import at.tuwien.exception.DatabaseNotFoundException; import at.tuwien.repository.elastic.TableColumnIdxRepository; import at.tuwien.repository.elastic.TableIdxRepository; +import at.tuwien.repository.jpa.*; import at.tuwien.service.DatabaseService; import com.rabbitmq.client.Channel; -import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -18,9 +18,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; -import javax.ws.rs.NotAllowedException; -import java.security.Principal; - import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -28,54 +25,51 @@ import static org.mockito.Mockito.*; @SpringBootTest public class TableEndpointUnitTest extends BaseUnitTest { - /** - * RabbitMQ not required in this test - */ @MockBean private ReadyConfig readyConfig; - /** - * RabbitMQ not required in this test - */ @MockBean private Channel channel; - /** - * ElasticSearch not required in this test - */ @MockBean private IndexConfig indexInitializer; - /** - * ElasticSearch not required in this test - */ @MockBean private TableIdxRepository tableidxRepository; - /** - * ElasticSearch not required in this test - */ @MockBean private TableColumnIdxRepository tableColumnidxRepository; - @MockBean - private DatabaseService databaseService; + @Autowired + private ContainerRepository containerRepository; + + @Autowired + private ImageRepository imageRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private RealmRepository realmRepository; @Autowired private TableEndpoint tableEndpoint; - @Test - @Disabled - public void list_databaseNotFound_fails() throws DatabaseNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + @BeforeEach + public void beforeEach() { + /* metadata database */ + imageRepository.save(IMAGE_1_SIMPLE); + realmRepository.save(REALM_DBREPO); + userRepository.save(USER_1_SIMPLE); + containerRepository.save(CONTAINER_1_SIMPLE); + } - /* mock */ - when(databaseService.find(CONTAINER_1_ID, DATABASE_1_ID)) - .thenThrow(DatabaseNotFoundException.class); + @Test + public void list_databaseNotFound_fails() { /* test */ - assertThrows(NotAllowedException.class, () -> { - tableEndpoint.list(CONTAINER_1_ID, DATABASE_1_ID, principal); + assertThrows(DatabaseNotFoundException.class, () -> { + tableEndpoint.list(CONTAINER_1_ID, DATABASE_1_ID, USER_1_PRINCIPAL); }); } } diff --git a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java index c5face43b7..d808459c08 100644 --- a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java +++ b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java @@ -72,13 +72,7 @@ public class MessageQueueServiceIntegrationTest extends BaseUnitTest { public static void afterAll() { /* stop containers and remove them */ DockerConfig.removeAllContainers(); - DockerConfig.createAllNetworks(); - } - - @BeforeEach - public void beforeEach() { - TABLE_1.setDatabase(DATABASE_1); - TABLE_2.setDatabase(DATABASE_1); + DockerConfig.removeAllNetworks(); } @Test diff --git a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java index 5e7bebc7f6..0d529abc1c 100644 --- a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java +++ b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java @@ -9,10 +9,7 @@ import at.tuwien.entities.database.table.Table; import at.tuwien.exception.*; import at.tuwien.repository.elastic.TableColumnIdxRepository; import at.tuwien.repository.elastic.TableIdxRepository; -import at.tuwien.repository.jpa.ContainerRepository; -import at.tuwien.repository.jpa.DatabaseRepository; -import at.tuwien.repository.jpa.ImageRepository; -import at.tuwien.repository.jpa.TableRepository; +import at.tuwien.repository.jpa.*; import com.rabbitmq.client.Channel; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.*; @@ -50,9 +47,15 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { @MockBean private TableColumnIdxRepository tableColumnidxRepository; + @Autowired + private RealmRepository realmRepository; + @Autowired private ImageRepository imageRepository; + @Autowired + private UserRepository userRepository; + @Autowired private ContainerRepository containerRepository; @@ -88,11 +91,14 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { public void beforeEach() { h2Utils.runScript("schema.sql"); imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1); - containerRepository.save(CONTAINER_2); - databaseRepository.save(DATABASE_1) /* will have 2 tables */; - tableRepository.save(TABLE_1); - tableRepository.save(TABLE_2); + realmRepository.save(REALM_DBREPO); + userRepository.save(USER_1_SIMPLE); + userRepository.save(USER_2_SIMPLE); + containerRepository.save(CONTAINER_1_SIMPLE); + containerRepository.save(CONTAINER_2_SIMPLE); + databaseRepository.save(DATABASE_1_SIMPLE); + tableRepository.save(TABLE_1_SIMPLE); + tableRepository.save(TABLE_2_SIMPLE); } @Test @@ -128,7 +134,7 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { /* test */ assertThrows(TableNotFoundException.class, () -> { - tableService.findById(CONTAINER_1_ID, DATABASE_1_ID, TABLE_3_ID); + tableService.findById(CONTAINER_1_ID, DATABASE_1_ID, 99999L); }); } @@ -137,7 +143,7 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - tableService.findById(CONTAINER_2_ID, DATABASE_3_ID, TABLE_3_ID); + tableService.findById(CONTAINER_2_ID, 99999L, TABLE_3_ID); }); } @@ -146,7 +152,7 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest { /* test */ assertThrows(ContainerNotFoundException.class, () -> { - tableService.findById(CONTAINER_3_ID, DATABASE_3_ID, TABLE_3_ID); + tableService.findById(99999L, DATABASE_3_ID, TABLE_3_ID); }); } diff --git a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java index 670b3301b3..f6dabd2250 100644 --- a/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java +++ b/dbrepo-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java @@ -10,10 +10,7 @@ import at.tuwien.config.ReadyConfig; import at.tuwien.exception.*; import at.tuwien.repository.elastic.TableColumnIdxRepository; import at.tuwien.repository.elastic.TableIdxRepository; -import at.tuwien.repository.jpa.ContainerRepository; -import at.tuwien.repository.jpa.DatabaseRepository; -import at.tuwien.repository.jpa.ImageRepository; -import at.tuwien.repository.jpa.TableRepository; +import at.tuwien.repository.jpa.*; import com.rabbitmq.client.Channel; import lombok.extern.log4j.Log4j2; import org.apache.http.auth.BasicUserPrincipal; @@ -72,6 +69,12 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest { @Autowired private TableService tableService; + @Autowired + private UserRepository userRepository; + + @Autowired + private RealmRepository realmRepository; + @Autowired private H2Utils h2Utils; @@ -88,11 +91,14 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest { /* metadata database */ h2Utils.runScript("schema.sql"); imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1); - containerRepository.save(CONTAINER_2); - databaseRepository.save(DATABASE_1) /* will have 2 tables */; - tableRepository.save(TABLE_1); - tableRepository.save(TABLE_2); + realmRepository.save(REALM_DBREPO); + userRepository.save(USER_1_SIMPLE); + userRepository.save(USER_2_SIMPLE); + containerRepository.save(CONTAINER_1_SIMPLE); + containerRepository.save(CONTAINER_2_SIMPLE); + databaseRepository.save(DATABASE_1_SIMPLE); + tableRepository.save(TABLE_1_SIMPLE); + tableRepository.save(TABLE_2_SIMPLE); } @AfterEach @@ -105,7 +111,6 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest { public void create_succeeds() throws UserNotFoundException, TableMalformedException, QueryMalformedException, DatabaseNotFoundException, ImageNotSupportedException, TableNameExistsException, ContainerNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* mock */ when(tableidxRepository.save(any(TableDto.class))) @@ -114,7 +119,7 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest { .thenReturn(List.of()); /* test */ - tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_3_CREATE_DTO, principal); + tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_3_CREATE_DTO, USER_1_PRINCIPAL); } @Test @@ -142,7 +147,6 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest { public void create_withConstraints_succeeds() throws UserNotFoundException, TableMalformedException, QueryMalformedException, DatabaseNotFoundException, ImageNotSupportedException, TableNameExistsException, ContainerNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* mock */ when(tableidxRepository.save(any(TableDto.class))) @@ -151,23 +155,16 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest { .thenReturn(List.of()); /* test */ - tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_4_CREATE_DTO, principal); // table to reference - tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_5_CREATE_DTO, principal); + tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_4_CREATE_DTO, USER_1_PRINCIPAL); // table to reference + tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_5_CREATE_DTO, USER_1_PRINCIPAL); } @Test public void create_withForeignKeyButWithoutReferencingTable_fails() { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - when(tableidxRepository.save(any(TableDto.class))) - .thenReturn(null); - when(tableColumnidxRepository.saveAll(anyList())) - .thenReturn(List.of()); /* test */ assertThrows(TableMalformedException.class, () -> { - tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_5_CREATE_DTO, principal); + tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_5_CREATE_DTO, USER_1_PRINCIPAL); }); } diff --git a/dbrepo-table-service/rest-service/src/test/resources/application.properties b/dbrepo-table-service/rest-service/src/test/resources/application.properties index eb36bd3f1d..41b07348e3 100644 --- a/dbrepo-table-service/rest-service/src/test/resources/application.properties +++ b/dbrepo-table-service/rest-service/src/test/resources/application.properties @@ -17,6 +17,9 @@ spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=false +# log +logging.level.org.hibernate.SQL=trace + # broker service spring.rabbitmq.host=dbrepo-broker-service spring.rabbitmq.username=guest diff --git a/dbrepo-table-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-table-service/services/src/main/java/at/tuwien/mapper/UserMapper.java index e4fe5c2862..b57185b5c5 100644 --- a/dbrepo-table-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ b/dbrepo-table-service/services/src/main/java/at/tuwien/mapper/UserMapper.java @@ -8,15 +8,23 @@ import at.tuwien.api.user.UserDto; import at.tuwien.entities.user.User; import at.tuwien.entities.user.UserAttribute; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import java.util.UUID; + @Mapper(componentModel = "spring") public interface UserMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserMapper.class); + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) UserDetailsDto userDtoToUserDetailsDto(UserDto data); UserDto userToUserDto(User data); @@ -31,7 +39,7 @@ public interface UserMapper { return authority; } - default UserAttribute tripleToUserAttribute(String userId, String name, String value) { + default UserAttribute tripleToUserAttribute(UUID userId, String name, String value) { return UserAttribute.builder() .userId(userId) .name(name) diff --git a/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java b/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java new file mode 100644 index 0000000000..5b5855dec8 --- /dev/null +++ b/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java @@ -0,0 +1,12 @@ +package at.tuwien.repository.jpa; + +import at.tuwien.entities.user.Realm; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface RealmRepository extends JpaRepository<Realm, UUID> { + +} diff --git a/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java b/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java index 3772a12f59..9eb0b51902 100644 --- a/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java +++ b/dbrepo-table-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository<User, Long> { +public interface UserRepository extends JpaRepository<User, UUID> { Optional<User> findByUsername(String username); diff --git a/dbrepo-user-service/pom.xml b/dbrepo-user-service/pom.xml index 8b3b45fbf1..58cfe80e7c 100644 --- a/dbrepo-user-service/pom.xml +++ b/dbrepo-user-service/pom.xml @@ -9,9 +9,9 @@ </parent> <groupId>at.tuwien</groupId> - <artifactId>fda-user-service</artifactId> - <version>1.1.0-alpha</version> - <name>fda-user-service</name> + <artifactId>dbrepo-user-service</artifactId> + <version>1.2.0</version> + <name>dbrepo-user-service</name> <description> The query service provides an interface to insert data into the tables created by the table service. It also allows for view-only (possibly paginated and versioned) query execution to the raw data and consumes @@ -132,13 +132,13 @@ <!-- Entity, API, QueryStore --> <dependency> <groupId>at.tuwien</groupId> - <artifactId>fda-metadata-db-api</artifactId> + <artifactId>dbrepo-metadata-db-api</artifactId> <version>${project.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>at.tuwien</groupId> - <artifactId>fda-metadata-db-entites</artifactId> + <artifactId>dbrepo-metadata-db-entites</artifactId> <version>${project.version}</version> <scope>compile</scope> </dependency> diff --git a/dbrepo-user-service/report/pom.xml b/dbrepo-user-service/report/pom.xml index b93720ffeb..fc1e116c6a 100644 --- a/dbrepo-user-service/report/pom.xml +++ b/dbrepo-user-service/report/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>fda-user-service</artifactId> + <artifactId>dbrepo-user-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.1.0-alpha</version> + <version>1.2.0</version> </parent> <artifactId>report</artifactId> - <version>1.1.0-alpha</version> - <name>fda-user-service-report</name> + <version>1.2.0</version> + <name>dbrepo-user-service-report</name> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-user-service/rest-service/pom.xml b/dbrepo-user-service/rest-service/pom.xml index 6a53b116b3..c805699d3f 100644 --- a/dbrepo-user-service/rest-service/pom.xml +++ b/dbrepo-user-service/rest-service/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>fda-user-service</artifactId> + <artifactId>dbrepo-user-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.1.0-alpha</version> + <version>1.2.0</version> </parent> <artifactId>rest-service</artifactId> - <version>1.1.0-alpha</version> - <name>fda-user-service-rest</name> + <version>1.2.0</version> + <name>dbrepo-user-service-rest</name> <dependencies> <dependency> diff --git a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java index 5316b9e062..9ee7a22d2d 100644 --- a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java +++ b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java @@ -3,7 +3,7 @@ package at.tuwien.endpoint; import at.tuwien.api.auth.SignupRequestDto; import at.tuwien.api.user.*; import at.tuwien.config.AuthenticationConfig; -import at.tuwien.entities.auth.Realm; +import at.tuwien.entities.user.Realm; import at.tuwien.entities.user.Role; import at.tuwien.entities.user.User; import at.tuwien.exception.*; @@ -15,7 +15,6 @@ import io.micrometer.core.annotation.Timed; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.extern.log4j.Log4j2; -import org.elasticsearch.client.security.ChangePasswordRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,6 +26,7 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.security.Principal; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Log4j2 @@ -90,7 +90,7 @@ public class UserEndpoint { @NotNull Principal principal) throws UserNotFoundException { log.debug("endpoint find a user, id={}, principal={}", id, principal); - final UserDto dto = userMapper.userToUserDto(userService.find(id)); + final UserDto dto = userMapper.userToUserDto(userService.find(UUID.fromString(id))); log.trace("find user resulted in dto {}", dto); return ResponseEntity.ok() .body(dto); @@ -106,7 +106,7 @@ public class UserEndpoint { @NotNull Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { log.debug("endpoint modify a user, id={}, data={}, principal={}", id, data, principal); - final UserDto dto = userMapper.userToUserDto(userService.modify(id, data, principal)); + final UserDto dto = userMapper.userToUserDto(userService.modify(UUID.fromString(id), data, principal)); log.trace("modify user resulted in dto {}", dto); return ResponseEntity.status(HttpStatus.ACCEPTED) .body(dto); @@ -122,7 +122,7 @@ public class UserEndpoint { @NotNull Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { log.debug("endpoint modify a user theme, id={}, data={}, principal={}", id, data, principal); - final User user = userService.toggleTheme(id, data, principal); + final User user = userService.toggleTheme(UUID.fromString(id), data, principal); final UserDto dto = userMapper.userToUserDto(user); log.trace("modify user theme resulted in dto {}", dto); return ResponseEntity.accepted() @@ -139,7 +139,7 @@ public class UserEndpoint { @NotNull Principal principal) throws UserNotFoundException, ForeignUserException { log.debug("endpoint modify a user password, id={}, data={}, principal={}", id, data, principal); - final User user = userService.updatePassword(id, data, principal); + final User user = userService.updatePassword(UUID.fromString(id), data, principal); final UserDto dto = userMapper.userToUserDto(user); log.trace("updated user password resulted in dto {}", dto); return ResponseEntity.accepted() diff --git a/dbrepo-user-service/services/pom.xml b/dbrepo-user-service/services/pom.xml index a42439c741..ff14aaa547 100644 --- a/dbrepo-user-service/services/pom.xml +++ b/dbrepo-user-service/services/pom.xml @@ -4,13 +4,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>fda-user-service</artifactId> + <artifactId>dbrepo-user-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.1.0-alpha</version> + <version>1.2.0</version> </parent> <artifactId>services</artifactId> - <version>1.1.0-alpha</version> - <name>fda-user-service-services</name> + <version>1.2.0</version> + <name>dbrepo-user-service-services</name> </project> diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java index 8e97787ee7..9d00f7e159 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java @@ -6,7 +6,7 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert import java.util.Collections; -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring", uses = {UserMapper.class}) public interface AuthenticationMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AuthenticationMapper.class); diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java index e4fe5c2862..9156ecd0c3 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java @@ -8,16 +8,24 @@ import at.tuwien.api.user.UserDto; import at.tuwien.entities.user.User; import at.tuwien.entities.user.UserAttribute; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import java.util.UUID; + @Mapper(componentModel = "spring") public interface UserMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserMapper.class); - UserDetailsDto userDtoToUserDetailsDto(UserDto data); + /* keep */ + @Mappings({ + @Mapping(target = "id", expression = "java(data.getId().toString())") + }) + UserDetailsDto userBriefDtoToUserDetailsDto(UserBriefDto data); UserDto userToUserDto(User data); @@ -31,7 +39,7 @@ public interface UserMapper { return authority; } - default UserAttribute tripleToUserAttribute(String userId, String name, String value) { + default UserAttribute tripleToUserAttribute(UUID userId, String name, String value) { return UserAttribute.builder() .userId(userId) .name(name) diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/CredentialRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/CredentialRepository.java index eb43a5af74..d204a19345 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/CredentialRepository.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/CredentialRepository.java @@ -4,7 +4,9 @@ import at.tuwien.entities.user.Credential; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + @Repository -public interface CredentialRepository extends JpaRepository<Credential, String> { +public interface CredentialRepository extends JpaRepository<Credential, UUID> { } diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java index db0443c0a7..aabd612289 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RealmRepository.java @@ -1,13 +1,14 @@ package at.tuwien.repository.jpa; -import at.tuwien.entities.auth.Realm; +import at.tuwien.entities.user.Realm; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface RealmRepository extends JpaRepository<Realm, String> { +public interface RealmRepository extends JpaRepository<Realm, UUID> { Optional<Realm> findByName(String name); diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleMappingRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleMappingRepository.java index fd7261d3a8..8669937f1d 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleMappingRepository.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleMappingRepository.java @@ -4,6 +4,8 @@ import at.tuwien.entities.user.RoleMapping; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + @Repository -public interface RoleMappingRepository extends JpaRepository<RoleMapping, String> { +public interface RoleMappingRepository extends JpaRepository<RoleMapping, UUID> { } diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleRepository.java index 6efb6c2071..a3a4713f68 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleRepository.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/RoleRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface RoleRepository extends JpaRepository<Role, String> { +public interface RoleRepository extends JpaRepository<Role, UUID> { Optional<Role> findByName(String name); } diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserAttributeRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserAttributeRepository.java index 08077e1525..e0c8531399 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserAttributeRepository.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserAttributeRepository.java @@ -6,12 +6,11 @@ import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserAttributeRepository extends JpaRepository<UserAttribute, String> { +public interface UserAttributeRepository extends JpaRepository<UserAttribute, UUID> { - List<UserAttribute> findByUser(String userId); - - Optional<UserAttribute> findByUserIdAndName(String userId, String name); + Optional<UserAttribute> findByUserIdAndName(UUID userId, String name); } diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java index 289a4abae2..48e7ab240f 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/jpa/UserRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; +import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository<User, String> { +public interface UserRepository extends JpaRepository<User, UUID> { Optional<User> findByUsername(String username); diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java index 768b437a71..6c93de6086 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java @@ -1,6 +1,6 @@ package at.tuwien.service; -import at.tuwien.entities.auth.Realm; +import at.tuwien.entities.user.Realm; import at.tuwien.exception.RealmNotFoundException; public interface RealmService { diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java index e3471adb39..d8af9940ad 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java @@ -3,14 +3,13 @@ package at.tuwien.service; import at.tuwien.entities.user.UserAttribute; import at.tuwien.exception.UserAttributeNotFoundException; -import java.util.List; +import java.util.UUID; public interface UserAttributeService { - List<UserAttribute> findAll(String userId); - UserAttribute find(String userId, String name) throws UserAttributeNotFoundException; + UserAttribute find(UUID userId, String name) throws UserAttributeNotFoundException; - UserAttribute update(String userId, String name, String value) throws UserAttributeNotFoundException; + UserAttribute update(UUID userId, String name, String value) throws UserAttributeNotFoundException; UserAttribute create(UserAttribute userAttribute); } diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java index 4f64b63e02..c607aedaa7 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java @@ -4,13 +4,14 @@ import at.tuwien.api.auth.SignupRequestDto; import at.tuwien.api.user.UserPasswordDto; import at.tuwien.api.user.UserThemeSetDto; import at.tuwien.api.user.UserUpdateDto; -import at.tuwien.entities.auth.Realm; +import at.tuwien.entities.user.Realm; import at.tuwien.entities.user.Role; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import java.security.Principal; import java.util.List; +import java.util.UUID; public interface UserService { @@ -21,26 +22,16 @@ public interface UserService { */ List<User> findAll(); - /** - * Finds a user by username. - * - * @param username The username. - * @return The user. - * @throws UserNotFoundException The user was not found in the metadata database. - */ - User findByUsername(String username) throws UserNotFoundException; - - User findById(String id) throws UserNotFoundException; - User create(SignupRequestDto data, Realm realm, Role role) throws RemoteUnavailableException, UserNotFoundException, UserAlreadyExistsException; - User modify(String id, UserUpdateDto data, Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException; + User modify(UUID id, UserUpdateDto data, Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException; - User updatePassword(String id, UserPasswordDto data, Principal principal) throws UserNotFoundException, + User updatePassword(UUID id, UserPasswordDto data, Principal principal) throws UserNotFoundException, ForeignUserException; - User toggleTheme(String id, UserThemeSetDto data, Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException; + User toggleTheme(UUID id, UserThemeSetDto data, Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException; + - User find(String id) throws UserNotFoundException; + User find(UUID id) throws UserNotFoundException; } diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java index 6c971add7f..b499b6c43b 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java @@ -1,6 +1,6 @@ package at.tuwien.service.impl; -import at.tuwien.entities.auth.Realm; +import at.tuwien.entities.user.Realm; import at.tuwien.exception.RealmNotFoundException; import at.tuwien.repository.jpa.RealmRepository; import at.tuwien.service.RealmService; diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java index 6771f33a9c..14885f60f0 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; +import java.util.UUID; @Log4j2 @Service @@ -23,12 +24,7 @@ public class UserAttributeServiceImpl implements UserAttributeService { } @Override - public List<UserAttribute> findAll(String userId) { - return userAttributeRepository.findByUser(userId); - } - - @Override - public UserAttribute find(String userId, String name) throws UserAttributeNotFoundException { + public UserAttribute find(UUID userId, String name) throws UserAttributeNotFoundException { final Optional<UserAttribute> optional = userAttributeRepository.findByUserIdAndName(userId, name); if (optional.isEmpty()) { log.error("Failed to find user attribute with name {}", name); @@ -38,7 +34,7 @@ public class UserAttributeServiceImpl implements UserAttributeService { } @Override - public UserAttribute update(String userId, String name, String value) throws UserAttributeNotFoundException { + public UserAttribute update(UUID userId, String name, String value) throws UserAttributeNotFoundException { final UserAttribute entity = find(userId, name); entity.setValue(value); return userAttributeRepository.save(entity); diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java index 569eb90a4f..96fceaa61d 100644 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java @@ -4,13 +4,11 @@ import at.tuwien.api.auth.SignupRequestDto; import at.tuwien.api.user.UserPasswordDto; import at.tuwien.api.user.UserThemeSetDto; import at.tuwien.api.user.UserUpdateDto; -import at.tuwien.entities.auth.Realm; import at.tuwien.entities.user.*; import at.tuwien.exception.*; import at.tuwien.mapper.UserMapper; import at.tuwien.repository.jpa.CredentialRepository; import at.tuwien.repository.jpa.RoleMappingRepository; -import at.tuwien.repository.jpa.UserAttributeRepository; import at.tuwien.repository.jpa.UserRepository; import at.tuwien.service.UserAttributeService; import at.tuwien.service.UserService; @@ -30,6 +28,7 @@ import java.security.spec.KeySpec; import java.time.Instant; import java.util.List; import java.util.Optional; +import java.util.UUID; @Log4j2 @Service @@ -64,26 +63,6 @@ public class UserServiceImpl implements UserService { return userRepository.findAll(); } - @Override - public User findByUsername(String username) throws UserNotFoundException { - final Optional<User> optional = userRepository.findByUsername(username); - if (optional.isEmpty()) { - log.error("Failed to retrieve user with username {}", username); - throw new UserNotFoundException("Failed to retrieve user"); - } - return optional.get(); - } - - @Override - public User findById(String id) throws UserNotFoundException { - final Optional<User> optional = userRepository.findById(id); - if (optional.isEmpty()) { - log.error("Failed to retrieve user with id {}", id); - throw new UserNotFoundException("Failed to retrieve user"); - } - return optional.get(); - } - @Override public User create(SignupRequestDto data, Realm realm, Role role) throws RemoteUnavailableException, UserNotFoundException, UserAlreadyExistsException { @@ -141,10 +120,10 @@ public class UserServiceImpl implements UserService { } @Override - public User modify(String id, UserUpdateDto data, Principal principal) throws UserNotFoundException, + public User modify(UUID id, UserUpdateDto data, Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { /* check */ - User user = findById(id); + User user = find(id); if (!user.getUsername().equals(principal.getName())) { log.error("Failed to modify user: attempting to modify other user"); throw new ForeignUserException("Failed to modify user: attempting to modify other user"); @@ -161,10 +140,10 @@ public class UserServiceImpl implements UserService { } @Override - public User updatePassword(String id, UserPasswordDto data, Principal principal) throws UserNotFoundException, + public User updatePassword(UUID id, UserPasswordDto data, Principal principal) throws UserNotFoundException, ForeignUserException { /* check */ - final User user = findById(id); + final User user = find(id); if (!user.getUsername().equals(principal.getName())) { log.error("Failed to modify user: attempting to modify other user"); throw new ForeignUserException("Failed to modify user: attempting to modify other user"); @@ -191,10 +170,10 @@ public class UserServiceImpl implements UserService { } @Override - public User toggleTheme(String id, UserThemeSetDto data, Principal principal) throws UserNotFoundException, + public User toggleTheme(UUID id, UserThemeSetDto data, Principal principal) throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { /* check */ - final User user = findById(id); + final User user = find(id); if (!user.getUsername().equals(principal.getName())) { log.error("Failed to modify user: attempting to modify other user"); throw new ForeignUserException("Failed to modify user: attempting to modify other user"); @@ -205,7 +184,7 @@ public class UserServiceImpl implements UserService { } @Override - public User find(String id) throws UserNotFoundException { + public User find(UUID id) throws UserNotFoundException { final Optional<User> optional = userRepository.findById(id); if (optional.isEmpty()) { log.error("Failed to retrieve user with id {}", id); -- GitLab