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

[refactor] 닉네임 변경기한 설정 및 일부 API 응답값 조정 #117

Merged
merged 6 commits into from
Jan 25, 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
@@ -1,4 +1,5 @@
package com.haejwo.tripcometrue.domain.likes.controller;

import com.haejwo.tripcometrue.domain.likes.dto.response.PlaceReviewLikesResponseDto;
import com.haejwo.tripcometrue.domain.likes.dto.response.TripRecordReviewLikesResponseDto;
import com.haejwo.tripcometrue.domain.likes.service.LikesService;
Expand All @@ -10,17 +11,15 @@
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/v1/likes")
@RequiredArgsConstructor
public class LikesController {

private final LikesService likesService;

@PostMapping("/place-review/{placeReviewId}")
@PostMapping("/v1/places/reviews/{placeReviewId}/likes")
public ResponseEntity<ResponseDTO<PlaceReviewLikesResponseDto>> likePlaceReview(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable Long placeReviewId) {
Expand All @@ -29,7 +28,7 @@ public ResponseEntity<ResponseDTO<PlaceReviewLikesResponseDto>> likePlaceReview(
return ResponseEntity.ok(ResponseDTO.okWithData(responseDto));
}

@PostMapping("/trip-record-review/{tripRecordReviewId}")
@PostMapping("/v1/trip-records/reviews/{tripRecordReviewId}/likes")
public ResponseEntity<ResponseDTO<TripRecordReviewLikesResponseDto>> likeTripRecordReview(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable Long tripRecordReviewId) {
Expand All @@ -38,7 +37,7 @@ public ResponseEntity<ResponseDTO<TripRecordReviewLikesResponseDto>> likeTripRec
return ResponseEntity.ok(ResponseDTO.okWithData(responseDto));
}

@DeleteMapping("/place-review/{placeReviewId}")
@DeleteMapping("/v1/places/reviews/{placeReviewId}/likes")
public ResponseEntity<ResponseDTO<Void>> unlikePlaceReview(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable Long placeReviewId) {
Expand All @@ -47,7 +46,7 @@ public ResponseEntity<ResponseDTO<Void>> unlikePlaceReview(
return ResponseEntity.ok(ResponseDTO.ok());
}

@DeleteMapping("/trip-record-review/{tripRecordReviewId}")
@DeleteMapping("/v1/trip-records/reviews/{tripRecordReviewId}/likes")
public ResponseEntity<ResponseDTO<Void>> unlikeTripRecordReview(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable Long tripRecordReviewId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package com.haejwo.tripcometrue.domain.likes.service;

import com.haejwo.tripcometrue.domain.likes.dto.response.PlaceReviewLikesResponseDto;
import com.haejwo.tripcometrue.domain.likes.dto.response.TripRecordReviewLikesResponseDto;
import com.haejwo.tripcometrue.domain.likes.entity.PlaceReviewLikes;
Expand All @@ -8,15 +9,14 @@
import com.haejwo.tripcometrue.domain.likes.repository.TripRecordReviewLikesRepository;
import com.haejwo.tripcometrue.domain.member.entity.Member;
import com.haejwo.tripcometrue.domain.member.repository.MemberRepository;
import com.haejwo.tripcometrue.domain.place.exception.PlaceNotFoundException;
import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview;
import com.haejwo.tripcometrue.domain.review.placereview.exception.PlaceReviewNotFoundException;
import com.haejwo.tripcometrue.domain.review.placereview.repository.PlaceReviewRepository;
import com.haejwo.tripcometrue.domain.review.triprecordreview.entity.TripRecordReview;
import com.haejwo.tripcometrue.domain.review.triprecordreview.exception.TripRecordReviewNotFoundException;
import com.haejwo.tripcometrue.domain.review.triprecordreview.repository.TripRecordReviewRepository;
import com.haejwo.tripcometrue.domain.triprecord.exception.TripRecordNotFoundException;
import com.haejwo.tripcometrue.global.exception.ErrorCode;
import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails;
import jakarta.persistence.EntityNotFoundException;
import jakarta.transaction.Transactional;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -44,7 +44,7 @@ public PlaceReviewLikesResponseDto likePlaceReview(PrincipalDetails principalDet
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new InvalidLikesException(ErrorCode.USER_NOT_FOUND));
PlaceReview placeReview = placeReviewRepository.findById(placeReviewId)
.orElseThrow(() -> new EntityNotFoundException());
.orElseThrow(() -> new InvalidLikesException(ErrorCode.PLACE_REVIEW_NOT_FOUND));

PlaceReviewLikes like = PlaceReviewLikes.builder()
.member(member)
Expand All @@ -66,9 +66,9 @@ public TripRecordReviewLikesResponseDto likeTripRecordReview(PrincipalDetails pr
}

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new EntityNotFoundException());
.orElseThrow(() -> new InvalidLikesException(ErrorCode.USER_NOT_FOUND));
TripRecordReview tripRecordReview = tripRecordReviewRepository.findById(tripRecordReviewId)
.orElseThrow(() -> new EntityNotFoundException());
.orElseThrow(() -> new InvalidLikesException(ErrorCode.TRIP_RECORD_REVIEW_NOT_FOUND));

TripRecordReviewLikes like = TripRecordReviewLikes.builder()
.member(member)
Expand All @@ -94,7 +94,7 @@ public void unlikePlaceReview(PrincipalDetails principalDetails, Long placeRevie

private PlaceReview findByPlaceReviewId(Long placeReviewId) {
return placeReviewRepository.findById(placeReviewId)
.orElseThrow(PlaceNotFoundException::new);
.orElseThrow(PlaceReviewNotFoundException::new);
}

@Transactional
Expand All @@ -111,7 +111,7 @@ public void unlikeTripRecordReview(PrincipalDetails principalDetails, Long tripR

private TripRecordReview findByTripRecordReviewId(Long tripRecordReviewId) {
return tripRecordReviewRepository.findById(tripRecordReviewId)
.orElseThrow(TripRecordNotFoundException::new);
.orElseThrow(TripRecordReviewNotFoundException::new);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ public ResponseEntity<ResponseDTO<Void>> deleteAccount(@AuthenticationPrincipal
}

@GetMapping("/details")
public ResponseEntity<ResponseDTO<MemberDetailResponseDto>> getMemberDetails(@AuthenticationPrincipal PrincipalDetails principalDetails) {
public ResponseEntity<ResponseDTO<MemberDetailResponseDto>> getMemberDetails(
@AuthenticationPrincipal PrincipalDetails principalDetails) {
MemberDetailResponseDto responseDto = memberService.getMemberDetails(principalDetails);
ResponseDTO<MemberDetailResponseDto> response = ResponseDTO.okWithData(responseDto);
return ResponseEntity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -46,6 +47,8 @@ public class Member extends BaseTimeEntity {

private Double memberRating;

private LocalDateTime nickNameChangeTime;

@Builder
public Member(String email, String nickname, String password, String authority,
String provider, Double memberRating) {
Expand All @@ -66,6 +69,10 @@ public void updateNickNameChangeCount(){
this.nickNameChangeCount = (this.nickNameChangeCount == null) ? 1 : this.nickNameChangeCount + 1;
}

public void updateNickNameChangeTime(LocalDateTime nicknameChangeTime){
this.nickNameChangeTime = nicknameChangeTime;
}

public void updateTripLevel(){
this.tripLevel = TripLevel.getLevelByPoint(this.totalPoint);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.haejwo.tripcometrue.domain.member.exception;

import com.haejwo.tripcometrue.global.exception.ApplicationException;
import com.haejwo.tripcometrue.global.exception.ErrorCode;

public class NicknameChangeNotAvailableException extends ApplicationException {

private static ErrorCode ERROR_CODE = ErrorCode.NICKNAME_CHANGE_NOT_AVAILABLE;

public NicknameChangeNotAvailableException(){
super(ERROR_CODE);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
import com.haejwo.tripcometrue.domain.member.exception.NewPasswordNotMatchException;
import com.haejwo.tripcometrue.domain.member.exception.NewPasswordSameAsOldException;
import com.haejwo.tripcometrue.domain.member.exception.NicknameAlreadyExistsException;
import com.haejwo.tripcometrue.domain.member.exception.NicknameChangeNotAvailableException;
import com.haejwo.tripcometrue.domain.member.repository.MemberRepository;
import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -143,13 +146,22 @@ public IntroductionResponseDto updateIntroduction(

public NicknameResponseDto updateNickname(
PrincipalDetails principalDetails, NicknameRequestDto requestDto) {
Member member = memberRepository.findById(principalDetails.getMember().getId())
.orElseThrow();

memberRepository.findByMemberBaseNickname(requestDto.nickname())
.ifPresent(existingMember -> {
throw new NicknameAlreadyExistsException();
});
Member member = getLoginMember(principalDetails);

if(member.getNickNameChangeTime() != null &&
ChronoUnit.MONTHS.between(member.getNickNameChangeTime(), LocalDateTime.now()) < 6){
throw new NicknameChangeNotAvailableException();
}

member.getMemberBase().changeNickname(requestDto.nickname());
member.updateNickNameChangeCount();
member.updateNickNameChangeTime(LocalDateTime.now());

return NicknameResponseDto.fromEntity(member);
}
Expand All @@ -163,8 +175,7 @@ public void deleteAccount(PrincipalDetails principalDetails) {
}

public Member getLoginMember(PrincipalDetails principalDetails) {
Member member = memberRepository.findById(principalDetails.getMember().getId())
.orElseThrow();
Member member = principalDetails.getMember();
return member;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

public class PlaceReviewNotFoundException extends ApplicationException {

private static final ErrorCode ERROR_CODE = ErrorCode.PLACE_REVIEW_NOT_FOUND;
private static ErrorCode ERROR_CODE = ErrorCode.PLACE_REVIEW_NOT_FOUND;

public PlaceReviewNotFoundException() {
super(ERROR_CODE);
}
public PlaceReviewNotFoundException(){
super(ERROR_CODE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public enum ErrorCode {
EMAIL_NOT_MATCH(HttpStatus.BAD_REQUEST, "이메일이 일치하지 않습니다"),
NICKNAME_ALREADY_EXISTS(HttpStatus.BAD_REQUEST,"중복된 닉네임입니다."),
INTRODUCTION_TOO_LONG(HttpStatus.BAD_REQUEST, "소개는 20자 내로 작성해주세요."),
NICKNAME_CHANGE_NOT_AVAILABLE(HttpStatus.BAD_REQUEST, "닉네임 변경 불가기간(6개월)이 지나지 않았습니다."),

// CITY
CITY_NOT_FOUND(HttpStatus.BAD_REQUEST, "존재하지 않는 도시입니다."),
Expand Down
24 changes: 12 additions & 12 deletions src/test/http/likes/likes.http
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
### 여행지 리뷰 좋아요(placeReviewId 1에 대한)
POST http://localhost:8080/v1/likes/place-review/1
### 여행지 리뷰 좋아요
POST http://tripcometrue.site/v1/places/reviews/1/likes
Authorization: eyJraWQiOiJrZXkxIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJ0ZXN0MzMzQG5hdmVyLmNvbSIsImlhdCI6MTcwNjA5NDk1MSwiZXhwIjoxNzA2MjM4OTUxfQ.ojYq1REMoIfIKbP_0O3vcOdWXfASMMZP9d-srehCp7Y
Content-Type: application/json
Authorization: (로그인 후 토큰값)

### 여행지 리뷰 좋아요 취소(placeReviewId 1에 대한)
DELETE http://localhost:8080/v1/likes/place-review/1
### 여행지 리뷰 좋아요 취소
DELETE http://localhost:8080/v1/places/reviews/2/likes
Content-Type: application/json
Authorization: (로그인 후 토큰값)
Authorization: eyJraWQiOiJrZXkxIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJ0ZXN0MzMzQG5hdmVyLmNvbSIsImlhdCI6MTcwNjA5NTQzMywiZXhwIjoxNzA2MjM5NDMzfQ.iA2XkB0wWdxbL_S7BkCEDrTdrxbaW-l6Z2xqhBuOOyw

### 여행후기 리뷰 좋아요(tripRecordReviewId 1에 대한)
POST http://localhost:8080/v1/likes/trip-record-review/1
### 여행후기 리뷰 좋아요
POST http://localhost:8080/v1/trip-records/reviews/103/likes
Content-Type: application/json
Authorization: (로그인 후 토큰값)
Authorization: eyJraWQiOiJrZXkxIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJ0ZXN0MzMzQG5hdmVyLmNvbSIsImlhdCI6MTcwNjA5NTQzMywiZXhwIjoxNzA2MjM5NDMzfQ.iA2XkB0wWdxbL_S7BkCEDrTdrxbaW-l6Z2xqhBuOOyw

### 여행후기 리뷰 좋아요(tripRecordReviewId 1에 대한)
DELETE http://localhost:8080/v1/likes/trip-record-review/1
### 여행후기 리뷰 좋아요 취소
DELETE http://localhost:8080/v1/trip-records/reviews/102/likes
Content-Type: application/json
Authorization: (로그인 후 토큰값)
Authorization: eyJraWQiOiJrZXkxIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJ0ZXN0MzMzQG5hdmVyLmNvbSIsImlhdCI6MTcwNjA5NTQzMywiZXhwIjoxNzA2MjM5NDMzfQ.iA2XkB0wWdxbL_S7BkCEDrTdrxbaW-l6Z2xqhBuOOyw

Loading