Skip to content

Commit

Permalink
[Feat] nickname 필드 추가 및 닉네임 변경 api 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
jiyunio committed Dec 18, 2024
1 parent 3670fb5 commit e865581
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 23 deletions.
10 changes: 8 additions & 2 deletions src/main/java/com/jiyunio/todolist/member/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
27 changes: 11 additions & 16 deletions src/main/java/com/jiyunio/todolist/member/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -43,7 +40,7 @@ public ResponseEntity<ResponseMemberDTO> 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<JwtDTO> signIn(@Valid @RequestBody SignInDTO signInDto) {
return ResponseEntity.ok(memberService.signIn(signInDto));
}
Expand All @@ -59,30 +56,28 @@ public ResponseEntity<ResponseMemberDTO> 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<ResponseMemberDTO> 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<ResponseMemberDTO> 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<ResponseDTO> 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);

}
}

26 changes: 23 additions & 3 deletions src/main/java/com/jiyunio/todolist/member/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -33,14 +35,15 @@ 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())) {
// 회원가입 성공
Member member = Member.builder()
.userId(signUpDto.getUserId())
.userPw(passwordEncoder.encode(signUpDto.getUserPw()))
.nickname(signUpDto.getNickname())
.build();

memberRepository.save(member);
Expand All @@ -53,6 +56,7 @@ public ResponseMemberDTO signUp(@Valid SignUpDTO signUpDto) {
return ResponseMemberDTO.builder()
.memberId(member.getId())
.userId(member.getUserId())
.nickname(member.getNickname())
.build();
}
// 비밀번호 불일치
Expand All @@ -70,33 +74,49 @@ 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 {
// 변경 비밀번호 불일치
throw new CustomException(HttpStatus.BAD_REQUEST, ErrorCode.NOT_SAME_CONFIRM_PASSWORD);
}
} 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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public class SignInDTO {
private String userId;

@NotBlank(message = "비밀번호를 입력하세요.")
@Schema(description = "회원의 비밀번호", example = "qwer1234!")
@Schema(description = "회원의 비밀번호", example = "qwer123!")
private String userPw;
}
4 changes: 4 additions & 0 deletions src/main/java/com/jiyunio/todolist/member/dto/SignUpDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,8 @@ public class SignUpDTO {
@NotBlank(message = "확인 비밀번호를 입력하세요.")
@Schema(description = "회원 확인 비밀번호", example = "qwer123!")
private String confirmUserPw;

@NotBlank(message = "닉네임을 입력하세요.")
@Schema(description = "닉네임", example = "곽두철")
private String nickname;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

0 comments on commit e865581

Please sign in to comment.