From faf1b7f725ebfd6ddf02336eac472e563340cf64 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Sun, 17 Sep 2023 09:59:27 +0200
Subject: [PATCH] Hotfix

- Creation of user not possible
---
 .env.unix.example                             |  1 +
 Makefile                                      |  2 +
 dbrepo-broker-service/Dockerfile              |  2 -
 dbrepo-broker-service/rabbitmq.conf           |  2 +-
 dbrepo-metadata-service/Dockerfile            |  2 +-
 .../impl/BrokerServiceGatewayImpl.java        | 42 +++++++++----------
 dbrepo-ui/config.js                           | 34 +++++++--------
 dbrepo-ui/package.json                        |  2 +-
 dbrepo-ui/pages/login.vue                     | 15 ++-----
 docker-compose.yml                            |  5 +++
 10 files changed, 51 insertions(+), 56 deletions(-)

diff --git a/.env.unix.example b/.env.unix.example
index b0ad6ff053..9f087cb8e2 100644
--- a/.env.unix.example
+++ b/.env.unix.example
@@ -12,6 +12,7 @@ METADATA_PASSWORD=dbrepo
 AUTH_DB=keycloak
 AUTH_USERNAME=root
 AUTH_PASSWORD=dbrepo
+BROKER_ENDPOINT=http://broker-service:15672/api/broker
 BROKER_USERNAME=fda
 BROKER_PASSWORD=fda
 KEYCLOAK_ADMIN=fda
diff --git a/Makefile b/Makefile
index b6a203169d..1a9b877351 100644
--- a/Makefile
+++ b/Makefile
@@ -163,6 +163,8 @@ coverage-frontend: build-frontend
 test-frontend: build-frontend
 	yarn --cwd ./dbrepo-ui install
 	yarn --cwd ./dbrepo-ui run test:unit || true
+	yarn --cwd ./dbrepo-ui playwright install
+	yarn --cwd ./dbrepo-ui run test:e2e || true
 	yarn --cwd ./dbrepo-ui run coverage || true
 
 test-clients:
diff --git a/dbrepo-broker-service/Dockerfile b/dbrepo-broker-service/Dockerfile
index caef7401ec..78bc9bb462 100644
--- a/dbrepo-broker-service/Dockerfile
+++ b/dbrepo-broker-service/Dockerfile
@@ -13,5 +13,3 @@ RUN rabbitmq-plugins enable --offline rabbitmq_prometheus rabbitmq_mqtt rabbitmq
 
 EXPOSE 5672
 EXPOSE 15672
-
-HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD wget --spider http://localhost:15672/broker/
diff --git a/dbrepo-broker-service/rabbitmq.conf b/dbrepo-broker-service/rabbitmq.conf
index 23942bcede..a2b3bf521b 100644
--- a/dbrepo-broker-service/rabbitmq.conf
+++ b/dbrepo-broker-service/rabbitmq.conf
@@ -11,7 +11,7 @@ default_permissions.write = .*
 listeners.tcp.1 = 0.0.0.0:5672
 
 # management ui (https://www.rabbitmq.com/management.html#path-prefix)
-management.path_prefix = /broker
+management.path_prefix = /api/broker
 
 # logging
 log.console = true
diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile
index e9587b40fe..6e9c922e45 100644
--- a/dbrepo-metadata-service/Dockerfile
+++ b/dbrepo-metadata-service/Dockerfile
@@ -36,7 +36,7 @@ ENV ADMIN_MAIL="noreply@localhost"
 ENV BASE_URL="http://localhost"
 ENV GRANT_PRIVILEGES="SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"
 ENV BROKER_CONSUMERS=2
-ENV BROKER_ENDPOINT="http://broker-service:15672"
+ENV BROKER_ENDPOINT="http://broker-service:15672/api/broker"
 ENV BROKER_USERNAME=fda
 ENV BROKER_PASSWORD=fda
 ENV DELETED_RECORD=persistent
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java
index 52de16e2f3..de50b0538a 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java
@@ -47,16 +47,12 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
         this.gatewayConfig = gatewayConfig;
     }
 
-    private String parseUrl(String path) {
-        final String url = "/api" + path;
-        log.debug("parse url: {}", url);
-        return url;
-    }
-
     @Override
     public void createVirtualHost(CreateVirtualHostDto data) throws BrokerVirtualHostCreationException {
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/vhost"), HttpMethod.POST,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/vhost";
+        log.trace("POST {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED)) {
             log.error("Failed to create virtual host: {}", response.getStatusCode());
             throw new BrokerVirtualHostCreationException("Failed to create virtual host");
@@ -67,8 +63,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
     @Override
     public void grantPermission(String username, ExchangeUpdatePermissionsDto data)
             throws BrokerVirtualHostGrantException {
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/topic-permissions/dbrepo/" + username), HttpMethod.PUT,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/topic-permissions/dbrepo/" + username;
+        log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
             log.error("Failed to grant exchange: {}", response.getStatusCode());
             throw new BrokerVirtualHostGrantException("Failed to grant exchange");
@@ -82,8 +80,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
                 .passwordHash("")
                 .tags("")
                 .build();
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/users/" + username), HttpMethod.PUT,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/users/" + username;
+        log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
             log.error("Failed to create user: {}", response.getStatusCode());
             throw new BrokerVirtualHostCreationException("Failed to create user");
@@ -94,8 +94,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
     @Override
     public void grantPermission(String username, GrantVirtualHostPermissionsDto data)
             throws BrokerVirtualHostGrantException {
-        final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/permissions/dbrepo/" + username), HttpMethod.PUT,
-                new HttpEntity<>(data), Void.class);
+        final String url = "/api/permissions/dbrepo/" + username;
+        log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data),
+                Void.class);
         if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
             log.error("Failed to grant virtual host: {}", response.getStatusCode());
             throw new BrokerVirtualHostGrantException("Failed to grant virtual host");
@@ -105,16 +107,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway {
 
     @Override
     public List<ConsumerDto> findAllConsumers() {
-        final StringBuilder urlBuilder = new StringBuilder(gatewayConfig.getBrokerEndpoint())
-                .append("/api");
-        if (Arrays.stream(environment.getActiveProfiles()).noneMatch(p -> p.equals("junit"))) {
-            urlBuilder.append("/broker");
-        }
-        urlBuilder.append("/consumers/")
-                .append(VIRTUAL_SERVER);
+        final String url = "/api/consumers/" + VIRTUAL_SERVER;
         log.trace("gateway broker find all consumers, virtual server={}", VIRTUAL_SERVER);
-        final URI findUri = URI.create(urlBuilder.toString());
-        final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(findUri, HttpMethod.GET,
+        log.trace("GET {}{}", gatewayConfig.getBrokerEndpoint(), url);
+        final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(URI.create(url), HttpMethod.GET,
                 HttpEntity.EMPTY, new ParameterizedTypeReference<>() {
                 });
         return response.getBody();
diff --git a/dbrepo-ui/config.js b/dbrepo-ui/config.js
index 1ccca7b563..480968cd52 100644
--- a/dbrepo-ui/config.js
+++ b/dbrepo-ui/config.js
@@ -1,21 +1,21 @@
 const config = {}
 
-config.title = process.env.TITLE || null
-config.icon = process.env.ICON || null
-config.brokerUsername = process.env.BROKER_USERNAME || null
-config.brokerPassword = process.env.BROKER_PASSWORD || null
-config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || null
-config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || null
-config.sharedFilesystem = process.env.SHARED_FILESYSTEM || null
-config.version = process.env.VERSION || null
-config.logo = process.env.LOGO || null
-config.tokenMax = process.env.TOKEN_MAX || null
-config.searchUsername = process.env.SEARCH_USERNAME || null
-config.searchPassword = process.env.SEARCH_PASSWORD || null
-config.clientId = process.env.DBREPO_CLIENT_ID || null
-config.clientSecret = process.env.DBREPO_CLIENT_SECRET || null
-config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || null
-config.doiUrl = process.env.DOI_URL || null
-config.uploadPath = process.env.UPLOAD_PATH || null
+config.title = process.env.TITLE || 'Database Repository'
+config.icon = process.env.ICON || '/favicon.ico'
+config.brokerUsername = process.env.BROKER_USERNAME || 'fda'
+config.brokerPassword = process.env.BROKER_PASSWORD || 'fda'
+config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || '/broker/'
+config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || '/api/auth/'
+config.sharedFilesystem = process.env.SHARED_FILESYSTEM || '/tmp'
+config.version = process.env.VERSION || 'latest'
+config.logo = process.env.LOGO || '/logo.png'
+config.tokenMax = process.env.TOKEN_MAX || 5
+config.searchUsername = process.env.SEARCH_USERNAME || 'admin'
+config.searchPassword = process.env.SEARCH_PASSWORD || 'admin'
+config.clientId = process.env.DBREPO_CLIENT_ID || 'dbrepo-client'
+config.clientSecret = process.env.DBREPO_CLIENT_SECRET || 'MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG'
+config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || 'Example University'
+config.doiUrl = process.env.DOI_URL || 'https://doi.org'
+config.uploadPath = process.env.UPLOAD_PATH || '/tmp/'
 
 module.exports = config
diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json
index 61548c8c36..d9fc5ed031 100644
--- a/dbrepo-ui/package.json
+++ b/dbrepo-ui/package.json
@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "scripts": {
-    "dev": "NODE_ENV=development nuxt --port 3001",
+    "dev": "NODE_ENV=development nuxt --dotenv ../.env --port 3001",
     "docker": "nuxt > /dev/null",
     "build": "nuxt build",
     "start": "nuxt start",
diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue
index 4ffb24e8e7..d99b9622e9 100644
--- a/dbrepo-ui/pages/login.vue
+++ b/dbrepo-ui/pages/login.vue
@@ -51,19 +51,12 @@
             Login
           </v-btn>
         </v-card-actions>
+        <v-card-subtitle class="text-right">
+          <a v-if="rabbitMqUrl" color="orange" class="mr-1" plain :href="rabbitMqUrl">RabbitMQ Admin</a>
+          <a v-if="keycloakUrl" color="secondary" class="ml-1" plain :href="keycloakUrl">Keycloak Admin</a>
+        </v-card-subtitle>
       </v-card>
     </v-form>
-    <v-toolbar v-if="!token" flat>
-      <v-spacer />
-      <v-toolbar-title>
-        <v-btn v-if="rabbitMqUrl" color="orange" plain :href="rabbitMqUrl">
-          <v-icon left>mdi-rabbit</v-icon> RabbitMQ
-        </v-btn>
-        <v-btn v-if="keycloakUrl" color="secondary" plain :href="keycloakUrl">
-          <v-icon left>mdi-key</v-icon> Keycloak
-        </v-btn>
-      </v-toolbar-title>
-    </v-toolbar>
   </div>
 </template>
 
diff --git a/docker-compose.yml b/docker-compose.yml
index bd8b3eb5e6..32d7641a39 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -223,6 +223,11 @@ services:
     ports:
       - "5672:5672"
       - "15672:15672"
+    healthcheck:
+      test: wget -qO- localhost:15672/api/broker | grep "RabbitMQ" || exit 1
+      interval: 10s
+      timeout: 5s
+      retries: 12
     depends_on:
       dbrepo-authentication-service:
         condition: service_healthy
-- 
GitLab