diff --git a/src/main/java/org/websoso/WSSServer/controller/UserController.java b/src/main/java/org/websoso/WSSServer/controller/UserController.java index ba2714bb..103a72cb 100644 --- a/src/main/java/org/websoso/WSSServer/controller/UserController.java +++ b/src/main/java/org/websoso/WSSServer/controller/UserController.java @@ -32,6 +32,7 @@ import org.websoso.WSSServer.dto.user.ProfileStatusResponse; import org.websoso.WSSServer.dto.user.RegisterUserInfoRequest; import org.websoso.WSSServer.dto.user.TermsSettingGetResponse; +import org.websoso.WSSServer.dto.user.TermsSettingRequest; import org.websoso.WSSServer.dto.user.UpdateMyProfileRequest; import org.websoso.WSSServer.dto.user.UserIdAndNicknameResponse; import org.websoso.WSSServer.dto.user.UserInfoGetResponse; @@ -248,4 +249,15 @@ public ResponseEntity getTermsSettingValue(Principal pr .status(OK) .body(userService.getTermsSettingValue(user)); } + + @PatchMapping("/terms-settings") + public ResponseEntity updateTermsSetting(Principal principal, + @Valid @RequestBody TermsSettingRequest termsSettingRequest) { + User user = userService.getUserOrException(Long.valueOf(principal.getName())); + userService.updateTermsSetting(user, termsSettingRequest.serviceAgreed(), termsSettingRequest.privacyAgreed(), + termsSettingRequest.marketingAgreed()); + return ResponseEntity + .status(NO_CONTENT) + .build(); + } } diff --git a/src/main/java/org/websoso/WSSServer/domain/User.java b/src/main/java/org/websoso/WSSServer/domain/User.java index 48238c3d..d4840ed1 100644 --- a/src/main/java/org/websoso/WSSServer/domain/User.java +++ b/src/main/java/org/websoso/WSSServer/domain/User.java @@ -160,4 +160,10 @@ public void editMyInfo(EditMyInfoRequest editMyInfoRequest) { public void updatePushSetting(boolean isPushEnabled) { this.isPushEnabled = isPushEnabled; } + + public void updateTermsSetting(boolean serviceAgreed, boolean privacyAgreed, boolean marketingAgreed) { + this.serviceAgreed = serviceAgreed; + this.privacyAgreed = privacyAgreed; + this.marketingAgreed = marketingAgreed; + } } diff --git a/src/main/java/org/websoso/WSSServer/dto/user/TermsSettingRequest.java b/src/main/java/org/websoso/WSSServer/dto/user/TermsSettingRequest.java new file mode 100644 index 00000000..e8dcd65d --- /dev/null +++ b/src/main/java/org/websoso/WSSServer/dto/user/TermsSettingRequest.java @@ -0,0 +1,13 @@ +package org.websoso.WSSServer.dto.user; + +import jakarta.validation.constraints.NotNull; + +public record TermsSettingRequest( + @NotNull(message = "웹소소 이용약관 동의 여부는 null일 수 없습니다.") + Boolean serviceAgreed, + @NotNull(message = "개인정보 수집 동의 여부는 null일 수 없습니다.") + Boolean privacyAgreed, + @NotNull(message = "마케팅 활용 및 이벤트 정보 수신 동의 여부는 null일 수 없습니다.") + Boolean marketingAgreed +) { +} diff --git a/src/main/java/org/websoso/WSSServer/exception/error/CustomUserError.java b/src/main/java/org/websoso/WSSServer/exception/error/CustomUserError.java index d24f46dd..47659942 100644 --- a/src/main/java/org/websoso/WSSServer/exception/error/CustomUserError.java +++ b/src/main/java/org/websoso/WSSServer/exception/error/CustomUserError.java @@ -31,7 +31,8 @@ public enum CustomUserError implements ICustomError { PRIVATE_PROFILE_STATUS("USER-015", "프로필 공개 설정이 비공개이므로 접근할 수 없습니다.", FORBIDDEN), ALREADY_SET_AVATAR("USER-016", "아바타는 이미 설정된 아바타와 동일합니다.", BAD_REQUEST), ALREADY_SET_INTRO("USER-017", "소개글은 이미 설정된 소개글과 동일합니다.", BAD_REQUEST), - INACCESSIBLE_USER_PROFILE("USER-018", "해당 사용자는 접근할 수 없는 상태입니다.", FORBIDDEN); + INACCESSIBLE_USER_PROFILE("USER-018", "해당 사용자는 접근할 수 없는 상태입니다.", FORBIDDEN), + TERMS_AGREEMENT_REQUIRED("USER-019", "서비스 이용약관 및 개인정보 수집 동의는 필수입니다.", BAD_REQUEST); private final String code; private final String description; diff --git a/src/main/java/org/websoso/WSSServer/service/UserService.java b/src/main/java/org/websoso/WSSServer/service/UserService.java index 81bec36e..b989718f 100644 --- a/src/main/java/org/websoso/WSSServer/service/UserService.java +++ b/src/main/java/org/websoso/WSSServer/service/UserService.java @@ -1,5 +1,6 @@ package org.websoso.WSSServer.service; +import static java.lang.Boolean.FALSE; import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.JOIN; import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.WITHDRAW; import static org.websoso.WSSServer.exception.error.CustomAvatarError.AVATAR_NOT_FOUND; @@ -10,6 +11,7 @@ import static org.websoso.WSSServer.exception.error.CustomUserError.ALREADY_SET_PROFILE_STATUS; import static org.websoso.WSSServer.exception.error.CustomUserError.DUPLICATED_NICKNAME; import static org.websoso.WSSServer.exception.error.CustomUserError.INACCESSIBLE_USER_PROFILE; +import static org.websoso.WSSServer.exception.error.CustomUserError.TERMS_AGREEMENT_REQUIRED; import static org.websoso.WSSServer.exception.error.CustomUserError.USER_NOT_FOUND; import java.util.List; @@ -284,4 +286,13 @@ public TermsSettingGetResponse getTermsSettingValue(User user) { return TermsSettingGetResponse.of(user.getServiceAgreed(), user.getPrivacyAgreed(), user.getMarketingAgreed()); } + + public void updateTermsSetting(User user, Boolean serviceAgreed, Boolean privacyAgreed, + Boolean marketingAgreed) { + if (FALSE.equals(serviceAgreed) || FALSE.equals(privacyAgreed)) { + throw new CustomUserException(TERMS_AGREEMENT_REQUIRED, + "service terms and personal information consent are mandatory"); + } + user.updateTermsSetting(serviceAgreed, privacyAgreed, marketingAgreed); + } }