Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#57] 닉네임 변경 API 구현 완료 #61

Merged
merged 4 commits into from
May 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading