From 229998c699ad8d01e63a246315c456518340cc04 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Mon, 27 Jan 2025 20:53:37 +0100
Subject: [PATCH] WIP

Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at>
---
 .docker/docker-compose.yml                    |  45 +++++++++++++
 .gitlab-ci.yml                                |  42 ++++++++++++
 dbrepo-analyse-service/Pipfile.lock           |   8 +++
 .../target/create-event-listener.jar          | Bin 0 -> 10015 bytes
 dbrepo-data-service/Dockerfile                |   8 ++-
 dbrepo-data-service/pom.xml                   |   1 +
 dbrepo-metadata-service/Dockerfile            |  12 ++--
 .../at/tuwien/api/container/ContainerDto.java |   4 ++
 .../at/tuwien/api/database/DatabaseDto.java   |  10 +++
 .../java/at/tuwien/api/database/ViewDto.java  |  10 +++
 .../tuwien/api/database/table/TableDto.java   |  10 +++
 .../main/java/at/tuwien/api/user/UserDto.java |   4 ++
 .../tuwien/entities/container/Container.java  |   3 -
 .../container/image/ContainerImage.java       |   2 -
 .../entities/container/image/DataType.java    |   1 -
 .../entities/container/image/Operator.java    |   1 -
 .../at/tuwien/entities/database/Database.java |   2 -
 .../entities/database/DatabaseAccess.java     |   2 -
 .../at/tuwien/entities/database/View.java     |   3 -
 .../tuwien/entities/database/ViewColumn.java  |   1 -
 .../tuwien/entities/database/table/Table.java |   5 +-
 .../database/table/columns/TableColumn.java   |   3 -
 .../table/columns/TableColumnConcept.java     |   1 -
 .../table/columns/TableColumnUnit.java        |   1 -
 .../constraints/foreignKey/ForeignKey.java    |   2 -
 .../foreignKey/ForeignKeyReference.java       |   1 -
 .../constraints/primaryKey/PrimaryKey.java    |   2 -
 .../table/constraints/unique/Unique.java      |   2 -
 .../entities/identifier/Identifier.java       |   3 -
 .../tuwien/entities/semantics/Ontology.java   |   2 -
 .../java/at/tuwien/entities/user/User.java    |   1 -
 dbrepo-metadata-service/pom.xml               |   5 ++
 .../SearchServiceConnectionException.java     |   2 +-
 .../exception/SearchServiceException.java     |   2 +-
 .../at/tuwien/endpoints/TableEndpoint.java    |  10 +++
 .../src/main/resources/datatypes.json         |  15 -----
 ...aCiteIdentifierServicePersistenceTest.java |  27 +++++++-
 .../service/DatabaseServiceUnitTest.java      |  51 +++++++++++++++
 .../IdentifierServicePersistenceTest.java     |  13 ++++
 .../service/TableServicePersistenceTest.java  |  13 ++++
 .../tuwien/service/TableServiceUnitTest.java  |  60 ++++++++++++++++++
 .../service/ViewServicePersistenceTest.java   |   6 ++
 .../tuwien/service/ViewServiceUnitTest.java   |  12 ++++
 .../java/at/tuwien/config/GatewayConfig.java  |  37 ++++++++++-
 .../tuwien/gateway/SearchServiceGateway.java  |  11 +++-
 .../impl/SearchServiceGatewayImpl.java        |  17 ++++-
 .../tuwien/service/impl/TableServiceImpl.java |  19 ++++--
 dbrepo-search-service/Pipfile.lock            |  10 +++
 dbrepo-ui/composables/table-service.ts        |   8 ---
 .../pages/database/[database_id]/info.vue     |   4 +-
 .../[database_id]/table/[table_id]/import.vue |   3 +
 .../[database_id]/table/[table_id]/info.vue   |  15 ++++-
 .../table/[table_id]/settings.vue             |   4 ++
 .../database/[database_id]/view/create.vue    |  13 +++-
 .../database/[database_id]/view/index.vue     |  20 +++++-
 dbrepo-ui/pages/user/index.vue                |   3 +
 docker-compose.yml                            |   4 +-
 helm/dbrepo/files/create-event-listener.jar   | Bin 0 -> 10015 bytes
 helm/dbrepo/templates/auth-configmap.yaml     |   3 +
 helm/dbrepo/values.yaml                       |  23 +++++++
 make/dev.mk                                   |   1 +
 61 files changed, 514 insertions(+), 89 deletions(-)
 create mode 100644 dbrepo-auth-service/listeners/target/create-event-listener.jar
 delete mode 100644 dbrepo-metadata-service/rest-service/src/main/resources/datatypes.json
 create mode 100644 helm/dbrepo/files/create-event-listener.jar

diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml
index 7817c84c7f..362a4d91b1 100644
--- a/.docker/docker-compose.yml
+++ b/.docker/docker-compose.yml
@@ -83,6 +83,7 @@ services:
       - ./config/import-realms.sh:/docker-entrypoint-initdb.d/import-realms.sh
       - ./config/master-realm.json:/opt/keycloak/data/import/master-realm.json
       - ./config/dbrepo-realm.json:/opt/keycloak/data/import/dbrepo-realm.json
+      - ./config/create-event-listener.jar:/opt/bitnami/keycloak/providers/create-event-listener.jar
     ports:
       - "8080:8080"
     environment:
@@ -93,6 +94,9 @@ services:
       KEYCLOAK_DATABASE_NAME: "${AUTH_DB_NAME:-keycloak}"
       KEYCLOAK_DATABASE_USER: "${AUTH_DB_USERNAME:-keycloak}"
       KEYCLOAK_DATABASE_PASSWORD: "${AUTH_DB_PASSWORD:-dbrepo}"
+      METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}/api/user"
+      SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
+      SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}"
     healthcheck:
       test: curl --head -fsS http://localhost:9000/health/ready
       interval: 10s
@@ -109,7 +113,12 @@ services:
   dbrepo-auth-service-init:
     init: true
     restart: "no"
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.0
+=======
+    container_name: dbrepo-auth-service-init
+    image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.3
+>>>>>>> Stashed changes
     environment:
       AUTH_SERVICE_ADMIN: ${AUTH_SERVICE_ADMIN:-admin}
       AUTH_SERVICE_ADMIN_PASSWORD: ${AUTH_SERVICE_ADMIN_PASSWORD:-admin}
@@ -130,7 +139,11 @@ services:
     restart: "no"
     container_name: dbrepo-metadata-service
     hostname: metadata-service
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.3
+>>>>>>> Stashed changes
     volumes:
       - "${SHARED_VOLUME:-/tmp}:/tmp"
     environment:
@@ -193,7 +206,11 @@ services:
     restart: "no"
     container_name: dbrepo-analyse-service
     hostname: analyse-service
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.6.3
+>>>>>>> Stashed changes
     environment:
       AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client}
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
@@ -248,7 +265,11 @@ services:
     restart: "no"
     container_name: dbrepo-search-db
     hostname: search-db
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/search-db:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/search-db:1.6.3
+>>>>>>> Stashed changes
     healthcheck:
       test: curl -sSL localhost:9200/_plugins/_security/health | jq .status | grep UP
       interval: 10s
@@ -272,7 +293,11 @@ services:
     restart: "no"
     container_name: dbrepo-search-service
     hostname: search-service
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.6.3
+>>>>>>> Stashed changes
     environment:
       AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client}
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
@@ -294,7 +319,11 @@ services:
     restart: "no"
     container_name: dbrepo-ui
     hostname: ui
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.3
+>>>>>>> Stashed changes
     environment:
       NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}"
       NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://localhost}"
@@ -363,7 +392,11 @@ services:
     init: true
     container_name: dbrepo-search-service-init
     hostname: search-service-init
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.6.3
+>>>>>>> Stashed changes
     environment:
       METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}
       OPENSEARCH_HOST: ${OPENSEARCH_HOST:-search-db}
@@ -417,7 +450,11 @@ services:
     restart: "no"
     container_name: dbrepo-dashboard-service
     hostname: dashboard-service
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.6.3
+>>>>>>> Stashed changes
     ports:
       - "3000:3000"
     volumes:
@@ -444,7 +481,11 @@ services:
     init: true
     container_name: dbrepo-storage-service-init
     hostname: storage-service-init
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.3
+>>>>>>> Stashed changes
     environment:
       S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin}
       S3_BUCKET: "${S3_BUCKET:-dbrepo}"
@@ -489,7 +530,11 @@ services:
     restart: "no"
     container_name: dbrepo-data-service
     hostname: data-service
+<<<<<<< Updated upstream
     image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.0
+=======
+    image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.3
+>>>>>>> Stashed changes
     volumes:
       - "${SHARED_VOLUME:-/tmp}:/tmp"
     environment:
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8bf70c0c71..9caa24b253 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -81,6 +81,48 @@ lint-helm-chart:
     - helm dependency update ./helm/dbrepo
   script:
     - helm lint ./helm/dbrepo
+<<<<<<< Updated upstream
+=======
+    - helm schema -input ./helm/dbrepo/values.yaml -output ./helm/dbrepo/values.schema.json
+    - diff ./CI_values.schema.json ./helm/dbrepo/values.schema.json
+    - diff ./dbrepo-metadata-db/1_setup-schema.sql ./helm/dbrepo/files/01-setup-schema.sql
+    - diff ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./helm/dbrepo/files/create-event-listener.jar
+  artifacts:
+    when: always
+    paths:
+      - ./helm/dbrepo/values.schema.json
+    expire_in: 1 days
+
+lint-helm-readme:
+  image: docker.io/node:${NODE_VERSION}-alpine${ALPINE_VERSION}
+  stage: lint
+  before_script:
+    - apk --no-cache add alpine-sdk bash git
+    - cp ./helm/dbrepo/README.md ./CI_README.md
+    - git clone https://github.com/bitnami/readme-generator-for-helm
+    - (cd ./readme-generator-for-helm && npm install && npm install -g pkg && pkg . -o /usr/local/sbin/readme-generator)
+  script:
+    - readme-generator --readme ./helm/dbrepo/README.md --values ./helm/dbrepo/values.yaml
+    - diff ./CI_README.md ./helm/dbrepo/README.md
+  artifacts:
+    when: always
+    paths:
+      - ./helm/dbrepo/README.md
+    expire_in: 1 days
+
+lint-open-api-version:
+  image: docker.io/alpine:${ALPINE_VERSION}
+  stage: lint
+  variables:
+    VERSION: 4.45.1
+    BINARY: yq_linux_amd64
+  before_script:
+    - 'apk --no-cache add bash wget'
+    - 'wget https://github.com/mikefarah/yq/releases/download/v${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq'
+  script:
+    - yq '.externalDocs.url' ./.docs/.openapi/api.base.yaml | grep "${DOC_VERSION}"
+    - yq '.info.version' ./.docs/.openapi/api.base.yaml | grep "${DOC_VERSION}"
+>>>>>>> Stashed changes
 
 build-metadata-service:
   image: maven:3-openjdk-${JAVA_VERSION}
diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index 546ead5c14..aecb60a478 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -1,7 +1,11 @@
 {
     "_meta": {
         "hash": {
+<<<<<<< Updated upstream
             "sha256": "683cc19a3205b9b5f9b99db8b71c0abadadfd652a94dcf710a73aeca92b97227"
+=======
+            "sha256": "9cc4c161729b642069bbf4ab379c0f4a9122035afcb3ac7b5b1bfc13281f76aa"
+>>>>>>> Stashed changes
         },
         "pipfile-spec": 6,
         "requires": {
@@ -412,8 +416,12 @@
         },
         "dbrepo": {
             "hashes": [
+<<<<<<< Updated upstream
                 "sha256:1495b7efa016d75a2f978cf20aa1729d8dee2809583f2c253264f7fd3233addb",
                 "sha256:839a4f5810d83e93b1fa88c7ab7641727b65af1d0eada93195d3f0daa3e13e5a"
+=======
+                "sha256:7f98329f08d1da6fe45da8130cfb3ebd6e947a4101d46f92b31d7204b29a153d"
+>>>>>>> Stashed changes
             ],
             "markers": "python_version >= '3.11'",
             "path": "./lib/dbrepo-1.6.1.tar.gz"
diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar
new file mode 100644
index 0000000000000000000000000000000000000000..221bdd325f056ff953e0a44a46773470eb08e91e
GIT binary patch
literal 10015
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
E0G?_lI{*Lx

literal 0
HcmV?d00001

diff --git a/dbrepo-data-service/Dockerfile b/dbrepo-data-service/Dockerfile
index f4e2be5b96..7c7b1431a9 100644
--- a/dbrepo-data-service/Dockerfile
+++ b/dbrepo-data-service/Dockerfile
@@ -6,22 +6,26 @@ LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
 FROM maven:3-amazoncorretto-17 AS build
 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
 
+<<<<<<< Updated upstream
 COPY ./pom.xml ./
 
 RUN mvn -fn -B dependency:go-offline
 
+=======
+>>>>>>> Stashed changes
 COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien
 
 COPY ./querystore ./querystore
 COPY ./report ./report
 COPY ./rest-service ./rest-service
 COPY ./services ./services
+COPY ./pom.xml ./
 
 # Make sure it compiles
 RUN mvn clean package -DskipTests
 
 ###### THIRD STAGE ######
-FROM amazoncorretto:17-alpine3.19 AS runtime
+FROM amazoncorretto:17-alpine3.21 AS runtime
 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
 
 RUN apk add --no-cache curl bash jq
@@ -32,7 +36,7 @@ RUN adduser -S -u 1001 data-service
 
 USER 1001
 
-COPY --from=build --chown=1001 ./rest-service/target/rest-service-*.jar ./data-service.jar
+COPY --from=build --chown=1001 ./rest-service/target/data-service.jar ./data-service.jar
 
 # non-root port
 EXPOSE 8080
diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml
index 884824994a..72a7114c0f 100644
--- a/dbrepo-data-service/pom.xml
+++ b/dbrepo-data-service/pom.xml
@@ -292,6 +292,7 @@
     </dependencies>
 
     <build>
+        <finalName>data-service</finalName>
         <resources>
             <resource>
                 <directory>${basedir}/src/main/resources</directory>
diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile
index 843c334a9a..4a519abc9f 100644
--- a/dbrepo-metadata-service/Dockerfile
+++ b/dbrepo-metadata-service/Dockerfile
@@ -1,5 +1,5 @@
 ###### FIRST STAGE ######
-FROM maven:3-amazoncorretto-17 AS build
+FROM maven:3-amazoncorretto-17-alpine AS build
 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
 
 COPY ./pom.xml ./
@@ -12,7 +12,11 @@ COPY ./rest-service/pom.xml ./rest-service/
 COPY ./services/pom.xml ./services/
 COPY ./test/pom.xml ./test/
 
+<<<<<<< Updated upstream
 RUN mvn verify -B -fn
+=======
+RUN mvn dependency:go-offline
+>>>>>>> Stashed changes
 
 COPY ./api ./api
 COPY ./entities ./entities
@@ -27,7 +31,7 @@ COPY ./test ./test
 RUN mvn clean install -DskipTests
 
 ###### SECOND STAGE ######
-FROM amazoncorretto:17-alpine3.19 AS runtime
+FROM amazoncorretto:17-alpine3.21 AS runtime
 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
 
 RUN apk add --no-cache curl bash jq
@@ -36,9 +40,9 @@ WORKDIR /app
 
 USER 1001
 
-COPY --from=build --chown=1001 ./rest-service/target/dbrepo-metadata-service-rest-service-*.jar ./metadata-service.jar
+COPY --from=build --chown=1001 ./rest-service/target/metadata-service.jar ./metadata-service.jar
 
 # non-root port
 EXPOSE 8080
 
-ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true",  "-jar", "./metadata-service.jar"]
+ENTRYPOINT ["java", "-jar", "./metadata-service.jar"]
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
index 9928c8e54d..c1285fb21e 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
@@ -14,6 +14,10 @@ import java.time.Instant;
 @Getter
 @Setter
 @Builder
+<<<<<<< Updated upstream
+=======
+@EqualsAndHashCode(callSuper = false)
+>>>>>>> Stashed changes
 @NoArgsConstructor
 @AllArgsConstructor
 @Jacksonized
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
index 5fc253c433..307e497c3f 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
@@ -16,7 +16,11 @@ import java.util.List;
 @Getter
 @Setter
 @Builder
+<<<<<<< Updated upstream
 @EqualsAndHashCode
+=======
+@EqualsAndHashCode(callSuper = false)
+>>>>>>> Stashed changes
 @NoArgsConstructor
 @AllArgsConstructor
 @Jacksonized
@@ -61,6 +65,12 @@ public class DatabaseDto {
     @Schema(example = "true")
     private Boolean isSchemaPublic;
 
+<<<<<<< Updated upstream
+=======
+    @NotNull
+    private ContainerDto container;
+
+>>>>>>> Stashed changes
     @NotNull
     private ContainerBriefDto container;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
index d1ee156e9b..1c8eaf64b7 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
@@ -14,7 +14,11 @@ import java.util.List;
 @Getter
 @Setter
 @Builder
+<<<<<<< Updated upstream
 @EqualsAndHashCode
+=======
+@EqualsAndHashCode(callSuper = false)
+>>>>>>> Stashed changes
 @NoArgsConstructor
 @AllArgsConstructor
 @Jacksonized
@@ -60,6 +64,12 @@ public class ViewDto {
     @Schema(example = "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916")
     private String queryHash;
 
+<<<<<<< Updated upstream
+=======
+    @ToString.Exclude
+    private DatabaseDto database;
+
+>>>>>>> Stashed changes
     @NotNull
     private UserBriefDto owner;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
index 67087d438d..d58d0af8a0 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
@@ -17,7 +17,11 @@ import java.util.List;
 @Getter
 @Setter
 @Builder
+<<<<<<< Updated upstream
 @EqualsAndHashCode
+=======
+@EqualsAndHashCode(callSuper = false)
+>>>>>>> Stashed changes
 @NoArgsConstructor
 @AllArgsConstructor
 @Jacksonized
@@ -100,6 +104,12 @@ public class TableDto {
     @NotNull
     private List<ColumnDto> columns;
 
+<<<<<<< Updated upstream
+=======
+    @ToString.Exclude
+    private DatabaseDto database;
+
+>>>>>>> Stashed changes
     @NotNull
     private ConstraintsDto constraints;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
index 343d582b55..f6cdbf3534 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
@@ -11,7 +11,11 @@ import java.util.UUID;
 @Getter
 @Setter
 @Builder
+<<<<<<< Updated upstream
 @EqualsAndHashCode
+=======
+@EqualsAndHashCode(callSuper = false)
+>>>>>>> Stashed changes
 @NoArgsConstructor
 @AllArgsConstructor
 @Jacksonized
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
index a2fb1264cc..85391d31d4 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
@@ -54,7 +54,6 @@ public class Container {
     @Column
     private String uiAdditionalFlags;
 
-    @EqualsAndHashCode.Exclude
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false)
@@ -67,13 +66,11 @@ public class Container {
     })
     private ContainerImage image;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java
index 7e04ce2086..2bbd65be6c 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java
@@ -60,13 +60,11 @@ public class ContainerImage {
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "image")
     private List<Container> containers;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java
index 5f4ddbfb8c..d94b39ec25 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java
@@ -68,7 +68,6 @@ public class DataType {
     private Boolean buildable;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "image_id", referencedColumnName = "id")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java
index 1ecedc5e16..8ec4763ba2 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java
@@ -32,7 +32,6 @@ public class Operator {
     private String documentation;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "image_id", referencedColumnName = "id")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
index d90a702db3..699f50b79b 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
@@ -120,13 +120,11 @@ public class Database implements Serializable {
     @Column(columnDefinition = "LONGBLOB")
     private byte[] image;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java
index 6a2622be3e..6df3aa5129 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java
@@ -33,7 +33,6 @@ public class DatabaseAccess {
     private UUID huserid;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
@@ -46,7 +45,6 @@ public class DatabaseAccess {
     private Long hdbid;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
index 67e6d6d18a..3835c0188b 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
@@ -89,7 +89,6 @@ public class View {
     private List<Identifier> identifiers;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
@@ -103,13 +102,11 @@ public class View {
     @OrderBy("ordinalPosition")
     private List<ViewColumn> columns;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
index 7ef6e8b9d6..752f784e90 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
@@ -26,7 +26,6 @@ public class ViewColumn implements Comparable<ViewColumn> {
     private Long id;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "view_id", referencedColumnName = "id", nullable = false)
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
index 3cdb01d7d3..088f0b7a8c 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
@@ -25,7 +25,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 
 @Data
 @Entity
-@Builder
+@Builder(toBuilder = true)
 @Log4j2
 @ToString
 @AllArgsConstructor
@@ -69,7 +69,6 @@ public class Table {
     private String description;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
@@ -117,13 +116,11 @@ public class Table {
     @OrderBy("ordinalPosition")
     private List<TableColumn> columns;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
index 9f4c4e0606..459cb69f4b 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
@@ -36,7 +36,6 @@ public class TableColumn implements Comparable<TableColumn> {
     private Long id;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "tID", referencedColumnName = "id", nullable = false)
@@ -114,13 +113,11 @@ public class TableColumn implements Comparable<TableColumn> {
     @Column(name = "std_dev")
     private BigDecimal stdDev;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java
index 5a9e8292be..2bea4c6112 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java
@@ -42,7 +42,6 @@ public class TableColumnConcept {
     @Column(columnDefinition = "TEXT")
     private String description;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java
index 7e8fe915b3..e58cbed659 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java
@@ -42,7 +42,6 @@ public class TableColumnUnit {
     @Column(columnDefinition = "TEXT")
     private String description;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java
index 76de9463cf..a24cffcd2a 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java
@@ -29,7 +29,6 @@ public class ForeignKey {
     private String name;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "tid", referencedColumnName = "id", nullable = false)
@@ -37,7 +36,6 @@ public class ForeignKey {
     private Table table;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "rtid", referencedColumnName = "id", nullable = false)
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
index ed2691fc52..5d6c2043ae 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
@@ -26,7 +26,6 @@ public class ForeignKeyReference {
     private Long id;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false)
     private ForeignKey foreignKey;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java
index 407e2fb7f3..40452ce020 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java
@@ -25,7 +25,6 @@ public class PrimaryKey {
     private Long id;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
@@ -34,7 +33,6 @@ public class PrimaryKey {
     private Table table;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java
index c0dfc46710..fb10dad8ad 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java
@@ -30,7 +30,6 @@ public class Unique {
     private String name;
 
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
@@ -38,7 +37,6 @@ public class Unique {
     })
     private Table table;
 
-    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinTable(
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
index b98a1b8c6b..49d4df1b35 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
@@ -138,7 +138,6 @@ public class Identifier implements Serializable {
      * Databases are never created/updated/deleted by the Identifier entity.
      */
     @ToString.Exclude
-    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "dbid", referencedColumnName = "id", nullable = false, updatable = false)
@@ -166,12 +165,10 @@ public class Identifier implements Serializable {
     })
     private User owner;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java
index 576aab1e37..2e796c859a 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java
@@ -46,12 +46,10 @@ public class Ontology {
     @Column
     private String rdfPath;
 
-    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
     private Instant created;
 
-    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java
index fd87852c6e..bc17ab9bc9 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java
@@ -52,7 +52,6 @@ public class User {
     private String language;
 
     @OneToMany(fetch = FetchType.LAZY)
-    @EqualsAndHashCode.Exclude
     @JoinColumns({
             @JoinColumn(name = "user_id", referencedColumnName = "ID", insertable = false, updatable = false)
     })
diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml
index 2803d9b5f3..a02d2ebe77 100644
--- a/dbrepo-metadata-service/pom.xml
+++ b/dbrepo-metadata-service/pom.xml
@@ -99,6 +99,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
         <!-- Open API -->
         <dependency>
             <groupId>org.springdoc</groupId>
@@ -271,6 +275,7 @@
     </dependencies>
 
     <build>
+        <finalName>metadata-service</finalName>
         <resources>
             <resource>
                 <directory>${basedir}/src/main/resources</directory>
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceConnectionException.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceConnectionException.java
index d68185102a..2cf18262d3 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceConnectionException.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceConnectionException.java
@@ -4,7 +4,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ResponseStatus;
 
 @ResponseStatus(code = HttpStatus.BAD_GATEWAY, reason = "error.search.connection")
-public class SearchServiceConnectionException extends Exception {
+public class SearchServiceConnectionException extends RuntimeException {
 
     public SearchServiceConnectionException(String msg) {
         super(msg);
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceException.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceException.java
index aef3ae7f7c..528b3aadd1 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceException.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/SearchServiceException.java
@@ -4,7 +4,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ResponseStatus;
 
 @ResponseStatus(code = HttpStatus.SERVICE_UNAVAILABLE, reason = "error.search.invalid")
-public class SearchServiceException extends Exception {
+public class SearchServiceException extends RuntimeException {
 
     public SearchServiceException(String message) {
         super(message);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index 9f4542fc02..af9f36aa8a 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -1,7 +1,12 @@
 package at.tuwien.endpoints;
 
+<<<<<<< Updated upstream
 import at.tuwien.api.database.table.TableBriefDto;
 import at.tuwien.api.database.table.TableCreateDto;
+=======
+import at.tuwien.api.database.table.CreateTableDto;
+import at.tuwien.api.database.table.TableBriefDto;
+>>>>>>> Stashed changes
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.database.table.TableUpdateDto;
 import at.tuwien.api.database.table.columns.ColumnDto;
@@ -369,9 +374,14 @@ public class TableEndpoint extends AbstractEndpoint {
         final Database database = databaseService.findById(databaseId);
         endpointValidator.validateOnlyAccess(database, principal, true);
         endpointValidator.validateColumnCreateConstraints(data);
+        final Table table = tableService.createTable(database, data, principal);
         return ResponseEntity.status(HttpStatus.CREATED)
+<<<<<<< Updated upstream
                 .body(metadataMapper.customTableToTableDto(
                         tableService.createTable(database, data, principal)));
+=======
+                .body(metadataMapper.tableToTableBriefDto(table));
+>>>>>>> Stashed changes
     }
 
     @PutMapping("/{tableId}")
diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/datatypes.json b/dbrepo-metadata-service/rest-service/src/main/resources/datatypes.json
deleted file mode 100644
index 3779d12cbe..0000000000
--- a/dbrepo-metadata-service/rest-service/src/main/resources/datatypes.json
+++ /dev/null
@@ -1,15 +0,0 @@
-[
-  {
-    "name": "",
-    "size": {
-      "min": 0,
-      "required": true
-    },
-    "d": {
-      "required": false
-    },
-    "documentation": "https://mariadb.com/kb/en/bigint/",
-    "quoted": false,
-    "buildable": true
-  }
-]
\ No newline at end of file
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
index 182fe8e14a..9ec106fda6 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
@@ -39,8 +39,7 @@ import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 @ExtendWith(SpringExtension.class)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@@ -140,8 +139,14 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
         /* mock */
         when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(dataCiteBodyParameterizedTypeReference)))
                 .thenReturn(mock);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         dataCiteIdentifierService.save(DATABASE_1, USER_1, IDENTIFIER_1_SAVE_DTO);
@@ -155,8 +160,14 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
         doThrow(HttpClientErrorException.BadRequest.class)
                 .when(restTemplate)
                 .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(dataCiteBodyParameterizedTypeReference));
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         assertThrows(MalformedException.class, () -> {
@@ -172,8 +183,14 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
         doThrow(RestClientException.class)
                 .when(restTemplate)
                 .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(dataCiteBodyParameterizedTypeReference));
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         assertThrows(DataServiceConnectionException.class, () -> {
@@ -331,8 +348,14 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
             IdentifierNotFoundException, SearchServiceException, SearchServiceConnectionException {
 
         /* mock */
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         dataCiteIdentifierService.delete(IDENTIFIER_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
index 1b6570abd8..40244839e1 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
@@ -109,8 +109,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         /* mock */
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.modifyImage(DATABASE_1, image);
@@ -163,8 +169,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of());
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.updateViewMetadata(DATABASE_1);
@@ -221,8 +233,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO, VIEW_4_DTO)); /* <<< */
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.updateViewMetadata(DATABASE_1);
@@ -239,8 +257,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)); /* <<< */
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.updateViewMetadata(DATABASE_1);
@@ -257,8 +281,17 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of());
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.updateTableMetadata(DATABASE_1);
@@ -275,8 +308,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.updateTableMetadata(DATABASE_1);
@@ -293,8 +332,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO, TABLE_5_DTO));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Database response = databaseService.updateTableMetadata(DATABASE_1);
@@ -516,8 +561,14 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
             ContainerNotFoundException, SearchServiceException, SearchServiceConnectionException {
 
         /* mock */
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
index 0c87dcdd69..55c7f17511 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
@@ -35,6 +35,7 @@ import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.when;
 
 @Log4j2
@@ -175,8 +176,14 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
         /* mock */
         when(dataServiceGateway.findQuery(IDENTIFIER_5_DATABASE_ID, IDENTIFIER_5_QUERY_ID))
                 .thenReturn(QUERY_2_DTO);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_2_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         identifierService.save(DATABASE_2, USER_2, IDENTIFIER_5_SAVE_DTO);
@@ -285,8 +292,14 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
             SearchServiceConnectionException {
 
         /* mock */
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         identifierService.delete(IDENTIFIER_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
index 3126f9e9f4..1bad05c082 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
@@ -1,9 +1,16 @@
 package at.tuwien.service;
 
+<<<<<<< Updated upstream
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
 import at.tuwien.api.database.table.columns.ColumnTypeDto;
 import at.tuwien.api.database.table.constraints.ConstraintsCreateDto;
+=======
+import at.tuwien.api.database.table.CreateTableDto;
+import at.tuwien.api.database.table.columns.ColumnTypeDto;
+import at.tuwien.api.database.table.columns.CreateTableColumnDto;
+import at.tuwien.api.database.table.constraints.CreateTableConstraintsDto;
+>>>>>>> Stashed changes
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.database.table.columns.TableColumn;
@@ -111,8 +118,14 @@ public class TableServicePersistenceTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .createTable(DATABASE_1_ID, request);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Table response = tableService.createTable(DATABASE_1, request, USER_1_PRINCIPAL);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
index d975e808e3..0b7d8f5bc6 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
@@ -134,8 +134,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(TABLE_8_STATISTIC_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         tableService.updateStatistics(TABLE_8);
@@ -223,8 +229,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(CONCEPT_1);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request);
@@ -255,8 +267,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(CONCEPT_1_ENTITY_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request);
@@ -278,8 +296,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .createTable(eq(DATABASE_1_ID), any(TableCreateDto.class));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Table response = tableService.createTable(DATABASE_1, TABLE_3_CREATE_DTO, USER_1_PRINCIPAL);
@@ -315,8 +339,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .createTable(eq(DATABASE_1_ID), any(TableCreateDto.class));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Table response = tableService.createTable(DATABASE_1, request, USER_1_PRINCIPAL);
@@ -368,8 +398,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .createTable(eq(DATABASE_1_ID), any(TableCreateDto.class));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         assertThrows(MalformedException.class, () -> {
@@ -391,8 +427,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .createTable(DATABASE_1_ID, TABLE_3_CREATE_DTO);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final Table response = tableService.createTable(DATABASE_1, TABLE_3_CREATE_DTO, USER_1_PRINCIPAL);
@@ -412,8 +454,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doThrow(DataServiceException.class)
                 .when(dataServiceGateway)
                 .createTable(DATABASE_1_ID, TABLE_5_CREATE_DTO);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         assertThrows(DataServiceException.class, () -> {
@@ -510,8 +558,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .deleteTable(DATABASE_1_ID, TABLE_1_ID);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         tableService.deleteTable(TABLE_1);
@@ -526,8 +580,14 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .deleteTable(DATABASE_1_ID, TABLE_4_ID);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         tableService.deleteTable(TABLE_4);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java
index 8ca002472a..c4c8b8bd8c 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java
@@ -88,8 +88,14 @@ public class ViewServicePersistenceTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .deleteView(DATABASE_1_ID, VIEW_1_ID);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         viewService.delete(VIEW_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java
index cd9fe03c65..44a0a78d9e 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java
@@ -61,8 +61,14 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(VIEW_1_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         final View response = viewService.create(DATABASE_1, USER_1, request);
@@ -116,8 +122,14 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
                 .deleteView(DATABASE_1_ID, VIEW_1_ID);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
+<<<<<<< Updated upstream
         when(searchServiceGateway.update(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
+=======
+        doNothing()
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+>>>>>>> Stashed changes
 
         /* test */
         viewService.delete(VIEW_1);
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/GatewayConfig.java
index 0bcace730e..1559281af3 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/GatewayConfig.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/GatewayConfig.java
@@ -1,15 +1,27 @@
 package at.tuwien.config;
 
+import at.tuwien.api.keycloak.TokenDto;
 import at.tuwien.auth.InternalRequestInterceptor;
+import at.tuwien.exception.AccountNotSetupException;
+import at.tuwien.exception.AuthServiceConnectionException;
+import at.tuwien.exception.CredentialsInvalidException;
 import at.tuwien.gateway.KeycloakGateway;
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.*;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
+import org.springframework.web.reactive.function.client.WebClient;
 import org.springframework.web.util.DefaultUriBuilderFactory;
 
+import java.util.List;
+
 @Log4j2
 @Getter
 @Configuration
@@ -89,4 +101,27 @@ public class GatewayConfig {
         return restTemplate;
     }
 
+    @Bean
+    public WebClient webClient() {
+        return WebClient.builder()
+                .baseUrl(searchEndpoint)
+                .filter(internalFilter())
+                .build();
+    }
+
+    private ExchangeFilterFunction internalFilter() {
+        return (request, next) -> {
+            final HttpHeaders headers = request.headers();
+            headers.setAccept(List.of(MediaType.APPLICATION_JSON));
+            try {
+                final TokenDto token = keycloakGateway.obtainUserToken(getSystemUsername(), getSystemPassword());
+                headers.setBearerAuth(token.getAccessToken());
+                return next.exchange(request);
+            } catch (AuthServiceConnectionException | CredentialsInvalidException | AccountNotSetupException e) {
+                log.error("Failed to obtain token for internal user: {}", e.getMessage());
+            }
+            return next.exchange(request);
+        };
+    }
+
 }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java
index f5e2f49c02..16a6c731b1 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java
@@ -1,12 +1,21 @@
 package at.tuwien.gateway;
 
+<<<<<<< Updated upstream
 import at.tuwien.api.database.DatabaseDto;
+=======
+>>>>>>> Stashed changes
 import at.tuwien.entities.database.Database;
-import at.tuwien.exception.*;
+import at.tuwien.exception.DatabaseNotFoundException;
+import at.tuwien.exception.SearchServiceConnectionException;
+import at.tuwien.exception.SearchServiceException;
 
 public interface SearchServiceGateway {
 
+<<<<<<< Updated upstream
     DatabaseDto update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException;
+=======
+    void update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException;
+>>>>>>> Stashed changes
 
     void delete(Long databaseId) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException;
 }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
index 0f14b8d348..729ffb3057 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
@@ -13,29 +13,39 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.HttpClientErrorException;
 import org.springframework.web.client.HttpServerErrorException;
 import org.springframework.web.client.ResourceAccessException;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.WebClient;
 
 @Log4j2
 @Service
 public class SearchServiceGatewayImpl implements SearchServiceGateway {
 
+    private final WebClient webClient;
     private final RestTemplate restTemplate;
     private final GatewayConfig gatewayConfig;
     private final MetadataMapper metadataMapper;
 
     @Autowired
-    public SearchServiceGatewayImpl(@Qualifier("searchServiceRestTemplate") RestTemplate restTemplate,
+    public SearchServiceGatewayImpl(WebClient webClient, @Qualifier("searchServiceRestTemplate") RestTemplate restTemplate,
                                     GatewayConfig gatewayConfig, MetadataMapper metadataMapper) {
+        this.webClient = webClient;
         this.restTemplate = restTemplate;
         this.gatewayConfig = gatewayConfig;
         this.metadataMapper = metadataMapper;
     }
 
     @Override
+<<<<<<< Updated upstream
     public DatabaseDto update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException {
+=======
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public void update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException {
+>>>>>>> Stashed changes
         final ResponseEntity<DatabaseDto> response;
         final HttpHeaders headers = new HttpHeaders();
         headers.set("Accept", "application/json");
@@ -44,7 +54,11 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway {
         log.trace("update database at endpoint {} with path {}", gatewayConfig.getSearchEndpoint(), path);
         try {
             response = restTemplate.exchange(path, HttpMethod.PUT, new HttpEntity<>(
+<<<<<<< Updated upstream
                     metadataMapper.databaseToPrivilegedDatabaseDto(database), headers), DatabaseDto.class);
+=======
+                    metadataMapper.databaseToDatabaseDto(database), headers), DatabaseDto.class);
+>>>>>>> Stashed changes
         } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable |
                  HttpServerErrorException.InternalServerError e) {
             log.error("Failed to update database: {}", e.getMessage());
@@ -60,7 +74,6 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway {
             log.error("Failed to update database: response code is not 202");
             throw new SearchServiceException("Failed to update database: response code is not 202");
         }
-        return response.getBody();
     }
 
     @Override
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
index 52a9a63667..3d71e52b0d 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
@@ -3,8 +3,12 @@ package at.tuwien.service.impl;
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.TableStatisticDto;
 import at.tuwien.api.database.table.TableUpdateDto;
+<<<<<<< Updated upstream
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
+=======
+>>>>>>> Stashed changes
 import at.tuwien.api.database.table.columns.ColumnStatisticDto;
+import at.tuwien.api.database.table.columns.CreateTableColumnDto;
 import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto;
 import at.tuwien.config.RabbitConfig;
 import at.tuwien.entities.database.Database;
@@ -22,6 +26,7 @@ import at.tuwien.service.*;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.security.Principal;
@@ -89,11 +94,15 @@ public class TableServiceImpl implements TableService {
     }
 
     @Override
+<<<<<<< Updated upstream
     @Transactional
     public Table createTable(Database database, TableCreateDto data, Principal principal) throws DataServiceException,
+=======
+    @Transactional(propagation = Propagation.REQUIRED)
+    public Table createTable(Database database, CreateTableDto data, Principal principal) throws DataServiceException,
+>>>>>>> Stashed changes
             DataServiceConnectionException, UserNotFoundException, TableNotFoundException, DatabaseNotFoundException,
-            TableExistsException, SearchServiceException, SearchServiceConnectionException, MalformedException,
-            OntologyNotFoundException, SemanticEntityNotFoundException {
+            TableExistsException, MalformedException, OntologyNotFoundException, SemanticEntityNotFoundException {
         final User owner = userService.findByUsername(principal.getName());
         /* map table */
         final Table table = Table.builder()
@@ -279,9 +288,8 @@ public class TableServiceImpl implements TableService {
 
     @Override
     @Transactional
-    public void updateStatistics(Table table) throws SearchServiceException,
-            DatabaseNotFoundException, SearchServiceConnectionException, MalformedException, TableNotFoundException,
-            DataServiceException, DataServiceConnectionException {
+    public void updateStatistics(Table table) throws MalformedException, TableNotFoundException, DataServiceException,
+            DataServiceConnectionException, DatabaseNotFoundException {
         final TableStatisticDto statistic = dataServiceGateway.getTableStatistics(table.getTdbid(), table.getId());
         if (statistic == null) {
             return;
@@ -312,7 +320,6 @@ public class TableServiceImpl implements TableService {
         /* update in open search service */
         searchServiceGateway.update(database);
         log.info("Updated statistics for the table and {} column(s)", table.getColumns().size());
-        log.trace("updated statistics: {}", table);
     }
 
 }
diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock
index 4d0035b92e..87765c3221 100644
--- a/dbrepo-search-service/Pipfile.lock
+++ b/dbrepo-search-service/Pipfile.lock
@@ -1,7 +1,11 @@
 {
     "_meta": {
         "hash": {
+<<<<<<< Updated upstream
             "sha256": "a0682b0583cfc91d643a307a7dce7a524e7f7c29dbf2c9c5e9a6f16eb5f5ee91"
+=======
+            "sha256": "2ff9fc673f1fb1e5dc272aa711f4e730088fa0188b44449db042abf99b6c4db7"
+>>>>>>> Stashed changes
         },
         "pipfile-spec": 6,
         "requires": {
@@ -360,11 +364,17 @@
         },
         "dbrepo": {
             "hashes": [
+<<<<<<< Updated upstream
                 "sha256:1495b7efa016d75a2f978cf20aa1729d8dee2809583f2c253264f7fd3233addb",
                 "sha256:839a4f5810d83e93b1fa88c7ab7641727b65af1d0eada93195d3f0daa3e13e5a"
             ],
             "markers": "python_version >= '3.11'",
             "path": "./lib/dbrepo-1.6.1.tar.gz"
+=======
+                "sha256:7f98329f08d1da6fe45da8130cfb3ebd6e947a4101d46f92b31d7204b29a153d"
+            ],
+            "path": "./lib/dbrepo-1.6.3.tar.gz"
+>>>>>>> Stashed changes
         },
         "docker": {
             "hashes": [
diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts
index ca757c7451..15a004f11a 100644
--- a/dbrepo-ui/composables/table-service.ts
+++ b/dbrepo-ui/composables/table-service.ts
@@ -251,13 +251,6 @@ export const useTableService = (): any => {
     }
   }
 
-  function isOwner(table: TableDto, user: UserDto) {
-    if (!table || !user) {
-      return false
-    }
-    return table.owner.id === user.id
-  }
-
   function tableNameToInternalName(name: string) {
     return name.normalize('NFKD')
       .toLowerCase()
@@ -293,7 +286,6 @@ export const useTableService = (): any => {
     suggest,
     prepareColumns,
     prepareConstraints,
-    isOwner,
     tableNameToInternalName
   }
 }
diff --git a/dbrepo-ui/pages/database/[database_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/info.vue
index 02c2c8310a..56973289bd 100644
--- a/dbrepo-ui/pages/database/[database_id]/info.vue
+++ b/dbrepo-ui/pages/database/[database_id]/info.vue
@@ -94,7 +94,7 @@
                 <div>
                   <UserBadge
                     :user="database.owner"
-                    :other-user="user" />
+                    :other-user="cacheUser" />
                 </div>
               </v-list-item>
               <v-list-item
@@ -104,7 +104,7 @@
                 <div>
                   <UserBadge
                     :user="database.contact"
-                    :other-user="user" />
+                    :other-user="cacheUser" />
                 </div>
               </v-list-item>
             </v-list>
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue
index 9da3e1c9fd..32862334e8 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue
@@ -83,6 +83,9 @@ export default {
     table () {
       return this.cacheStore.getTable
     },
+    access () {
+      return this.cacheStore.getAccess
+    },
     title () {
       if (!this.table) {
         return this.$t('pages.table.import.title')
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue
index 8108e0677e..bc4a1dcef7 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue
@@ -116,6 +116,8 @@
     </v-card>
     <v-breadcrumbs :items="items" class="pa-0 mt-2" />
   </div>
+  <pre>table={{ table }}</pre>
+  <pre>access={{ access }}</pre>
 </template>
 
 <script>
@@ -185,14 +187,22 @@ export default {
     roles () {
       return this.userStore.getRoles
     },
+    access () {
+      return this.cacheStore.getAccess
+    },
     canRead () {
-      if (this.database && this.database.is_public) {
+      if (!this.database || !this.access || this.database.is_public) {
         return true
       }
+<<<<<<< Updated upstream
       if (!this.user || !this.access) {
         return false
       }
       return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all'
+=======
+      const userService = useUserService()
+      return userService.hasReadAccess(this.access)
+>>>>>>> Stashed changes
     },
     canViewSchema () {
       if (this.error) {
@@ -215,9 +225,12 @@ export default {
       }
       return (this.access.type === 'write_own' && this.table.owned_by === this.user.id) || this.access.type === 'write_all'
     },
+<<<<<<< Updated upstream
     access () {
       return this.userStore.getAccess
     },
+=======
+>>>>>>> Stashed changes
     hasDescription () {
       return this.table && this.table.description
     },
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue
index 201917c5c0..44c8b25bfc 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue
@@ -229,8 +229,12 @@ export default {
       if (this.roles.includes('delete-foreign-table')) {
         return true
       }
+<<<<<<< Updated upstream
       const tableService = useTableService()
       return tableService.isOwner(this.table, this.user) && this.roles.includes('delete-table') && this.table.identifiers.length === 0
+=======
+      return this.table.owner.id === this.cacheUser.uid && this.roles.includes('delete-table') && this.table.identifiers.length === 0
+>>>>>>> Stashed changes
     },
     inputVariant () {
       const runtimeConfig = useRuntimeConfig()
diff --git a/dbrepo-ui/pages/database/[database_id]/view/create.vue b/dbrepo-ui/pages/database/[database_id]/view/create.vue
index 060d186252..80cb16e549 100644
--- a/dbrepo-ui/pages/database/[database_id]/view/create.vue
+++ b/dbrepo-ui/pages/database/[database_id]/view/create.vue
@@ -1,14 +1,19 @@
 <template>
   <div
     v-if="canCreateView">
-    <Builder mode="view" />
+    <Builder
+      mode="view" />
     <v-breadcrumbs :items="items" class="pa-0 mt-2" />
   </div>
 </template>
 
 <script>
 import Builder from '@/components/subset/Builder.vue'
+<<<<<<< Updated upstream
 import { useUserStore } from '@/stores/user'
+=======
+import { useCacheStore } from '@/stores/cache.js'
+>>>>>>> Stashed changes
 
 export default {
   components: {
@@ -35,7 +40,11 @@ export default {
           disabled: true
         }
       ],
+<<<<<<< Updated upstream
       userStore: useUserStore()
+=======
+      cacheStore: useCacheStore()
+>>>>>>> Stashed changes
     }
   },
   computed: {
@@ -46,7 +55,7 @@ export default {
       return this.userStore.getRoles
     },
     canCreateView () {
-      if (!this.roles) {
+      if (!this.roles || !this.access) {
         return false
       }
       return this.roles.includes('create-database-view')
diff --git a/dbrepo-ui/pages/database/[database_id]/view/index.vue b/dbrepo-ui/pages/database/[database_id]/view/index.vue
index 4172797328..c7acfd024c 100644
--- a/dbrepo-ui/pages/database/[database_id]/view/index.vue
+++ b/dbrepo-ui/pages/database/[database_id]/view/index.vue
@@ -1,6 +1,6 @@
 <template>
   <div
-    v-if="canViewSchema">
+    v-if="canViewViews">
     <DatabaseToolbar />
     <v-window
       v-model="tab">
@@ -48,11 +48,29 @@ export default {
     database () {
       return this.cacheStore.getDatabase
     },
+<<<<<<< Updated upstream
     canViewSchema () {
       if (this.error) {
         return false
       }
       return this.database
+=======
+    access () {
+      return this.cacheStore.getAccess
+    },
+    canViewViews () {
+      if (!this.database) {
+        return false
+      }
+      if (this.database.is_schema_public || this.database.is_public) {
+        return true
+      }
+      if (!this.access) {
+        return false
+      }
+      const userService = useUserService()
+      return userService.hasReadAccess(this.access)
+>>>>>>> Stashed changes
     }
   }
 }
diff --git a/dbrepo-ui/pages/user/index.vue b/dbrepo-ui/pages/user/index.vue
index e729d9086f..d53b2f42cc 100644
--- a/dbrepo-ui/pages/user/index.vue
+++ b/dbrepo-ui/pages/user/index.vue
@@ -2,6 +2,9 @@
   <div />
 </template>
 
+<script setup>
+const { loggedIn } = useOidcAuth()
+</script>
 <script>
 import { useUserStore } from '@/stores/user'
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 1a9da923ae..9eee227dd9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -19,8 +19,6 @@ services:
       - metadata-db-data:/bitnami/mariadb
       - ./dbrepo-metadata-db/1_setup-schema.sql:/docker-entrypoint-initdb.d/1_setup-schema.sql
       - ./dbrepo-metadata-db/2_setup-data.sql:/docker-entrypoint-initdb.d/2_setup-data.sql
-    ports:
-      - "3306:3306"
     environment:
       MARIADB_DATABASE: "${METADATA_DB:-dbrepo}"
       MARIADB_ROOT_PASSWORD: "${METADATA_DB_PASSWORD:-dbrepo}"
@@ -141,7 +139,7 @@ services:
       context: ./dbrepo-metadata-service
       network: host
     ports:
-      - "9099:8080"
+      - "9099:18080"
     volumes:
       - "${SHARED_VOLUME:-/tmp}:/tmp"
     environment:
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
new file mode 100644
index 0000000000000000000000000000000000000000..221bdd325f056ff953e0a44a46773470eb08e91e
GIT binary patch
literal 10015
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
E0G?_lI{*Lx

literal 0
HcmV?d00001

diff --git a/helm/dbrepo/templates/auth-configmap.yaml b/helm/dbrepo/templates/auth-configmap.yaml
index 9a237767cc..55355c2262 100644
--- a/helm/dbrepo/templates/auth-configmap.yaml
+++ b/helm/dbrepo/templates/auth-configmap.yaml
@@ -4,6 +4,9 @@ kind: ConfigMap
 metadata:
   name: auth-service-config
   namespace: {{ include "common.names.namespace" . | quote }}
+binaryData:
+  create-event-listener.jar: |
+    {{ .Files.Get "files/create-event-listener.jar" | b64enc | nindent 4 }}
 data:
   KC_HOSTNAME_PATH: "/"
   KC_HOSTNAME_ADMIN_URL: "{{ .Values.gateway }}/"
diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml
index 4d9376c06e..2c60cd27bd 100644
--- a/helm/dbrepo/values.yaml
+++ b/helm/dbrepo/values.yaml
@@ -133,7 +133,20 @@ authservice:
   ## @skip authservice.extraVolumeMounts
   extraVolumeMounts:
     - name: config-map
+<<<<<<< Updated upstream
       mountPath: /opt/bitnami/keycloak/data/import
+=======
+      mountPath: /opt/keycloak/data/import/dbrepo-realm.json
+      subPath: dbrepo-realm.json
+    - name: config-map
+      mountPath: /opt/keycloak/data/import/master-realm.json
+      subPath: master-realm.json
+    - name: config-map
+      mountPath: /opt/bitnami/keycloak/providers/create-event-listener.jar
+      subPath: create-event-listener.jar
+    - name: cache
+      mountPath: /bitnami/keycloak/
+>>>>>>> Stashed changes
   ## @skip authservice.replicaCount The number of replicas.
   replicaCount: 2
 
@@ -167,6 +180,16 @@ datadb:
     enabled: true
   ## @param datadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1
   replicaCount: 3
+  resources:
+    resources:
+      limits:
+        cpu: 750m
+        ephemeral-storage: 2Gi
+        memory: 1536Mi
+      requests:
+        cpu: 500m
+        ephemeral-storage: 50Mi
+        memory: 1000Mi
   persistence:
     ## @param datadb.persistence.enabled Enable persistent storage.
     enabled: true
diff --git a/make/dev.mk b/make/dev.mk
index 0282dbbce2..c20b4dd229 100644
--- a/make/dev.mk
+++ b/make/dev.mk
@@ -31,6 +31,7 @@ package-config: ## Package the config files
 	cp ./dbrepo-metric-db/prometheus.yml ./.docker/config
 	cp ./dbrepo-storage-service/s3_config.json ./.docker/config
 	cp ./dbrepo-upload-service/pre-create.sh ./.docker/config
+	cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./.docker/config
 	cd ./.docker && tar czf ./dist.tar.gz ./docker-compose.yml ./.env ./config
 
 .PHONY: install-staging
-- 
GitLab