Skip to content

Commit

Permalink
Merge pull request #31 from Gamegoo-repo/feat/29
Browse files Browse the repository at this point in the history
[Feat/29] ์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ API ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ
  • Loading branch information
Eunjin3395 authored Dec 11, 2024
2 parents f6b727d + cafd122 commit 153fe0b
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,12 @@ public ApiResponse<FriendRequestResponse> acceptFriendRequest(@PathVariable(name
return ApiResponse.ok(friendFacadeService.acceptFriendRequest(member, targetMemberId));
}

@Operation(summary = "์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ API", description = "๋Œ€์ƒ ํšŒ์›์ด ๋ณด๋‚ธ ์นœ๊ตฌ ์š”์ฒญ์„ ๊ฑฐ์ ˆ ์ฒ˜๋ฆฌํ•˜๋Š” API ์ž…๋‹ˆ๋‹ค.")
@Parameter(name = "memberId", description = "์นœ๊ตฌ ์š”์ฒญ์„ ๊ฑฐ์ ˆํ•  ๋Œ€์ƒ ํšŒ์›์˜ id ์ž…๋‹ˆ๋‹ค.")
@PatchMapping("/request/{memberId}/reject")
public ApiResponse<FriendRequestResponse> rejectFriendRequest(@PathVariable(name = "memberId") Long targetMemberId,
@AuthMember Member member) {
return ApiResponse.ok(friendFacadeService.rejectFriendRequest(member, targetMemberId));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,19 @@ public FriendRequestResponse acceptFriendRequest(Member member, Long targetMembe
return FriendRequestResponse.of(friendRequest.getFromMember().getId(), "์นœ๊ตฌ ์š”์ฒญ ์ˆ˜๋ฝ ์„ฑ๊ณต");
}

/**
* ์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ Facade ๋ฉ”์†Œ๋“œ
*
* @param member
* @param targetMemberId
* @return
*/
@Transactional
public FriendRequestResponse rejectFriendRequest(Member member, Long targetMemberId) {
Member targetMember = memberService.findMember(targetMemberId);
FriendRequest friendRequest = friendService.rejectFriendRequest(member, targetMember);

return FriendRequestResponse.of(friendRequest.getFromMember().getId(), "์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์„ฑ๊ณต");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,31 @@ public FriendRequest acceptFriendRequest(Member member, Member targetMember) {
return friendRequest;
}

/**
* targetMember๊ฐ€ ๋ณด๋‚ธ ์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ
*
* @param member
* @param targetMember
* @return
*/
@Transactional
public FriendRequest rejectFriendRequest(Member member, Member targetMember) {
// targetMember๋กœ ๋‚˜ ์ž์‹ ์„ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ๊ฒ€์ฆ
validateNotSelf(member, targetMember);

// ์ˆ˜๋ฝ ๋Œ€๊ธฐ ์ƒํƒœ์ธ FriendRequest ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ๋ฐ ๊ฒ€์ฆ
FriendRequest friendRequest = friendRequestRepository.findByFromMemberAndToMemberAndStatus(targetMember,
member, FriendRequestStatus.PENDING)
.orElseThrow(() -> new FriendException(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST));

// FriendRequest ์—”ํ‹ฐํ‹ฐ ์ƒํƒœ ๋ณ€๊ฒฝ
friendRequest.updateStatus(FriendRequestStatus.REJECTED);

// targetMember์—๊ฒŒ ์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์•Œ๋ฆผ ์ƒ์„ฑ

return friendRequest;
}

private void validateNotSelf(Member member, Member targetMember) {
if (member.equals(targetMember)) {
throw new FriendException(ErrorCode.FRIEND_BAD_REQUEST);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,55 @@ void acceptFriendRequestFailedWhenNoPendingRequest() throws Exception {

}

@Nested
@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ")
class rejectFriendRequestTest {

@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์„ฑ๊ณต")
@Test
void rejectFriendRequestSucceeds() throws Exception {
// given
FriendRequestResponse response = FriendRequestResponse.builder()
.targetMemberId(TARGET_MEMBER_ID)
.message("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์„ฑ๊ณต")
.build();

given(friendFacadeService.rejectFriendRequest(any(), any())).willReturn(response);

// when // then
mockMvc.perform(patch(API_URL_PREFIX + "/request/{memberId}/reject", TARGET_MEMBER_ID))
.andExpect(status().isOk())
.andExpect(jsonPath("$.message").value("OK"))
.andExpect(jsonPath("$.data.message").value("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์„ฑ๊ณต"))
.andExpect(jsonPath("$.data.targetMemberId").value(TARGET_MEMBER_ID));
}

@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์‹คํŒจ: ๋ณธ์ธ id๋ฅผ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ์—๋Ÿฌ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.")
@Test
void rejectFriendRequestFailedWhenTargetIsSelf() throws Exception {
// given
willThrow(new FriendException(ErrorCode.FRIEND_BAD_REQUEST))
.given(friendFacadeService).rejectFriendRequest(any(), eq(TARGET_MEMBER_ID));

// when // then
mockMvc.perform(patch(API_URL_PREFIX + "/request/{memberId}/reject", TARGET_MEMBER_ID))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message").value(ErrorCode.FRIEND_BAD_REQUEST.getMessage()));
}

@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์‹คํŒจ: PENDING ์ƒํƒœ์ธ ์นœ๊ตฌ ์š”์ฒญ์ด ์—†๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.")
@Test
void rejectFriendRequestFailedWhenNoPendingRequest() throws Exception {
// given
willThrow(new FriendException(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST))
.given(friendFacadeService).rejectFriendRequest(any(), eq(TARGET_MEMBER_ID));

// when // then
mockMvc.perform(patch(API_URL_PREFIX + "/request/{memberId}/reject", TARGET_MEMBER_ID))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.message").value(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST.getMessage()));
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

@ActiveProfiles("test")
Expand Down Expand Up @@ -206,7 +207,7 @@ void acceptFriendRequest_shouldThrowWhenTargetIsSelf() {

@DisplayName("์นœ๊ตฌ ์š”์ฒญ ์ˆ˜๋ฝ ์‹คํŒจ: PENDING ์ƒํƒœ์ธ ์นœ๊ตฌ ์š”์ฒญ์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค")
@Test
void accpetFriendRequest_shouldThrowWhenNoPendingRequest() {
void acceptFriendRequest_shouldThrowWhenNoPendingRequest() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);
Member targetMember = createMember("target@naver.com", "target");
Expand All @@ -217,6 +218,50 @@ void accpetFriendRequest_shouldThrowWhenNoPendingRequest() {
.hasMessage(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST.getMessage());
}


@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์„ฑ๊ณต")
@Test
void rejectFriendRequestSucceeds() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);
Member targetMember = createMember("target@naver.com", "target");

// ์ƒ๋Œ€ -> ๋‚˜ ์นœ๊ตฌ ์š”์ฒญ ์ƒ์„ฑ
friendRequestRepository.save(FriendRequest.create(targetMember, member));

// when
FriendRequestResponse response = friendFacadeService.rejectFriendRequest(member, targetMember.getId());

// then
assertThat(response.getTargetMemberId()).isEqualTo(targetMember.getId());
assertFalse(friendRepository.existsByFromMemberAndToMember(member, targetMember));
}

@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์‹คํŒจ: ๋ณธ์ธ id๋ฅผ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.")
@Test
void rejectFriendRequest_shouldThrowWhenTargetIsSelf() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);

// when // then
assertThatThrownBy(() -> friendFacadeService.rejectFriendRequest(member, member.getId()))
.isInstanceOf(FriendException.class)
.hasMessage(ErrorCode.FRIEND_BAD_REQUEST.getMessage());
}

@DisplayName("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ ์‹คํŒจ: PENDING ์ƒํƒœ์ธ ์นœ๊ตฌ ์š”์ฒญ์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค")
@Test
void rejectFriendRequest_shouldThrowWhenNoPendingRequest() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);
Member targetMember = createMember("target@naver.com", "target");

// when // then
assertThatThrownBy(() -> friendFacadeService.rejectFriendRequest(member, targetMember.getId()))
.isInstanceOf(FriendException.class)
.hasMessage(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST.getMessage());
}

private Member createMember(String email, String gameName) {
return memberRepository.save(Member.builder()
.email(email)
Expand Down

0 comments on commit 153fe0b

Please sign in to comment.