From 7c6754e74cc0f535dd5fc7ccfbe97c15d7fc3d8a Mon Sep 17 00:00:00 2001 From: Ahn Su-gyeong Date: Wed, 24 Apr 2024 02:07:34 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Feature:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: Feature: 회원 정보 수정 API 구현 * :memo: Docs: UserInfoUpdateRequest Example 작성 --- .../auth/presentation/AuthController.java | 2 +- .../zzangdol/user/business/UserFacade.java | 8 +++++++ .../user/implement/UserCommandService.java | 10 +++++++++ .../implement/UserCommandServiceImpl.java | 19 ++++++++++++++++ .../user/presentation/UserController.java | 12 ++++++++++ .../dto/request/UserInfoUpdateRequest.java | 22 +++++++++++++++++++ .../main/java/zzangdol/user/domain/User.java | 14 +++++++++++- 7 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandService.java create mode 100644 moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandServiceImpl.java create mode 100644 moodoodle-api/src/main/java/zzangdol/user/presentation/dto/request/UserInfoUpdateRequest.java diff --git a/moodoodle-api/src/main/java/zzangdol/auth/presentation/AuthController.java b/moodoodle-api/src/main/java/zzangdol/auth/presentation/AuthController.java index 1d77af2..cb6d58c 100644 --- a/moodoodle-api/src/main/java/zzangdol/auth/presentation/AuthController.java +++ b/moodoodle-api/src/main/java/zzangdol/auth/presentation/AuthController.java @@ -36,7 +36,7 @@ public class AuthController { }) @Operation(summary = "인증 이메일 발송", description = "지정된 이메일 주소로 인증 이메일을 발송합니다.") @PostMapping("/send-verification-email") - public ResponseDto sendVerificationEmail(@RequestParam String email) { + public ResponseDto sendVerificationEmail(@RequestParam("email") String email) { return ResponseDto.onSuccess(authFacade.sendVerificationEmail(email)); } diff --git a/moodoodle-api/src/main/java/zzangdol/user/business/UserFacade.java b/moodoodle-api/src/main/java/zzangdol/user/business/UserFacade.java index 21cfa8a..99b5c60 100644 --- a/moodoodle-api/src/main/java/zzangdol/user/business/UserFacade.java +++ b/moodoodle-api/src/main/java/zzangdol/user/business/UserFacade.java @@ -2,6 +2,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import zzangdol.user.implement.UserCommandService; +import zzangdol.user.presentation.dto.request.UserInfoUpdateRequest; import zzangdol.user.presentation.dto.response.UserInfoResponse; import zzangdol.user.domain.User; @@ -9,8 +11,14 @@ @Component public class UserFacade { + private final UserCommandService userCommandService; + public UserInfoResponse getUserInfo(User user) { return UserMapper.toUserInfoResponse(user); } + public UserInfoResponse updateUserInfo(User user, UserInfoUpdateRequest request) { + return UserMapper.toUserInfoResponse(userCommandService.updateUserInfo(user, request)); + } + } diff --git a/moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandService.java b/moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandService.java new file mode 100644 index 0000000..4e0d71f --- /dev/null +++ b/moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandService.java @@ -0,0 +1,10 @@ +package zzangdol.user.implement; + +import zzangdol.user.domain.User; +import zzangdol.user.presentation.dto.request.UserInfoUpdateRequest; + +public interface UserCommandService { + + User updateUserInfo(User user, UserInfoUpdateRequest request); + +} diff --git a/moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandServiceImpl.java b/moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandServiceImpl.java new file mode 100644 index 0000000..67a6a08 --- /dev/null +++ b/moodoodle-api/src/main/java/zzangdol/user/implement/UserCommandServiceImpl.java @@ -0,0 +1,19 @@ +package zzangdol.user.implement; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import zzangdol.user.domain.User; +import zzangdol.user.presentation.dto.request.UserInfoUpdateRequest; + +@Transactional +@Service +public class UserCommandServiceImpl implements UserCommandService { + + @Override + public User updateUserInfo(User user, UserInfoUpdateRequest request) { + user.updateNickname(request.getNickname()); + user.updateNotificationTime(request.getNotificationTime()); + return user; + } + +} diff --git a/moodoodle-api/src/main/java/zzangdol/user/presentation/UserController.java b/moodoodle-api/src/main/java/zzangdol/user/presentation/UserController.java index bb390b7..6854da0 100644 --- a/moodoodle-api/src/main/java/zzangdol/user/presentation/UserController.java +++ b/moodoodle-api/src/main/java/zzangdol/user/presentation/UserController.java @@ -5,10 +5,13 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import zzangdol.global.annotation.AuthUser; import zzangdol.user.business.UserFacade; +import zzangdol.user.presentation.dto.request.UserInfoUpdateRequest; import zzangdol.user.presentation.dto.response.UserInfoResponse; import zzangdol.response.ResponseDto; import zzangdol.user.domain.User; @@ -31,4 +34,13 @@ public ResponseDto getUserInfo(@AuthUser User user) { return ResponseDto.onSuccess(userFacade.getUserInfo(user)); } + @Operation( + summary = "사용자 정보 수정 🔑", + description = "사용자의 정보를 수정합니다." + ) + @PatchMapping + public ResponseDto updateUserInfo(@AuthUser User user, @RequestBody UserInfoUpdateRequest request) { + return ResponseDto.onSuccess(userFacade.updateUserInfo(user, request)); + } + } diff --git a/moodoodle-api/src/main/java/zzangdol/user/presentation/dto/request/UserInfoUpdateRequest.java b/moodoodle-api/src/main/java/zzangdol/user/presentation/dto/request/UserInfoUpdateRequest.java new file mode 100644 index 0000000..c2cf9a1 --- /dev/null +++ b/moodoodle-api/src/main/java/zzangdol/user/presentation/dto/request/UserInfoUpdateRequest.java @@ -0,0 +1,22 @@ +package zzangdol.user.presentation.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserInfoUpdateRequest { + + @Schema(example = "짱짱돌") + private String nickname; + + @Schema(example = "20:00") + private LocalTime notificationTime; + +} diff --git a/moodoodle-domain/src/main/java/zzangdol/user/domain/User.java b/moodoodle-domain/src/main/java/zzangdol/user/domain/User.java index 3457c30..0728cdc 100644 --- a/moodoodle-domain/src/main/java/zzangdol/user/domain/User.java +++ b/moodoodle-domain/src/main/java/zzangdol/user/domain/User.java @@ -38,7 +38,6 @@ public class User extends BaseTimeEntity implements UserDetails { @Enumerated(EnumType.STRING) private Role role; - @Builder public User(String email, String password, String nickname, AuthProvider authProvider, Role role, LocalTime notificationTime) { @@ -79,4 +78,17 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return true; } + + public void updateNickname(String nickname) { + if (nickname != null) { + this.nickname = nickname; + } + } + + public void updateNotificationTime(LocalTime notificationTime) { + if (notificationTime != null) { + this.notificationTime = notificationTime; + } + } + }