From e865581db3a67587d7e8f06ea0ac357474167479 Mon Sep 17 00:00:00 2001 From: jiyunio Date: Wed, 18 Dec 2024 22:17:15 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20nickname=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jiyunio/todolist/member/Member.java | 10 +++++-- .../todolist/member/MemberController.java | 27 ++++++++----------- .../todolist/member/MemberService.java | 26 +++++++++++++++--- .../todolist/member/dto/SignInDTO.java | 2 +- .../todolist/member/dto/SignUpDTO.java | 4 +++ .../responseDTO/ResponseMemberDTO.java | 7 ++++- 6 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/jiyunio/todolist/member/Member.java b/src/main/java/com/jiyunio/todolist/member/Member.java index 711ddf6..50b2088 100644 --- a/src/main/java/com/jiyunio/todolist/member/Member.java +++ b/src/main/java/com/jiyunio/todolist/member/Member.java @@ -13,21 +13,27 @@ public class Member { @Column(name = "member_id") private Long id; - @Column(columnDefinition = "text") private String userId; private String userPw; + private String nickname; + private String role; @Builder - private Member(String userId, String userPw) { + private Member(String userId, String userPw, String nickname) { this.userId = userId; this.userPw = userPw; + this.nickname = nickname; this.role = "ROLE_USER"; } protected void updateUserPw(String userPw) { this.userPw = userPw; } + + protected void updateNickname(String nickname) { + this.nickname = nickname; + } } diff --git a/src/main/java/com/jiyunio/todolist/member/MemberController.java b/src/main/java/com/jiyunio/todolist/member/MemberController.java index f70d712..e30bd12 100644 --- a/src/main/java/com/jiyunio/todolist/member/MemberController.java +++ b/src/main/java/com/jiyunio/todolist/member/MemberController.java @@ -15,14 +15,11 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.net.URI; - @RestController @RequiredArgsConstructor @RequestMapping("/member") @@ -43,7 +40,7 @@ public ResponseEntity signUp(@Valid @RequestBody SignUpDTO si @Operation(summary = "로그인", description = "아이디와 비밀번호 이용") @ApiResponse(responseCode = "200", description = "로그인 성공", content = @Content(schema = @Schema(implementation = ResponseMemberDTO.class))) @ApiResponse(responseCode = "400", description = "빈칸", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) - @ApiResponse(responseCode = "404", description = "회원 및 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) + @ApiResponse(responseCode = "401", description = "회원 및 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) public ResponseEntity signIn(@Valid @RequestBody SignInDTO signInDto) { return ResponseEntity.ok(memberService.signIn(signInDto)); } @@ -59,30 +56,28 @@ public ResponseEntity getMember(@AuthenticationPrincipal Cust @Operation(summary = "회원 비밀번호 수정", description = "비밀번호, 수정 비밀번호 이용") @ApiResponse(responseCode = "200", description = "비밀번호 업데이터 성공", content = @Content(schema = @Schema(implementation = ResponseMemberDTO.class))) @ApiResponse(responseCode = "400", description = "빈칸", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) - @ApiResponse(responseCode = "404", description = "회원 및 비밀번호 불일치 / 변경 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) + @ApiResponse(responseCode = "401", description = "회원 및 비밀번호 불일치 / 변경 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) public ResponseEntity updateUserPw(@AuthenticationPrincipal CustomUserDetails user, @Valid @RequestBody ChangeUserPwDTO changeUserPwDto) { return ResponseEntity.ok(memberService.updateUserPw(user.getUsername(), changeUserPwDto)); } + @PatchMapping("/{nickname}") + @Operation(summary = "닉네임 수정") + @ApiResponse(responseCode = "200", description = "닉네임 수정 성공", content = @Content(schema = @Schema(implementation = ResponseDTO.class))) + @ApiResponse(responseCode = "404", description = "존재하지 않는 회원", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) + public ResponseEntity patchNickname(@AuthenticationPrincipal CustomUserDetails user, @PathVariable String nickname) { + return ResponseEntity.ok(memberService.updateNickname(user.getUsername(), nickname)); + } + @DeleteMapping("") @Operation(summary = "회원 탈퇴") @ApiResponse(responseCode = "200", description = "회원 탈퇴 성공", content = @Content(schema = @Schema(implementation = ResponseDTO.class))) - @ApiResponse(responseCode = "404", description = "회원 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) + @ApiResponse(responseCode = "404", description = "존재하지 않는 회원", content = @Content(schema = @Schema(implementation = ErrorDTO.class))) public ResponseEntity deleteMember(@AuthenticationPrincipal CustomUserDetails user) { memberService.deleteMember(user.getUsername()); return ResponseEntity.ok(ResponseDTO.builder() .msg("회원 탈퇴 성공") .build()); } - - //test - @GetMapping("/app-link") - public ResponseEntity redirectToYouTube() { - // YouTube 앱 딥링크로 리다이렉트 - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.setLocation(URI.create("youtube://-BjZmE2gtdo")); - return new ResponseEntity<>(httpHeaders, HttpStatus.MOVED_PERMANENTLY); - - } } diff --git a/src/main/java/com/jiyunio/todolist/member/MemberService.java b/src/main/java/com/jiyunio/todolist/member/MemberService.java index 7bd3396..dec6101 100644 --- a/src/main/java/com/jiyunio/todolist/member/MemberService.java +++ b/src/main/java/com/jiyunio/todolist/member/MemberService.java @@ -19,9 +19,11 @@ import org.springframework.security.core.Authentication; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor +@Transactional public class MemberService { private final MemberRepository memberRepository; private final TodoService todoService; @@ -33,7 +35,7 @@ public class MemberService { public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) { if (memberRepository.existsByUserId(signUpDto.getUserId())) { // 이미 존재하는 아이디 - throw new CustomException(HttpStatus.BAD_REQUEST, ErrorCode.EXIST_USERID); + throw new CustomException(HttpStatus.CONFLICT, ErrorCode.EXIST_USERID); } if (signUpDto.getUserPw().equals(signUpDto.getConfirmUserPw())) { @@ -41,6 +43,7 @@ public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) { Member member = Member.builder() .userId(signUpDto.getUserId()) .userPw(passwordEncoder.encode(signUpDto.getUserPw())) + .nickname(signUpDto.getNickname()) .build(); memberRepository.save(member); @@ -53,6 +56,7 @@ public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) { return ResponseMemberDTO.builder() .memberId(member.getId()) .userId(member.getUserId()) + .nickname(member.getNickname()) .build(); } // 비밀번호 불일치 @@ -70,22 +74,25 @@ public ResponseMemberDTO getMember(String userId) { return ResponseMemberDTO.builder() .memberId(member.getId()) .userId(member.getUserId()) + .nickname(member.getNickname()) .build(); } + public ResponseMemberDTO updateUserPw(String userId, @Valid ChangeUserPwDTO changeUserPwDto) { Member member = memberRepository.findByUserId(userId).orElseThrow( () -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER) ); + if (passwordEncoder.matches(changeUserPwDto.getUserPw(), member.getUserPw())) { // 회원 비밀번호 확인 if (changeUserPwDto.getChangePw().equals(changeUserPwDto.getConfirmChangePw())) { // 비밀번호 업데이트 성공 member.updateUserPw(passwordEncoder.encode(changeUserPwDto.getChangePw())); - memberRepository.save(member); return ResponseMemberDTO.builder() .memberId(member.getId()) .userId(member.getUserId()) + .nickname(member.getNickname()) .build(); } else { // 변경 비밀번호 불일치 @@ -93,10 +100,23 @@ public ResponseMemberDTO updateUserPw(String userId, @Valid ChangeUserPwDTO chan } } else { // 회원의 비밀번호와 불일치 - throw new CustomException(HttpStatus.NOT_FOUND, ErrorCode.WRONG_USERID_PASSWORD); + throw new CustomException(HttpStatus.UNAUTHORIZED, ErrorCode.WRONG_USERID_PASSWORD); } } + public ResponseMemberDTO updateNickname(String userId, String nickname) { + Member member = memberRepository.findByUserId(userId).orElseThrow( + () -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER) + ); + member.updateNickname(nickname); + + return ResponseMemberDTO.builder() + .memberId(member.getId()) + .userId(member.getUserId()) + .nickname(member.getNickname()) + .build(); + } + public void deleteMember(String userId) { Member member = memberRepository.findByUserId(userId).orElseThrow( () -> new CustomException(HttpStatus.NOT_FOUND, ErrorCode.NOT_EXIST_MEMBER) diff --git a/src/main/java/com/jiyunio/todolist/member/dto/SignInDTO.java b/src/main/java/com/jiyunio/todolist/member/dto/SignInDTO.java index da7effb..ee944f4 100644 --- a/src/main/java/com/jiyunio/todolist/member/dto/SignInDTO.java +++ b/src/main/java/com/jiyunio/todolist/member/dto/SignInDTO.java @@ -13,6 +13,6 @@ public class SignInDTO { private String userId; @NotBlank(message = "비밀번호를 입력하세요.") - @Schema(description = "회원의 비밀번호", example = "qwer1234!") + @Schema(description = "회원의 비밀번호", example = "qwer123!") private String userPw; } diff --git a/src/main/java/com/jiyunio/todolist/member/dto/SignUpDTO.java b/src/main/java/com/jiyunio/todolist/member/dto/SignUpDTO.java index 9126c33..7c65944 100644 --- a/src/main/java/com/jiyunio/todolist/member/dto/SignUpDTO.java +++ b/src/main/java/com/jiyunio/todolist/member/dto/SignUpDTO.java @@ -24,4 +24,8 @@ public class SignUpDTO { @NotBlank(message = "확인 비밀번호를 입력하세요.") @Schema(description = "회원 확인 비밀번호", example = "qwer123!") private String confirmUserPw; + + @NotBlank(message = "닉네임을 입력하세요.") + @Schema(description = "닉네임", example = "곽두철") + private String nickname; } diff --git a/src/main/java/com/jiyunio/todolist/responseDTO/ResponseMemberDTO.java b/src/main/java/com/jiyunio/todolist/responseDTO/ResponseMemberDTO.java index c43945c..474a86e 100644 --- a/src/main/java/com/jiyunio/todolist/responseDTO/ResponseMemberDTO.java +++ b/src/main/java/com/jiyunio/todolist/responseDTO/ResponseMemberDTO.java @@ -18,9 +18,14 @@ public class ResponseMemberDTO { @Schema(description = "회원의 userId", example = "jiyun123") private String userId; + @NotBlank + @Schema(description = "회원의 userId", example = "jiyun123") + private String nickname; + @Builder - protected ResponseMemberDTO(Long memberId, String userId) { + private ResponseMemberDTO(Long memberId, String userId, String nickname) { this.memberId = memberId; this.userId = userId; + this.nickname = nickname; } }