From 293e19c319a44c283367bd78bfcdb79119e3c71b Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Mon, 15 Apr 2024 10:01:24 +0200
Subject: [PATCH] OZG-5400

---
 .../KeycloakGenericRemoteService.java         |  4 +++
 .../realm/KeycloakRealmReconciler.java        |  1 +
 .../realm/KeycloakRealmRemoteService.java     |  3 +++
 .../keycloak/realm/KeycloakRealmService.java  | 25 +++++++++++++++++++
 4 files changed, 33 insertions(+)

diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
index 53e57ffe..d61b07f4 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
@@ -4,6 +4,7 @@ import java.util.Objects;
 import java.util.Optional;
 
 import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.representations.idm.ClientRepresentation;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
@@ -42,4 +43,7 @@ public class KeycloakGenericRemoteService {
 				.stream().filter(role -> Objects.equals(roleName, role.getName()))
 				.findFirst();
 	}
+	public Optional<RealmResource> getRealm(String realm) {
+		return Optional.ofNullable(keycloak.realm(realm)).findFirst();
+	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
index a7778735..c5615868 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -51,6 +51,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
 			var realmName = resource.getMetadata().getNamespace();
 
 			service.createRealm(resource.getSpec(), realmName);
+			service.createOrUpdateClient(resource.getSpec(), resource.getMetadata().getNamespace());
 
 			resource.setStatus(OzgCloudKeycloakRealmStatus.builder().status(OzgCloudCustomResourceStatus.OK).message(null).build());
 			return UpdateControl.updateStatus(resource);
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
index 2e291ab5..ddac507d 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
@@ -27,6 +27,7 @@ import java.util.Objects;
 import java.util.Optional;
 
 import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.springframework.stereotype.Component;
@@ -47,4 +48,6 @@ class KeycloakRealmRemoteService {
 	public void deleteRealm(String realmName) {
 		keycloak.realm(realmName).remove();
 	}
+
+	
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
index 279a0557..4ecfa164 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
@@ -49,11 +49,36 @@ class KeycloakRealmService {
 				.ifPresent(remoteService::createRealm);
 	}
 
+	void createOrUpdateRealm(OzgCloudKeycloakRealmSpec spec, String realmName) {
+		keycloakGenericRemoteService.getRealm(realmName)
+				.ifPresentOrElse(existingRealm -> updateRealm(existingRealm, spec, namespace),
+						() -> createRealm(spec, namespace));
+	}
+
+	void createOrUpdateClient(OzgCloudKeycloakClientSpec spec, String namespace) {
+		genericRemoteService.getByClientId(spec.getClientId(), namespace)
+				.ifPresentOrElse(existingClient -> updateClient(existingClient, spec, namespace),
+						() -> createClient(spec, namespace));
+	}
+
+	void updateClient(ClientRepresentation existingClient, OzgCloudKeycloakClientSpec spec, String realm) {
+		var clientRepresentation = mapper.update(existingClient, spec);
+		setProtocolMapper(clientRepresentation);
+		remoteService.updateClient(clientRepresentation, realm);
+
+		addOrUpdateClientRoles(spec, realm, existingClient.getId());
+	}
+
+
 	RealmRepresentation addRealmName(RealmRepresentation realm, String realmName) {
 		realm.setRealm(realmName);
 		return realm;
 	}
 
+	String getRealmName(RealmRepresentation realm) {
+		return realm.getRealm();
+	}
+
 	public void deleteRealm(String realmName) {
 		remoteService.deleteRealm(realmName);
 	}
-- 
GitLab