Skip to content

Commit

Permalink
[#57] 닉네임 변경 API 구현 완료 (#61)
Browse files Browse the repository at this point in the history
* feat: 닉네임 변경 api 구현

* chore: 클래스 병합(memberservice1, memberrepository1) 및 패키지 이동(querydlsconfig)

* feat: 닉네임 변경 요청 바디 변경 및 유효성 체크
  • Loading branch information
Bellroute authored May 26, 2024
1 parent e201b6b commit 51b55e2
Show file tree
Hide file tree
Showing 15 changed files with 223 additions and 151 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
authId = JwtUtil.getAuthId(token);
providerType = JwtUtil.getProviderType(token);

return memberRepository.findByAuthIdAndProviderType(authId, providerType).orElseThrow(NoSuchElementException::new);
return memberRepository.findByAuthIdAndProviderType(authId, providerType).orElseThrow(() -> new NoSuchElementException("존재하지 않는 회원: " + authId + " " + providerType));
}

Optional<Cookie> refreshTokenCookie = CookieUtils.getCookie(request, JwtUtil.REFRESH_TOKEN_NAME);
token = refreshTokenCookie.orElseThrow(AuthenticationException::new).getValue();
authId = JwtUtil.getAuthId(token);
providerType = JwtUtil.getProviderType(token);

return memberRepository.findByAuthIdAndProviderType(authId, providerType).orElseThrow(NoSuchElementException::new);
return memberRepository.findByAuthIdAndProviderType(authId, providerType).orElseThrow(() -> new NoSuchElementException("존재하지 않는 회원: " + authId + " " + providerType));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.climingo.climingoApi.config;
package com.climingo.climingoApi.global.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
Expand All @@ -7,7 +7,7 @@
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuerydslConfiguration {
public class QuerydslConfig {

@PersistenceContext
private EntityManager entityManager;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import jakarta.validation.ConstraintViolationException;
import java.util.NoSuchElementException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
Expand Down Expand Up @@ -41,4 +44,21 @@ public ExceptionResponse constraintViolationExceptionHandler(ConstraintViolation
log.error("[error]", e);
return ExceptionResponse.of(HttpStatus.BAD_REQUEST.getReasonPhrase(), e.getMessage());
}

@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(DataIntegrityViolationException.class)
public ExceptionResponse handleDataIntegrityViolationException(DataIntegrityViolationException e) {
return ExceptionResponse.of(HttpStatus.CONFLICT.getReasonPhrase(), e.getMessage());
}

@ResponseStatus(HttpStatus.FORBIDDEN)
@ExceptionHandler(AccessDeniedException.class)
public ExceptionResponse handleAccessDeniedException(AccessDeniedException e) {
return ExceptionResponse.of(HttpStatus.FORBIDDEN.getReasonPhrase(), e.getMessage());
}

@ExceptionHandler(HttpMessageNotReadableException.class)
public ExceptionResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
return ExceptionResponse.of(HttpStatus.BAD_REQUEST.getReasonPhrase(), e.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.climingo.climingoApi.member.api;

import com.climingo.climingoApi.global.auth.LoginMember;
import com.climingo.climingoApi.member.api.request.UpdateNicknameRequest;
import com.climingo.climingoApi.member.application.MemberService;
import com.climingo.climingoApi.member.api.response.MemberInfoResponse;
import com.climingo.climingoApi.member.api.response.ProfileResponse;
import com.climingo.climingoApi.member.domain.Member;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class MemberController {

private final MemberService memberService;

@GetMapping("/members")
public ResponseEntity<ProfileResponse> findMyInfo() {
ProfileResponse profileResponse = memberService.findMyInfo(1L);
return ResponseEntity.ok().body(profileResponse);
}

@GetMapping("/members/{memberId}")
public ResponseEntity<MemberInfoResponse> findMemberInfo(@PathVariable(value = "memberId") Long memberId) {
MemberInfoResponse memberInfoResponse = memberService.findMemberInfo(memberId);
return ResponseEntity.ok().body(memberInfoResponse);
}

@PatchMapping("/members/{memberId}/nickname")
public ResponseEntity<Void> updateNickname(@LoginMember Member member, @PathVariable(value = "memberId") Long memberId, @RequestBody @Valid UpdateNicknameRequest request) {
memberService.updateNickname(member, memberId, request.getNickname());
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.climingo.climingoApi.member.api.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
@JsonDeserialize(builder = UpdateNicknameRequest.UpdateNicknameRequestBuilder.class)
public class UpdateNicknameRequest {

@JsonProperty("nickname")
@NotNull
private final String nickname;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.climingo.climingoApi.member.application.response;
package com.climingo.climingoApi.member.api.response;

import com.climingo.climingoApi.member.domain.Member;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.climingo.climingoApi.member.application.response;
package com.climingo.climingoApi.member.api.response;

import com.climingo.climingoApi.record.api.response.RecordResponse;
import java.util.List;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,64 +1,14 @@
package com.climingo.climingoApi.member.application;

import com.climingo.climingoApi.auth.api.request.SignUpRequest;
import com.climingo.climingoApi.auth.api.response.MemberInfo;
import com.climingo.climingoApi.auth.application.SignInService;
import com.climingo.climingoApi.auth.application.SignUpService;
import com.climingo.climingoApi.member.api.response.MemberInfoResponse;
import com.climingo.climingoApi.member.api.response.ProfileResponse;
import com.climingo.climingoApi.member.domain.Member;
import com.climingo.climingoApi.member.domain.MemberRepository;
import java.util.NoSuchElementException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class MemberService implements SignUpService, SignInService {
public interface MemberService {

private final MemberRepository memberRepository;
ProfileResponse findMyInfo(Long memberId);

@Transactional
@Override
public MemberInfo signUp(SignUpRequest request) {
Member member = Member.builder()
.authId(request.getAuthId())
.providerType(request.getProviderType())
.nickname(request.getNickname())
.profileUrl(request.getProfileUrl())
.physicalInfo(request.getPhysicalInfo())
.build();
MemberInfoResponse findMemberInfo(Long memberId);

validateAbleToSignUp(member);

member = memberRepository.save(member);
return new MemberInfo(member);
}

private void validateAbleToSignUp(Member member) {
// 중복 가입 여부 확인
if (isDuplicatedMember(member.getAuthId(), member.getProviderType())) {
throw new IllegalArgumentException("이미 존재하는 회원입니다.");
}

if (isDuplicatedNickname(member.getNickname())) {
throw new IllegalArgumentException("이미 존재하는 닉네임입니다.");
}
}

private boolean isDuplicatedNickname(String nickname) {
return memberRepository.existsByNickname(nickname);
}

private boolean isDuplicatedMember(String authId, String providerType) {
return memberRepository.existsByAuthIdAndProviderType(authId, providerType);
}

@Override
public MemberInfo findEnrolledMemberInfoByAuthIdAndProviderType(String authId,
String providerType) {
Member member = memberRepository.findByAuthIdAndProviderType(authId, providerType)
.orElseThrow(() -> new NoSuchElementException("등록되지 않은 사용자. 회원가입을 먼저 진행하세요."));

return new MemberInfo(member);
}
void updateNickname(Member member, Long memberId, String nickname);
}

This file was deleted.

Loading

0 comments on commit 51b55e2

Please sign in to comment.