From 8acc80b95a6a8702fc1ef79e0288e39aeefee8b1 Mon Sep 17 00:00:00 2001
From: giovanni frison <giovanni.frison@consultant.aruba.it>
Date: Mon, 17 Feb 2025 17:12:24 +0100
Subject: [PATCH 1/3] SIMPL-10085 added disable/enable kc user endpoints

changelog: added
---
 .gitignore                                    |  1 +
 .../controllers/UserController.java           | 10 +++++
 .../controllers/UserControllerV1.java         | 10 +++++
 .../services/KeycloakUserService.java         |  3 ++
 .../impl/KeycloakUserServiceImpl.java         | 27 ++++++++++++++
 src/main/resources/application-local.yml      | 37 -------------------
 6 files changed, 51 insertions(+), 37 deletions(-)
 delete mode 100644 src/main/resources/application-local.yml

diff --git a/.gitignore b/.gitignore
index 549e00a2..f19d3e8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,4 @@ build/
 
 ### VS Code ###
 .vscode/
+/src/main/resources/application-local.yml
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java
index c2303680..5d119f1c 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java
@@ -93,4 +93,14 @@ public class UserController implements UserExchange {
         log.info("Received POST request for importing [{}] users and relative roles", users.size());
         userService.importUsers(users);
     }
+
+    public void disableUser(String userId) {
+        log.info("Received DISABLE request for user with uuid [{}]", userId);
+        userService.disableUser(userId);
+    }
+
+    public void enableUser(String userId) {
+        log.info("Received ENABLE request for user with uuid [{}]", userId);
+        userService.enableUser(userId);
+    }
 }
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java
index 2516f4e0..a2da237d 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java
@@ -35,6 +35,16 @@ public class UserControllerV1 implements UsersApi {
         controller.deleteUser(uuid);
     }
 
+    @Override
+    public void disableUser(String userId) {
+        controller.disableUser(userId);
+    }
+
+    @Override
+    public void enableUser(String userId) {
+        controller.enableUser(userId);
+    }
+
     @Override
     public List<KeycloakRoleDTO> getRoles(String uuid) {
         return mapper.toV1(controller.getRoles(uuid));
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java
index 659a5150..b23a3121 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java
@@ -50,4 +50,7 @@ public interface KeycloakUserService {
     List<RoleRepresentation> getRoleList();
 
     void logout();
+
+    void disableUser(String userId);
+    void enableUser(String userId);
 }
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java
index dd98d238..0681791d 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java
@@ -13,12 +13,15 @@ import jakarta.ws.rs.ClientErrorException;
 import jakarta.ws.rs.NotFoundException;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.Response;
+
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
 import java.util.regex.Pattern;
+
 import lombok.extern.log4j.Log4j2;
 import org.keycloak.admin.client.resource.RoleResource;
+import org.keycloak.admin.client.resource.UsersResource;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.springframework.http.HttpStatus;
@@ -324,4 +327,28 @@ public class KeycloakUserServiceImpl implements KeycloakUserService {
             throw new KeycloakException(e.getResponse());
         }
     }
+
+    @Override
+    public void disableUser(String userId) {
+        try {
+            var userResource = keycloakService.getAppRealm().users().get(userId);
+            var user = userResource.toRepresentation();
+            user.setEnabled(false);
+            userResource.update(user);
+        } catch (ClientErrorException e) {
+            throw new KeycloakException(e.getResponse());
+        }
+    }
+
+    @Override
+    public void enableUser(String userId) {
+        try {
+            var userResource = keycloakService.getAppRealm().users().get(userId);
+            var user = userResource.toRepresentation();
+            user.setEnabled(true);
+            userResource.update(user);
+        } catch (ClientErrorException e) {
+            throw new KeycloakException(e.getResponse());
+        }
+    }
 }
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
deleted file mode 100644
index 66418326..00000000
--- a/src/main/resources/application-local.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-spring:
-  datasource:
-    url: jdbc:postgresql://localhost:5432/usersroles
-    username: usersroles
-    password: usersroles
-  jpa:
-    properties:
-      hibernate:
-        generate_statistics: false
-        format_sql: true
-
-logging:
-  config: classpath:log4j2-local.xml
-
-keycloak:
-  url: http://localhost:9010/auth
-  master:
-    user: user
-    password: admin
-  app:
-    realm: participant
-    client-id: frontend-cli
-  client-to-realm-role-migration:
-    enabled: false # Set to true to import realm roles from client roles
-    client-ids: [ "frontend-cli"]
-client:
-  authority:
-    url: https://tls.authority.aruba-simpl.cloud
-
-server:
-  port: 8081
-
-microservice:
-  identity-provider:
-    url: http://localhost:8081
-  authentication-provider:
-    url: http://localhost:8085
-- 
GitLab


From 79fc2d495dc674202982e12a9323a337b98d7af1 Mon Sep 17 00:00:00 2001
From: giovanni frison <giovanni.frison@consultant.aruba.it>
Date: Mon, 17 Feb 2025 17:14:01 +0100
Subject: [PATCH 2/3] SIMPL-10085 added test coverage

changelog: added
---
 .../impl/KeycloakUserServiceImplTest.java     | 47 +++++++++++++++++--
 1 file changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java
index 73e00698..3d767370 100644
--- a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java
+++ b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java
@@ -26,11 +26,7 @@ import java.util.UUID;
 import org.instancio.Instancio;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
-import org.keycloak.admin.client.resource.RealmResource;
-import org.keycloak.admin.client.resource.RoleByIdResource;
-import org.keycloak.admin.client.resource.RoleResource;
-import org.keycloak.admin.client.resource.RolesResource;
-import org.keycloak.admin.client.resource.UsersResource;
+import org.keycloak.admin.client.resource.*;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.mockito.Answers;
@@ -516,4 +512,45 @@ class KeycloakUserServiceImplTest {
         when(response.getStatus()).thenReturn(500);
         return clientErrorException;
     }
+
+    @Test
+    void disable_success() {
+        var userResource = mock(UserResource.class);
+        var userRepresentation = an(UserRepresentation.class);
+        var userId = UUID.randomUUID().toString();
+        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
+        given(userResource.toRepresentation()).willReturn(userRepresentation);
+        assertDoesNotThrow(() -> keycloakUserService.disableUser(userId));
+    }
+
+    @Test
+    void disable_error() {
+        var exception = generateClientErrorException();
+        var userResource = mock(UserResource.class);
+        var userId = UUID.randomUUID().toString();
+        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
+        given(userResource.toRepresentation()).willThrow(exception);
+        assertThrows(KeycloakException.class, () -> keycloakUserService.disableUser(userId));
+    }
+
+    @Test
+    void enable_success() {
+        var userResource = mock(UserResource.class);
+        var userRepresentation = an(UserRepresentation.class);
+        var userId = UUID.randomUUID().toString();
+        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
+        given(userResource.toRepresentation()).willReturn(userRepresentation);
+        assertDoesNotThrow(() -> keycloakUserService.enableUser(userId));
+    }
+
+    @Test
+    void enable_error() {
+        var exception = generateClientErrorException();
+        var userResource = mock(UserResource.class);
+        var userId = UUID.randomUUID().toString();
+        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
+        given(userResource.toRepresentation()).willThrow(exception);
+        assertThrows(KeycloakException.class, () -> keycloakUserService.enableUser(userId));
+    }
+
 }
-- 
GitLab


From bbce23454ff7c553659ddd29f100455a8c36aeca Mon Sep 17 00:00:00 2001
From: giovanni frison <giovanni.frison@consultant.aruba.it>
Date: Wed, 19 Feb 2025 12:20:01 +0100
Subject: [PATCH 3/3] SIMPL-7613 reverted changes to respect belgif

changelog: deleted
---
 .../configurations/ClientConfig.java          |  2 +-
 .../controllers/UserController.java           | 10 ----
 .../controllers/UserControllerV1.java         | 10 ----
 .../services/KeycloakUserService.java         |  3 --
 .../impl/KeycloakUserServiceImpl.java         | 27 -----------
 .../impl/KeycloakUserServiceImplTest.java     | 47 ++-----------------
 6 files changed, 6 insertions(+), 93 deletions(-)

diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java b/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java
index 101d7c4c..a3531c0d 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/configurations/ClientConfig.java
@@ -84,7 +84,7 @@ public class ClientConfig {
                 KeyPairExchange.class);
     }
 
-    private <E> E buildExchange(URI baseurl, RestClient.Builder restClientBuilder, Class<E> clazz) {
+    private static <E> E buildExchange(URI baseurl, RestClient.Builder restClientBuilder, Class<E> clazz) {
         var restClient = restClientBuilder
                 .baseUrl(baseurl)
                 .requestFactory(new JdkClientHttpRequestFactory())
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java
index 5d119f1c..c2303680 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserController.java
@@ -93,14 +93,4 @@ public class UserController implements UserExchange {
         log.info("Received POST request for importing [{}] users and relative roles", users.size());
         userService.importUsers(users);
     }
-
-    public void disableUser(String userId) {
-        log.info("Received DISABLE request for user with uuid [{}]", userId);
-        userService.disableUser(userId);
-    }
-
-    public void enableUser(String userId) {
-        log.info("Received ENABLE request for user with uuid [{}]", userId);
-        userService.enableUser(userId);
-    }
 }
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java
index a2da237d..2516f4e0 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/controllers/UserControllerV1.java
@@ -35,16 +35,6 @@ public class UserControllerV1 implements UsersApi {
         controller.deleteUser(uuid);
     }
 
-    @Override
-    public void disableUser(String userId) {
-        controller.disableUser(userId);
-    }
-
-    @Override
-    public void enableUser(String userId) {
-        controller.enableUser(userId);
-    }
-
     @Override
     public List<KeycloakRoleDTO> getRoles(String uuid) {
         return mapper.toV1(controller.getRoles(uuid));
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java
index b23a3121..659a5150 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/KeycloakUserService.java
@@ -50,7 +50,4 @@ public interface KeycloakUserService {
     List<RoleRepresentation> getRoleList();
 
     void logout();
-
-    void disableUser(String userId);
-    void enableUser(String userId);
 }
diff --git a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java
index 0681791d..dd98d238 100644
--- a/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java
+++ b/src/main/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImpl.java
@@ -13,15 +13,12 @@ import jakarta.ws.rs.ClientErrorException;
 import jakarta.ws.rs.NotFoundException;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.Response;
-
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
 import java.util.regex.Pattern;
-
 import lombok.extern.log4j.Log4j2;
 import org.keycloak.admin.client.resource.RoleResource;
-import org.keycloak.admin.client.resource.UsersResource;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.springframework.http.HttpStatus;
@@ -327,28 +324,4 @@ public class KeycloakUserServiceImpl implements KeycloakUserService {
             throw new KeycloakException(e.getResponse());
         }
     }
-
-    @Override
-    public void disableUser(String userId) {
-        try {
-            var userResource = keycloakService.getAppRealm().users().get(userId);
-            var user = userResource.toRepresentation();
-            user.setEnabled(false);
-            userResource.update(user);
-        } catch (ClientErrorException e) {
-            throw new KeycloakException(e.getResponse());
-        }
-    }
-
-    @Override
-    public void enableUser(String userId) {
-        try {
-            var userResource = keycloakService.getAppRealm().users().get(userId);
-            var user = userResource.toRepresentation();
-            user.setEnabled(true);
-            userResource.update(user);
-        } catch (ClientErrorException e) {
-            throw new KeycloakException(e.getResponse());
-        }
-    }
 }
diff --git a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java
index 3d767370..73e00698 100644
--- a/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java
+++ b/src/test/java/eu/europa/ec/simpl/usersroles/services/impl/KeycloakUserServiceImplTest.java
@@ -26,7 +26,11 @@ import java.util.UUID;
 import org.instancio.Instancio;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
-import org.keycloak.admin.client.resource.*;
+import org.keycloak.admin.client.resource.RealmResource;
+import org.keycloak.admin.client.resource.RoleByIdResource;
+import org.keycloak.admin.client.resource.RoleResource;
+import org.keycloak.admin.client.resource.RolesResource;
+import org.keycloak.admin.client.resource.UsersResource;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.mockito.Answers;
@@ -512,45 +516,4 @@ class KeycloakUserServiceImplTest {
         when(response.getStatus()).thenReturn(500);
         return clientErrorException;
     }
-
-    @Test
-    void disable_success() {
-        var userResource = mock(UserResource.class);
-        var userRepresentation = an(UserRepresentation.class);
-        var userId = UUID.randomUUID().toString();
-        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
-        given(userResource.toRepresentation()).willReturn(userRepresentation);
-        assertDoesNotThrow(() -> keycloakUserService.disableUser(userId));
-    }
-
-    @Test
-    void disable_error() {
-        var exception = generateClientErrorException();
-        var userResource = mock(UserResource.class);
-        var userId = UUID.randomUUID().toString();
-        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
-        given(userResource.toRepresentation()).willThrow(exception);
-        assertThrows(KeycloakException.class, () -> keycloakUserService.disableUser(userId));
-    }
-
-    @Test
-    void enable_success() {
-        var userResource = mock(UserResource.class);
-        var userRepresentation = an(UserRepresentation.class);
-        var userId = UUID.randomUUID().toString();
-        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
-        given(userResource.toRepresentation()).willReturn(userRepresentation);
-        assertDoesNotThrow(() -> keycloakUserService.enableUser(userId));
-    }
-
-    @Test
-    void enable_error() {
-        var exception = generateClientErrorException();
-        var userResource = mock(UserResource.class);
-        var userId = UUID.randomUUID().toString();
-        given(keycloakService.getAppRealm().users().get(userId)).willReturn(userResource);
-        given(userResource.toRepresentation()).willThrow(exception);
-        assertThrows(KeycloakException.class, () -> keycloakUserService.enableUser(userId));
-    }
-
 }
-- 
GitLab