From f66a70f32684bf30b4dc4b2b69f51e23cc30b342 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Mon, 28 Nov 2022 20:02:06 +0100
Subject: [PATCH] Added 1:1 relationship

---
 .../tuwien/auth/PermissionEvaluatorImpl.java  |  2 +-
 .../at/tuwien/mapper/ContainerMapper.java     |  2 +-
 .../at/tuwien/mapper/ContainerMapper.java     |  2 +-
 .../service/impl/MariaDbServiceImpl.java      |  2 +-
 .../at/tuwien/api/container/ContainerDto.java |  4 ++--
 .../tuwien/entities/container/Container.java  | 10 ++++++---
 .../container/image/ContainerImage.java       |  2 +-
 .../container/image/ContainerImageDate.java   |  2 +-
 .../image/ContainerImageEnvironmentItem.java  |  2 +-
 .../at/tuwien/entities/database/Database.java |  5 +++--
 .../at/tuwien/entities/database/View.java     |  2 +-
 .../tuwien/entities/database/table/Table.java |  3 +--
 .../database/table/columns/TableColumn.java   |  2 +-
 .../table/columns/concepts/Concept.java       |  2 +-
 .../tuwien/entities/identifier/Creator.java   |  2 +-
 .../at/tuwien/entities/user/TimeSecret.java   |  2 +-
 .../service/TableServiceIntegrationTest.java  | 22 +++++++++++--------
 .../jpa/ImageEnvironmentRepository.java       | 11 ++++++++++
 18 files changed, 49 insertions(+), 30 deletions(-)
 create mode 100644 fda-table-service/services/src/main/java/at/tuwien/repository/jpa/ImageEnvironmentRepository.java

diff --git a/fda-container-service/services/src/main/java/at/tuwien/auth/PermissionEvaluatorImpl.java b/fda-container-service/services/src/main/java/at/tuwien/auth/PermissionEvaluatorImpl.java
index 0bfbb375cf..987774756e 100644
--- a/fda-container-service/services/src/main/java/at/tuwien/auth/PermissionEvaluatorImpl.java
+++ b/fda-container-service/services/src/main/java/at/tuwien/auth/PermissionEvaluatorImpl.java
@@ -56,7 +56,7 @@ public class PermissionEvaluatorImpl implements PermissionEvaluator {
                     log.error("Failed to grant permission {}", permission);
                     log.debug("failed to grant permission {}, owner is not the current user", permission);
                     return false;
-                } else if (container.getDatabases().size() > 0) {
+                } else if (container.getDatabase() != null) {
                     log.error("Failed to grant permission {}", permission);
                     log.debug("failed to grant permission {}, databases present in the container", permission);
                     return false;
diff --git a/fda-container-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java b/fda-container-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java
index 6c3992111d..57104de012 100644
--- a/fda-container-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java
+++ b/fda-container-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java
@@ -38,7 +38,7 @@ public interface ContainerMapper {
             @Mapping(source = "state", target = "state", qualifiedByName = "containerStateDto"),
             @Mapping(source = "id", target = "hash"),
             @Mapping(target = "id", ignore = true),
-            @Mapping(target = "databases", ignore = true),
+            @Mapping(target = "database", ignore = true),
     })
     ContainerDto inspectContainerResponseToContainerDto(InspectContainerResponse data);
 
diff --git a/fda-database-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java b/fda-database-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java
index d48096e7d0..b425a856b7 100644
--- a/fda-database-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java
+++ b/fda-database-service/services/src/main/java/at/tuwien/mapper/ContainerMapper.java
@@ -11,7 +11,7 @@ public interface ContainerMapper {
 
     @Mappings({
             @Mapping(target = "id", source = "id"),
-            @Mapping(target = "databases", source = "databases", ignore = true),
+            @Mapping(target = "database", source = "database", ignore = true),
     })
     ContainerDto containerToContainerDto(Container data);
 
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 2bf9fc672e..901fd7c3a6 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
@@ -124,7 +124,7 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
             DatabaseMalformedException, AmqpException, ContainerConnectionException, UserNotFoundException,
             DatabaseNameExistsException, DatabaseConnectionException, QueryMalformedException {
         final Container container = containerService.find(containerId);
-        if (container.getDatabases().size() != 0) {
+        if (container.getDatabase() != null) {
             log.error("Currently we only support one database per container.");
             throw new DatabaseMalformedException("Currently only one database per container is supported");
         }
diff --git a/fda-metadata-db/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/fda-metadata-db/api/src/main/java/at/tuwien/api/container/ContainerDto.java
index fef1d04e42..cf9b72db85 100644
--- a/fda-metadata-db/api/src/main/java/at/tuwien/api/container/ContainerDto.java
+++ b/fda-metadata-db/api/src/main/java/at/tuwien/api/container/ContainerDto.java
@@ -42,9 +42,9 @@ public class ContainerDto {
     @Schema(example = "running")
     private ContainerStateDto state;
 
-    @ToString.Exclude
     @Schema
-    private List<DatabaseDto> databases;
+    @ToString.Exclude
+    private DatabaseDto database;
 
     @JsonProperty("ip_address")
     private String ipAddress;
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 639213fb30..22894af699 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
@@ -53,15 +53,19 @@ public class Container {
     @Column
     private Integer port;
 
+    @ToString.Exclude
     @org.springframework.data.annotation.Transient
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)
     })
-    private List<Database> databases;
+    private Database database;
 
     @org.springframework.data.annotation.Transient
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumns({
+            @JoinColumn(name = "image_id", referencedColumnName = "id", insertable = false, updatable = false)
+    })
     private ContainerImage image;
 
     @Column
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 084966a15e..3253c44e85 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
@@ -64,7 +64,7 @@ public class ContainerImage {
 
     @ToString.Exclude
     @org.springframework.data.annotation.Transient
-    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE}, mappedBy = "image")
+    @OneToMany(fetch = FetchType.LAZY, mappedBy = "image")
     private List<Container> containers;
 
     @Column(nullable = false, updatable = false)
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 94079ae737..bf2608fa41 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
@@ -30,7 +30,7 @@ public class ContainerImageDate {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "iid", insertable = false, updatable = false)
     private ContainerImage image;
 
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java
index 3bc8bf68aa..8aa33c9c62 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java
@@ -42,7 +42,7 @@ public class ContainerImageEnvironmentItem {
 
     @ToString.Exclude
     @org.springframework.data.annotation.Transient
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "iid", referencedColumnName = "id", 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 2bd23359fe..3e6ad2ba8b 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
@@ -42,9 +42,9 @@ public class Database {
     })
     private User creator;
 
-    @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @org.springframework.data.annotation.Transient
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)
     })
@@ -68,6 +68,7 @@ public class Database {
     })
     private User contact;
 
+    @org.springframework.data.annotation.Transient
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "tdbid", referencedColumnName = "id", insertable = false, updatable = false)
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java
index 8355800a85..4dfc6e4df9 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java
@@ -42,7 +42,7 @@ public class View {
     private User creator;
 
     @org.springframework.data.annotation.Transient
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "vdbid", insertable = false, updatable = false)
     private Database database;
 
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 c2622873d5..65ec9e82e4 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
@@ -58,8 +58,7 @@ public class Table {
     private String description;
 
     @org.springframework.data.annotation.Transient
-    @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "tdbid", insertable = false, updatable = false)
     private Database database;
 
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 d88409c754..91c0f05df0 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
@@ -54,7 +54,7 @@ public class TableColumn implements Comparable<TableColumn> {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "tid", referencedColumnName = "id", insertable = false, updatable = false),
             @JoinColumn(name = "cdbid", referencedColumnName = "tdbid", insertable = false, updatable = false)
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 d60ae1e378..9d1777496c 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
@@ -35,7 +35,7 @@ public class Concept {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToMany(fetch = FetchType.LAZY)
     @JoinTable(name = "mdb_columns_concepts",
             joinColumns = @JoinColumn(name = "concept_id", referencedColumnName = "id", insertable = false, updatable = false),
             inverseJoinColumns = {
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 2458b10c1a..6fea41a426 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
@@ -42,7 +42,7 @@ public class Creator {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "pid", referencedColumnName = "id", insertable = false, updatable = false)
     private Identifier identifier;
 
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/TimeSecret.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/TimeSecret.java
index e9d00759a1..dab6e3c3a4 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/TimeSecret.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/user/TimeSecret.java
@@ -39,7 +39,7 @@ public class TimeSecret {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "uid", referencedColumnName = "userid", insertable = false, updatable = false)
     })
diff --git a/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
index abbc84317d..7157c6f436 100644
--- a/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
+++ b/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
@@ -4,6 +4,8 @@ import at.tuwien.BaseUnitTest;
 import at.tuwien.config.DockerConfig;
 import at.tuwien.config.IndexInitializer;
 import at.tuwien.config.ReadyConfig;
+import at.tuwien.entities.container.Container;
+import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.exception.*;
 import at.tuwien.repository.jpa.*;
@@ -22,10 +24,12 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import javax.transaction.Transactional;
 import java.io.File;
 import java.security.Principal;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static at.tuwien.config.DockerConfig.dockerClient;
 import static at.tuwien.config.DockerConfig.hostConfig;
@@ -64,6 +68,9 @@ public class TableServiceIntegrationTest extends BaseUnitTest {
     @Autowired
     private UserRepository userRepository;
 
+    @Autowired
+    private ImageEnvironmentRepository imageEnvironmentRepository;
+
     @BeforeAll
     public static void beforeAll() throws InterruptedException {
         afterAll();
@@ -127,15 +134,12 @@ public class TableServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        userRepository.save(USER_1);
-        userRepository.save(USER_2);
-        imageRepository.save(IMAGE_1);
-        containerRepository.save(CONTAINER_1);
-        containerRepository.save(CONTAINER_2);
-        databaseRepository.save(DATABASE_1) /* public */;
-        databaseRepository.save(DATABASE_2) /* private */;
-        tableRepository.save(TABLE_1);
-        tableRepository.save(TABLE_2);
+        CONTAINER_1.setDatabase(DATABASE_1);
+        CONTAINER_2.setDatabase(DATABASE_2);
+        TABLE_1.setDatabase(DATABASE_1);
+        TABLE_2.setDatabase(DATABASE_2);
+        tableRepository.save(TABLE_1) /* public */;
+        tableRepository.save(TABLE_2) /* private */;
     }
 
     @Test
diff --git a/fda-table-service/services/src/main/java/at/tuwien/repository/jpa/ImageEnvironmentRepository.java b/fda-table-service/services/src/main/java/at/tuwien/repository/jpa/ImageEnvironmentRepository.java
new file mode 100644
index 0000000000..c25e8577e2
--- /dev/null
+++ b/fda-table-service/services/src/main/java/at/tuwien/repository/jpa/ImageEnvironmentRepository.java
@@ -0,0 +1,11 @@
+package at.tuwien.repository.jpa;
+
+import at.tuwien.entities.container.image.ContainerImage;
+import at.tuwien.entities.container.image.ContainerImageEnvironmentItem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ImageEnvironmentRepository extends JpaRepository<ContainerImageEnvironmentItem, Long> {
+
+}
-- 
GitLab