diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java index 72decb4b524d3f3ebb7fd78449316b341a1db7f5..028a2326f6d74fa205e138ce828da4d0c225be88 100644 --- a/fda-database-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ b/fda-database-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java @@ -1,11 +1,18 @@ package at.tuwien; +import at.tuwien.api.database.DatabaseCreateDto; +import at.tuwien.api.database.DatabaseModifyDto; +import at.tuwien.api.database.LanguageTypeDto; +import at.tuwien.api.database.LicenseDto; import at.tuwien.entities.container.Container; import at.tuwien.entities.container.image.ContainerImage; import at.tuwien.entities.container.image.ContainerImageEnvironmentItem; import at.tuwien.entities.container.image.ContainerImageEnvironmentItemType; import at.tuwien.entities.database.Database; +import at.tuwien.entities.database.License; import at.tuwien.entities.database.table.Table; +import at.tuwien.entities.user.User; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.test.context.TestPropertySource; import java.time.Instant; @@ -22,7 +29,26 @@ public abstract class BaseUnitTest { public final static String BROKER_IMAGE = "rabbitmq"; public final static String BROKER_TAG = "3-alpine"; + public final static String SEARCH_NAME = "fda-search-mock-service"; + public final static String SEARCH_IP = "172.29.0.3"; + public final static String SEARCH_HOSTNAME = "fda-search-mock-service"; + public final static String SEARCH_IMAGE = "elasticsearch"; + public final static String SEARCH_TAG = "7.13.4"; + + public final static Long USER_1_ID = 1L; public final static String USER_1_USERNAME = "junit"; + public final static String USER_1_PASSWORD = "junit"; + public final static String USER_1_EMAIL = "junit@ossdip.at"; + public final static Boolean USER_1_VERIFIED = true; + public final static Boolean USER_1_THEME = false; + + public final static User USER_1 = User.builder() + .id(USER_1_ID) + .username(USER_1_USERNAME) + .email(USER_1_EMAIL) + .emailVerified(USER_1_VERIFIED) + .themeDark(USER_1_THEME) + .build(); public final static Long IMAGE_1_ID = 1L; public final static String IMAGE_1_REPOSITORY = "mariadb"; @@ -61,15 +87,50 @@ public abstract class BaseUnitTest { .value("mariadb") .build()); + public final static String LICENSE_1_IDENTIFIER = "MIT"; + public final static String LICENSE_1_URI = "https://opensource.org/licenses/MIT"; + + public final static License LICENSE_1 = License.builder() + .identifier(LICENSE_1_IDENTIFIER) + .uri(LICENSE_1_URI) + .build(); + + public final static LicenseDto LICENSE_1_DTO = LicenseDto.builder() + .identifier(LICENSE_1_IDENTIFIER) + .uri(LICENSE_1_URI) + .build(); + public final static Long DATABASE_1_ID = 1L; public final static String DATABASE_1_NAME = "Weather"; public final static String DATABASE_1_DESCRIPTION = "Weather somewhere in the world"; + public final static String DATABASE_1_PUBLISHER = "TU Wien"; public final static Boolean DATABASE_1_PUBLIC = false; public final static String DATABASE_1_INTERNALNAME = "weather"; public final static String DATABASE_1_EXCHANGE = "fda." + DATABASE_1_INTERNALNAME; public final static Instant DATABASE_1_CREATED = Instant.now().minus(1, HOURS); public final static Instant DATABASE_1_UPDATED = Instant.now(); + public final static DatabaseCreateDto DATABASE_1_CREATE = DatabaseCreateDto.builder() + .name(DATABASE_1_NAME) + .isPublic(DATABASE_1_PUBLIC) + .description(DATABASE_1_DESCRIPTION) + .build(); + + public final static DatabaseModifyDto DATABASE_1_UPDATE1 = DatabaseModifyDto.builder() + .isPublic(DATABASE_1_PUBLIC) + .description(DATABASE_1_DESCRIPTION) + .language(LanguageTypeDto.EN) + .build(); + + public final static DatabaseModifyDto DATABASE_1_UPDATE2 = DatabaseModifyDto.builder() + .isPublic(DATABASE_1_PUBLIC) + .description(DATABASE_1_DESCRIPTION) + .language(LanguageTypeDto.EN) + .license(LICENSE_1_DTO) + .publication("2022-08-01") + .publisher(DATABASE_1_PUBLISHER) + .build(); + public final static Long DATABASE_2_ID = 2L; public final static String DATABASE_2_NAME = "Weather AT"; public final static Boolean DATABASE_2_PUBLIC = false; diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java b/fda-database-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java index 24b6552decfef3ba6b4e7b4ef784fdff1f36b72c..5f06edcf8b7df9ce02bef91462a96a4fc3feb368 100644 --- a/fda-database-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java +++ b/fda-database-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java @@ -35,7 +35,7 @@ public class DockerConfig { .withDockerHttpClient(dockerHttpClient) .build(); - public static void startContainer(Container container) throws InterruptedException { + public static void startContainer(Container container, Integer seconds) throws InterruptedException { final InspectContainerResponse inspect = dockerClient.inspectContainerCmd(container.getHash()) .exec(); log.trace("container {} state {}", container.getHash(), inspect.getState().getStatus()); @@ -45,10 +45,14 @@ public class DockerConfig { log.trace("container {} needs to be started", container.getHash()); dockerClient.startContainerCmd(container.getHash()) .exec(); - Thread.sleep(12 * 1000L); + Thread.sleep(seconds * 1000L); log.debug("container {} was started", container.getHash()); } + public static void startContainer(Container container) throws InterruptedException { + startContainer(container, 15); + } + public static void createContainer(Container container) { final CreateContainerResponse response = dockerClient.createContainerCmd(container.getImage().getRepository() + ":" + container.getImage().getTag()) .withHostConfig(hostConfig.withNetworkMode("fda-userdb")) @@ -73,4 +77,14 @@ public class DockerConfig { log.debug("container {} was stopped", container.getHash()); } + public static void removeContainer(Container container) { + final InspectContainerResponse inspect = dockerClient.inspectContainerCmd(container.getHash()) + .exec(); + log.trace("container {} state {}", container.getHash(), inspect.getState().getStatus()); + log.trace("container {} needs to be removed", container.getHash()); + dockerClient.removeContainerCmd(container.getHash()) + .exec(); + log.debug("container {} was removed", container.getHash()); + } + } diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index 5aba295e74ec5eab859e4a99b26ff9061d871b85..92867bd77b71ca49651213c39de5fdf087ebef46 100644 --- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -8,13 +8,14 @@ import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; import at.tuwien.exception.*; import at.tuwien.repository.elastic.DatabaseidxRepository; -import at.tuwien.repository.jpa.ContainerRepository; -import at.tuwien.repository.jpa.DatabaseRepository; -import at.tuwien.repository.jpa.ImageRepository; +import at.tuwien.repository.jpa.*; import at.tuwien.service.impl.HibernateConnector; import at.tuwien.service.impl.MariaDbServiceImpl; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.exception.NotModifiedException; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Network; import com.rabbitmq.client.Channel; import lombok.extern.log4j.Log4j2; @@ -24,6 +25,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import java.security.Principal; import java.util.Optional; -import static at.tuwien.config.DockerConfig.dockerClient; -import static at.tuwien.config.DockerConfig.hostConfig; +import static at.tuwien.config.DockerConfig.*; import static org.junit.jupiter.api.Assertions.*; @Log4j2 @@ -47,25 +48,28 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { @MockBean private Channel channel; - @MockBean - private DatabaseidxRepository databaseidxRepository; - @Autowired private ImageRepository imageRepository; @Autowired - private DatabaseRepository databaseRepository; + private MariaDbServiceImpl databaseService; @Autowired - private ContainerRepository containerRepository; + private UserRepository userRepository; @Autowired - private MariaDbServiceImpl databaseService; + private LicenseRepository licenseRepository; + + @Autowired + private ContainerRepository containerRepository; @Autowired - private HibernateConnector hibernateConnector; + private PasswordEncoder passwordEncoder; - private static Container CONTAINER_BROKER; + private static final Container CONTAINER_SEARCH = Container.builder() + .name(SEARCH_NAME) + .internalName(SEARCH_NAME) + .build(); @BeforeAll public static void beforeAll() throws InterruptedException { @@ -86,46 +90,47 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { .withEnableIpv6(false) .exec(); - /* create amqp */ - final CreateContainerResponse broker = dockerClient.createContainerCmd(BROKER_IMAGE + ":" + BROKER_TAG) + /* create elastic search */ + final CreateContainerResponse search = dockerClient.createContainerCmd(SEARCH_IMAGE + ":" + SEARCH_TAG) .withHostConfig(hostConfig.withNetworkMode("fda-public")) - .withName(BROKER_NAME) - .withIpv4Address(BROKER_IP) - .withHostName(BROKER_HOSTNAME) + .withName(SEARCH_NAME) + .withIpv4Address(SEARCH_IP) + .withHostName(SEARCH_HOSTNAME) + .withHostConfig(new HostConfig() + .withPortBindings()) + .withEnv("discovery.type=single-node", "ES_JAVA_OPTS=-Xms512m -Xmx512m", "logger.level=WARN") .exec(); + CONTAINER_SEARCH.setHash(search.getId()); + /* start elastic search */ + startContainer(CONTAINER_SEARCH, 30); + } - /* create mariadb */ - final CreateContainerResponse container1 = dockerClient.createContainerCmd(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG) - .withEnv(IMAGE_1_ENV) + @Transactional + @BeforeEach + public void beforeEach() throws InterruptedException { + /* create fda-userdb-u01 */ + final CreateContainerResponse response1 = dockerClient.createContainerCmd(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG) .withHostConfig(hostConfig.withNetworkMode("fda-userdb")) .withName(CONTAINER_1_NAME) .withIpv4Address(CONTAINER_1_IP) .withHostName(CONTAINER_1_INTERNALNAME) + .withEnv("MARIADB_ROOT_PASSWORD=mariadb", "MARIADB_USER=mariadb", "MARIADB_PASSWORD=mariadb") .exec(); - final CreateContainerResponse container2 = dockerClient.createContainerCmd(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG) - .withEnv(IMAGE_2_ENV) - .withHostConfig(hostConfig.withNetworkMode("fda-userdb")) - .withName(CONTAINER_2_NAME) - .withIpv4Address(CONTAINER_2_IP) - .withHostName(CONTAINER_2_INTERNALNAME) - .exec(); - - /* start container */ - CONTAINER_1.setHash(container1.getId()); - CONTAINER_2.setHash(container2.getId()); - CONTAINER_BROKER = Container.builder() - .hash(broker.getId()) - .build(); + CONTAINER_1.setHash(response1.getId()); + /* start fda-userdb-u01 */ + startContainer(CONTAINER_1); + /* metadata db */ + licenseRepository.save(LICENSE_1); + containerRepository.save(CONTAINER_1); + USER_1.setPassword(passwordEncoder.encode(USER_1_PASSWORD)); + userRepository.save(USER_1); + imageRepository.save(IMAGE_1); } - @Transactional - @BeforeEach - public void beforeEach() { - imageRepository.save(IMAGE_1); - DATABASE_1.setContainer(CONTAINER_1); - DATABASE_2.setContainer(CONTAINER_2); - databaseRepository.save(DATABASE_1); - databaseRepository.save(DATABASE_2); + @AfterEach + public void afterEach() { + stopContainer(CONTAINER_1); + removeContainer(CONTAINER_1); } @AfterAll @@ -155,161 +160,46 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { }); } -// @Transactional -// @Test -// public void create_succeeds() throws ImageNotSupportedException, ContainerNotFoundException, -// DatabaseMalformedException, AmqpException, ContainerConnectionException, InterruptedException, -// UserNotFoundException { -// final DatabaseCreateDto request = DatabaseCreateDto.builder() -// .name(DATABASE_1_NAME) -// .isPublic(DATABASE_1_PUBLIC) -// .build(); -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.startContainer(CONTAINER_1); -// -// /* test */ -// final Database response = databaseService.create(CONTAINER_1_ID, request, principal); -// assertEquals(DATABASE_1_NAME, response.getName()); -// assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); -// assertEquals(CONTAINER_1_ID, response.getContainer().getId()); -// } -// -// @Test -// public void create_notFound_fails() throws InterruptedException { -// final DatabaseCreateDto request = DatabaseCreateDto.builder() -// .name(DATABASE_1_NAME) -// .isPublic(DATABASE_1_PUBLIC) -// .build(); -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.startContainer(CONTAINER_1); -// -// /* test */ -// assertThrows(ContainerNotFoundException.class, () -> { -// databaseService.create(9999L, request, principal); -// }); -// } -// -// @Test -// public void create_duplicate_fails() throws InterruptedException { -// final DatabaseCreateDto request = DatabaseCreateDto.builder() -// .name(DATABASE_1_NAME) -// .isPublic(DATABASE_1_PUBLIC) -// .build(); -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.startContainer(CONTAINER_1); -// -// /* test */ -// assertThrows(DatabaseMalformedException.class, () -> { -// databaseService.create(CONTAINER_1_ID, request, principal); -// }); -// } -// -// @Test -// public void create_notRunning_fails() throws InterruptedException { -// final DatabaseCreateDto request = DatabaseCreateDto.builder() -// .name(DATABASE_1_NAME) -// .isPublic(DATABASE_1_PUBLIC) -// .build(); -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.stopContainer(CONTAINER_1); -// -// /* test */ -// assertThrows(ContainerConnectionException.class, () -> { -// databaseService.create(CONTAINER_1_ID, request, principal); -// }); -// } -// -// @Test -// public void delete_succeeds() throws DatabaseNotFoundException, ImageNotSupportedException, -// DatabaseMalformedException, AmqpException, InterruptedException, ContainerConnectionException { -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.startContainer(CONTAINER_2); -// -// /* test */ -// databaseService.delete(CONTAINER_2_ID, DATABASE_2_ID, principal); -// final Optional<Database> response = databaseRepository.findById(DATABASE_2_ID); -// assertTrue(response.isEmpty()); -// } -// -// @Test -// public void delete_notFound_fails() throws InterruptedException { -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// -// /* test */ -// assertThrows(DatabaseNotFoundException.class, () -> { -// databaseService.delete(CONTAINER_1_ID, 9999L, principal); -// }); -// } -// -// @Test -// public void delete_notRunning_fails() throws InterruptedException { -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.stopContainer(CONTAINER_1); -// -// /* test */ -// assertThrows(ContainerConnectionException.class, () -> { -// databaseService.delete(CONTAINER_1_ID, DATABASE_1_ID, principal); -// }); -// } -// -// @Test -// public void modify_notFound_fails() { -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* test */ -// assertThrows(DatabaseNotFoundException.class, () -> { -// databaseService.delete(CONTAINER_1_ID, 9999L, principal); -// }); -// } -// -// @Test -// public void find_succeeds() throws DatabaseNotFoundException, InterruptedException { -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.startContainer(CONTAINER_1); -// -// /* test */ -// final Database response = databaseService.findById(CONTAINER_1_ID, DATABASE_1_ID, principal); -// assertEquals(DATABASE_1_ID, response.getId()); -// assertEquals(DATABASE_1_NAME, response.getName()); -// assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); -// } -// -// @Test -// public void find_notFound_fails() throws InterruptedException { -// final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); -// -// /* mock */ -// DockerConfig.startContainer(CONTAINER_BROKER); -// DockerConfig.startContainer(CONTAINER_1); -// -// /* test */ -// assertThrows(DatabaseNotFoundException.class, () -> { -// databaseService.findById(CONTAINER_1_ID, 9999L, principal); -// }); -// } + @Test + public void create_succeeds() throws UserNotFoundException, DatabaseNameExistsException, + DatabaseConnectionException, QueryMalformedException, ImageNotSupportedException, AmqpException, + ContainerNotFoundException, ContainerConnectionException, DatabaseMalformedException { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + databaseService.create(CONTAINER_1_ID, DATABASE_1_CREATE, principal); + } + + @Test + public void update_succeeds() throws UserNotFoundException, DatabaseNameExistsException, + DatabaseConnectionException, QueryMalformedException, ImageNotSupportedException, AmqpException, + ContainerNotFoundException, ContainerConnectionException, DatabaseMalformedException, + LicenseNotFoundException, DatabaseNotFoundException { + + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* mock */ + databaseService.create(CONTAINER_1_ID, DATABASE_1_CREATE, principal); + + /* test */ + databaseService.modify(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1_UPDATE1); + } + + @Test + public void update_license_succeeds() throws UserNotFoundException, DatabaseNameExistsException, + DatabaseConnectionException, QueryMalformedException, ImageNotSupportedException, AmqpException, + ContainerNotFoundException, ContainerConnectionException, DatabaseMalformedException, + LicenseNotFoundException, DatabaseNotFoundException { + + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* mock */ + databaseService.create(CONTAINER_1_ID, DATABASE_1_CREATE, principal); + + /* test */ + databaseService.modify(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1_UPDATE1); + databaseService.modify(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1_UPDATE2); + log.trace(""); + } } diff --git a/fda-database-service/rest-service/src/test/resources/application.properties b/fda-database-service/rest-service/src/test/resources/application.properties index c62372cb85f685babd35737f4b0e26aa8d7a1dcc..7676dffdf898557eec4630f71def8b976a3779c4 100644 --- a/fda-database-service/rest-service/src/test/resources/application.properties +++ b/fda-database-service/rest-service/src/test/resources/application.properties @@ -1,5 +1,3 @@ -spring.profiles.active=test-noelastic - # disable discovery spring.cloud.discovery.enabled = false diff --git a/fda-database-service/services/src/main/java/at/tuwien/config/SecurityConfig.java b/fda-database-service/services/src/main/java/at/tuwien/config/SecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..03be90470ff1e54aef7a608f89490f45b9736f17 --- /dev/null +++ b/fda-database-service/services/src/main/java/at/tuwien/config/SecurityConfig.java @@ -0,0 +1,16 @@ +package at.tuwien.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class SecurityConfig { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/fda-database-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java b/fda-database-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java index d0a8ffabbc84c3ff9bc2807cace12da272f3f84d..bcf28c23b44a07dabcfd299e16f5728f4a529066 100644 --- a/fda-database-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java +++ b/fda-database-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java @@ -130,6 +130,10 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe databaseRepository.deleteById(databaseId); log.info("Deleted database with id {}", databaseId); log.debug("deleted database {}", database); + // delete in database_index - elastic search + databaseidxRepository.delete(database); + log.info("Deleted database in elastic search with id {}", databaseId); + log.debug("deleted database in elastic search {}", database); } @Override @@ -158,9 +162,9 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe final PreparedStatement preparedStatement1 = databaseMapper.imageToRawGrantReadonlyAccessQuery(connection); preparedStatement1.executeUpdate(); } catch (SQLException e) { - log.error("Failed to delete database"); - log.debug("failed to delete database {}, reason: {}", database, e.getMessage()); - throw new DatabaseMalformedException("Failed to execute and map time-versioned query", e); + log.error("Failed to create database"); + log.debug("failed to create database {}, reason: {}", database, e.getMessage()); + throw new DatabaseMalformedException("Failed to execute query", e); } finally { dataSource.close(); } @@ -170,12 +174,14 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe database.setIsPublic(createDto.getIsPublic()); final User creator = userService.findByUsername(principal.getName()); database.setCreator(creator); - final Database out = databaseRepository.save(database); - log.info("Created database with id {}", out.getId()); - log.debug("created database {}", out); + final Database dbdb = databaseRepository.save(database); + log.info("Created database with id {}", dbdb.getId()); + log.debug("created database {}", dbdb); // save in database_index - elastic search -// databaseidxRepository.save(database); - return out; + final Database edb = databaseidxRepository.save(database); + log.info("Saved database in elastic search with id {}", edb.getId()); + log.debug("saved database in elastic search {}", edb); + return dbdb; } @Override @@ -186,20 +192,27 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe if (modifyDto.getContactPerson() != null) { database.setContact(userService.findByUsername(modifyDto.getContactPerson())); } - final License license = licenseService.find(modifyDto.getLicense().getIdentifier()); + if (modifyDto.getLicense() != null) { + final License license = licenseService.find(modifyDto.getLicense().getIdentifier()); + log.info("Found license with identifier {}", modifyDto.getLicense().getIdentifier()); + log.debug("found license {}", license); + database.setLicense(license); + } database.setIsPublic(modifyDto.getIsPublic()); database.setDescription(modifyDto.getDescription()); database.setPublisher(modifyDto.getPublisher()); database.setPublication(modifyDto.getPublication()); database.setLanguage(databaseMapper.languageTypeDtoToLanguageType(modifyDto.getLanguage())); - database.setLicense(license); - final Database out = databaseRepository.save(database); + + final Database dbdb = databaseRepository.save(database); /* update entity in metadata database */ - log.info("Updated database with id {}", out.getId()); - log.debug("updated database {}", out); + log.info("Updated database with id {}", dbdb.getId()); + log.debug("updated database {}", dbdb); // save in database_index - elastic search -// databaseidxRepository.save(database); - return out; + final Database edb = databaseidxRepository.save(database); + log.info("Updated database in elastic search with id {}", edb.getId()); + log.debug("updated database in elastic search {}", edb); + return dbdb; } } diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/Container.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/Container.java index 3eaeab9814cbb17c46ec5f49413c3d7955dfa40c..b19146c73198e458bfb3ed9fa0cd1db0e16aef8a 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/Container.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/Container.java @@ -57,6 +57,7 @@ public class Container { @Column private Integer port; + @org.springframework.data.annotation.Transient @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false) diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java index 074e85b93deb629da3319d7fbc5efb58f2b61672..7fc86a733a46b644b11dae20ed8fe573e4a195d8 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java @@ -72,6 +72,7 @@ public class ContainerImage { @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "image") private List<ContainerImageDate> dateFormats; + @org.springframework.data.annotation.Transient @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, mappedBy = "image") private List<Container> containers; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java index 291dfba76472f352c966b655c21ac2c4b89b3500..48a8d47a4b3e23756fdf49ae3160bc0b45d16aba 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java @@ -34,6 +34,7 @@ public class ContainerImageDate { @Column(name = "iid") private Long iid; + @org.springframework.data.annotation.Transient @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumn(name = "iid", insertable = false, updatable = false) diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/Database.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/Database.java index eb2762de3534dd5baed3b1ee376ae28e95becf49..e14ed74682e8cd73824ee343d5970ce2e8c096b9 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -10,8 +10,6 @@ import org.hibernate.annotations.Where; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; @@ -33,7 +31,6 @@ import java.util.List; }) public class Database { - @Field(type = FieldType.Integer) @Id @EqualsAndHashCode.Include @GeneratedValue(generator = "database-sequence") @@ -44,14 +41,12 @@ public class Database { ) private Long id; - @Field(index = false) @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumns({ @JoinColumn(name = "Creator", referencedColumnName = "UserID") }) private User creator; - @Field(index = false) @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumns({ @@ -59,61 +54,49 @@ public class Database { }) private Container container; - @Field(type = FieldType.Text) @Column(nullable = false) private String name; - @Field(index = false) @ElementCollection @CollectionTable(name = "mdb_databases_subjects", joinColumns = { @JoinColumn(name = "dbid", referencedColumnName = "id") }) private List<String> subjects; - @Field(type = FieldType.Text) @Column(nullable = false) private String internalName; - @Field(type = FieldType.Text) @Column(nullable = false) private String exchange; - @Field(type = FieldType.Text) @Column private String description; - @Field(type = FieldType.Text) @Column private String publisher; - @Field(type = FieldType.Text) @Column private String publication; - @Field(index = false) @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "contactperson", referencedColumnName = "UserID", insertable = false, updatable = false) }) private User contact; - @Field(index = false) @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumns({ @JoinColumn(name = "tdbid", referencedColumnName = "id", insertable = false, updatable = false) }) private List<Table> tables; - @Field(type = FieldType.Boolean) @Column(nullable = false) private Boolean isPublic; - @Field(index = false) @Column(columnDefinition = "enum('EN', 'DE', 'OTHER')") @Enumerated(EnumType.STRING) private LanguageType language; - @Field(index = false) @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumns({ @JoinColumn(name = "License", referencedColumnName = "identifier") diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 0f4d7fc31f6c456cbd7425362d6230c5c45569ad..e1bccd77dd8780b48210c3aefd4e636fa3590a79 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -66,6 +66,7 @@ public class Table { @Column(name = "tdescription") private String description; + @org.springframework.data.annotation.Transient @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumn(name = "tdbid", insertable = false, updatable = false) diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java index 24addcc85b0d5943e7696529baf88cde84898515..ead88b6854c5955496c3f3b67f296d7e8f4a60b0 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java @@ -60,6 +60,7 @@ public class TableColumn implements Comparable<TableColumn> { @JoinColumn(name = "dfid", referencedColumnName = "id", insertable = false, updatable = false) private ContainerImageDate dateFormat; + @org.springframework.data.annotation.Transient @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java index e77679a8d1069880edab878d53b79a8a1174666f..733b2c6b146340798d87381f979cc8e433c715b5 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java @@ -27,6 +27,7 @@ public class Concept { @Column(name = "name", nullable = false) private String name; + @org.springframework.data.annotation.Transient @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinTable(name = "mdb_columns_concepts", diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Creator.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Creator.java index bb1ff1819109bcb24f9976b8d8c75ef9b2a57688..16f1a6385885b7978c1154ffab1436c05a1c1d08 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Creator.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Creator.java @@ -45,6 +45,7 @@ public class Creator { @Column private String orcid; + @org.springframework.data.annotation.Transient @ToString.Exclude @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "pid", referencedColumnName = "id", insertable = false, updatable = false) diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/Token.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/Token.java index 4c596a3aa67b5692c9c0ae753c03e3753b1b118e..55c5b25aadc4ffc82c43b1b1f08344cc4f6385a3 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/Token.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/Token.java @@ -42,6 +42,7 @@ public class Token { @Column(nullable = false) private Boolean processed; + @org.springframework.data.annotation.Transient @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumns({ diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java index 3dab1dcf848da3d5b51f9a2d163285318d682e84..ed8e20acddbe5d9b7129c35840afddac493dd2d5 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/User.java @@ -1,6 +1,7 @@ package at.tuwien.entities.user; import lombok.*; +import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; diff --git a/fda-ui/layouts/default.vue b/fda-ui/layouts/default.vue index 132f3ead0c48c307d6a029fe67fabcd2809bae20..9f186cbe423dd59ab2c484ec05938ce3463060c9 100644 --- a/fda-ui/layouts/default.vue +++ b/fda-ui/layouts/default.vue @@ -223,9 +223,15 @@ export default { console.debug('user data', res.data) this.user = res.data } catch (err) { - console.error('user data', err) - this.$toast.error('Failed to load user') - this.error = true + const { status } = err.response + if (status === 401) { + console.error('Token expired', err) + this.logout() + } else { + console.error('user data', err) + this.$toast.error('Failed to load user') + this.error = true + } } this.loadingUser = false },