From a57802e0fa76a62ff0e7d7720e2cbfce39f7282b Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 26 Sep 2024 14:55:37 +0200
Subject: [PATCH] OZG-3539 OZG-6824 add PUT method

---
 .../user/settings/UserSettingsResource.java   | 18 ++++
 .../settings/UserSettingsResourceTest.java    | 84 +++++++++++++++++++
 2 files changed, 102 insertions(+)

diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java
index a1bf4dc8..238146e1 100644
--- a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java
+++ b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java
@@ -28,6 +28,7 @@ import java.util.Objects;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.GET;
 import jakarta.ws.rs.PATCH;
+import jakarta.ws.rs.PUT;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
@@ -75,6 +76,7 @@ public class UserSettingsResource {
 		return resourceAssembler.toResource(userSettingsService.getByUserId(userId), userId, userManagerUrl);
 	}
 
+	@Deprecated
 	@PATCH
 	@ResponseStatus(200)
 	@Path("/{id}/settings")
@@ -91,6 +93,22 @@ public class UserSettingsResource {
 				.orElseThrow(() -> new FunctionalException(() -> "Invalid user id"));
 	}
 
+	@PUT
+	@ResponseStatus(200)
+	@Path("/{id}/settings")
+	@Produces({ MediaType.APPLICATION_JSON, RestMediaType.APPLICATION_HAL_JSON })
+	public HalEntityWrapper putUserSettings(@PathParam("id") String userId, UserSettings userSettings) {
+		checkUserAccess(userId);
+
+		if (Objects.isNull(userSettings)) {
+			throw new FunctionalException(() -> "Request Body missing.");
+		}
+
+		return userSettingsService.updateByUserId(userId, userSettings)
+				.map(updatedSettings -> resourceAssembler.toResource(updatedSettings, userId, userManagerUrl))
+				.orElseThrow(() -> new FunctionalException(() -> "Invalid user id"));
+	}
+
 	void checkUserAccess(String userId) {
 		var user = userService.findByExternalId(jwt.getSubject());
 
diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java
index 3cde1320..5919f450 100644
--- a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java
+++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java
@@ -198,6 +198,90 @@ class UserSettingsResourceTest {
 		}
 	}
 
+	@DisplayName("Update Usersettings")
+	@Nested
+	class TestPutUserSettings {
+
+		private final UserSettings userSettings = UserSettingsTestFactory.create();
+		private final UserSettings updatedUserSettings = UserSettingsTestFactory.create();
+
+		@DisplayName("with empty body")
+		@Nested
+		class TestOnEmptyBody {
+
+			@BeforeEach
+			void mockAccess() {
+				doNothing().when(resource).checkUserAccess(anyString());
+			}
+
+			@Test
+			void shouldThrowFunctionalExceptionOnMissingBody() {
+				assertThatExceptionOfType(FunctionalException.class).isThrownBy(() -> resource.putUserSettings(USER_ID, null))
+						.withMessageStartingWith("Functional error: Request Body missing");
+			}
+		}
+
+		@Nested
+		class TestUserIdNotExist {
+			@BeforeEach
+			void mockAccess() {
+				doNothing().when(resource).checkUserAccess(anyString());
+			}
+
+			@Test
+			void shouldThrowFunctionalExceptionIfInvalidUserId() {
+				var user = UserSettingsTestFactory.create();
+				assertThatExceptionOfType(FunctionalException.class)
+						.isThrownBy(() -> resource.putUserSettings("wrong_id", user))
+						.withMessageStartingWith("Functional error: Invalid user id");
+			}
+
+			@Test
+			void shouldThrowFunctionalExceptionIfEmptyUserId() {
+				var user = UserSettingsTestFactory.create();
+				assertThatExceptionOfType(FunctionalException.class)
+						.isThrownBy(() -> resource.putUserSettings("", user))
+						.withMessageStartingWith("Functional error: Invalid user id");
+			}
+		}
+
+		@DisplayName("with filled body")
+		@Nested
+		class TestFilledBody {
+
+			@BeforeEach
+			void mockAccess() {
+				doNothing().when(resource).checkUserAccess(anyString());
+				when(userSettingsService.updateByUserId(anyString(), any(UserSettings.class))).thenReturn(Optional.of(updatedUserSettings));
+			}
+
+			@Test
+			void shouldCheckAccess() {
+				when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null));
+				resource.putUserSettings(USER_ID, userSettings);
+
+				verify(resource).checkUserAccess(USER_ID);
+			}
+
+			@Test
+			void shouldCallUserSettingsService() {
+				when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null));
+				resource.putUserSettings(USER_ID, userSettings);
+
+				verify(userSettingsService).updateByUserId(USER_ID, userSettings);
+			}
+
+			@Test
+			void
+			shouldCallResourceAssembler() {
+				when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null));
+				resource.putUserSettings(USER_ID, userSettings);
+
+				verify(resourceAssembler).toResource(updatedUserSettings, USER_ID, USER_MANAGER_URL);
+			}
+		}
+	}
+
 	@DisplayName("Check User access")
 	@Nested
 	class TestCheckUserAccess {
-- 
GitLab