Skip to content
Snippets Groups Projects
Unverified Commit aaaa32c8 authored by Martin Weise's avatar Martin Weise
Browse files

Fixed ElasticSearch

parent 6d5a6d70
No related branches found
No related tags found
2 merge requests!81New stable release,!80Multiple features connected with user management and ownership of databases
Showing
with 228 additions and 238 deletions
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;
......
......@@ -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());
}
}
......@@ -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("");
}
}
spring.profiles.active=test-noelastic
# disable discovery
spring.cloud.discovery.enabled = false
......
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();
}
}
......@@ -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()));
}
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;
}
}
......@@ -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)
......
......@@ -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;
......
......@@ -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)
......
......@@ -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")
......
......@@ -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)
......
......@@ -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({
......
......@@ -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",
......
......@@ -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)
......
......@@ -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({
......
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;
......
......@@ -223,10 +223,16 @@ export default {
console.debug('user data', res.data)
this.user = res.data
} catch (err) {
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
},
setTheme () {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment