diff --git a/backend/src/main/java/online/wesal/wesal/controller/AuthController.java b/backend/src/main/java/online/wesal/wesal/controller/AuthController.java index 3da8b40..071fc4b 100644 --- a/backend/src/main/java/online/wesal/wesal/controller/AuthController.java +++ b/backend/src/main/java/online/wesal/wesal/controller/AuthController.java @@ -69,7 +69,7 @@ public class AuthController { } @PostMapping("/updateUser") - @Operation(summary = "Update user information", description = "Update authenticated user's fcmToken, displayName, avatar, password, or username") + @Operation(summary = "Update user information", description = "Update authenticated user's fcmToken, displayName, avatar, password, username, or subscriptions") public ResponseEntity> updateUser(@Valid @RequestBody UpdateUserRequest request) { try { User user = userService.updateUser( @@ -77,7 +77,8 @@ public class AuthController { request.getDisplayName(), request.getAvatar(), request.getPassword(), - request.getUsername() + request.getUsername(), + request.getSubscriptions() ); // Create user data without password @@ -89,7 +90,8 @@ public class AuthController { "avatar", user.getAvatar() != null ? user.getAvatar() : "", "fcmToken", user.getFcmToken() != null ? user.getFcmToken() : "", "activated", user.isActivated(), - "role", user.getRole() + "role", user.getRole(), + "subscriptions", user.getSubscriptions() ); return ResponseEntity.ok(Map.of( diff --git a/backend/src/main/java/online/wesal/wesal/dto/UpdateUserRequest.java b/backend/src/main/java/online/wesal/wesal/dto/UpdateUserRequest.java index 942e892..e885631 100644 --- a/backend/src/main/java/online/wesal/wesal/dto/UpdateUserRequest.java +++ b/backend/src/main/java/online/wesal/wesal/dto/UpdateUserRequest.java @@ -1,6 +1,7 @@ package online.wesal.wesal.dto; import jakarta.validation.constraints.Size; +import java.util.List; public class UpdateUserRequest { @@ -15,6 +16,8 @@ public class UpdateUserRequest { @Size(min = 6, message = "Password must be at least 8 characters long") private String password; + private List subscriptions; + public UpdateUserRequest() {} public String getFcmToken() { @@ -56,4 +59,12 @@ public class UpdateUserRequest { public void setUsername(String username) { this.username = username; } + + public List getSubscriptions() { + return subscriptions; + } + + public void setSubscriptions(List subscriptions) { + this.subscriptions = subscriptions; + } } \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/entity/User.java b/backend/src/main/java/online/wesal/wesal/entity/User.java index 25e900e..3740136 100644 --- a/backend/src/main/java/online/wesal/wesal/entity/User.java +++ b/backend/src/main/java/online/wesal/wesal/entity/User.java @@ -4,6 +4,11 @@ import jakarta.persistence.*; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; +import java.util.Arrays; @Entity @Table(name = "users") @@ -40,6 +45,9 @@ public class User { @Column(nullable = false) private String role = "USER"; + @Column(columnDefinition = "TEXT") + private String subscriptions = "[\"newinvites\",\"invitesfollowup\",\"appnews\"]"; + public User() {} public User(String email, String password, String displayName) { @@ -119,4 +127,25 @@ public class User { public void setRole(String role) { this.role = role; } + + public List getSubscriptions() { + if (subscriptions == null || subscriptions.isEmpty()) { + return Arrays.asList("newinvites", "invitesfollowup", "appnews"); + } + try { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(subscriptions, new TypeReference>() {}); + } catch (Exception e) { + return Arrays.asList("newinvites", "invitesfollowup", "appnews"); + } + } + + public void setSubscriptions(List subscriptions) { + try { + ObjectMapper mapper = new ObjectMapper(); + this.subscriptions = mapper.writeValueAsString(subscriptions); + } catch (Exception e) { + this.subscriptions = "[\"newinvites\",\"invitesfollowup\",\"appnews\"]"; + } + } } \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/service/UserService.java b/backend/src/main/java/online/wesal/wesal/service/UserService.java index 244f340..d9c5be2 100644 --- a/backend/src/main/java/online/wesal/wesal/service/UserService.java +++ b/backend/src/main/java/online/wesal/wesal/service/UserService.java @@ -7,6 +7,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.List; @Service public class UserService { @@ -56,7 +57,7 @@ public class UserService { return userRepository.save(user); } - public User updateUser(String fcmToken, String displayName, String avatar, String password, String username) { + public User updateUser(String fcmToken, String displayName, String avatar, String password, String username, List subscriptions) { User user = getCurrentUser(); boolean wasNotActivated = !user.isActivated(); @@ -86,6 +87,10 @@ public class UserService { user.setUsername(username); } + if (subscriptions != null && !subscriptions.isEmpty()) { + user.setSubscriptions(subscriptions); + } + User savedUser = userRepository.save(user); if (wasNotActivated) {