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

[BE] 쓴 피드백은 피드백 모아보기에서 바로 볼 수 있도록 변경 + 리팩터링(#613) #617

Merged
merged 12 commits into from
Oct 19, 2024
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static corea.global.util.MapHandler.extractDistinctKeyStreams;
Expand All @@ -30,7 +31,8 @@ public class UserFeedbackService {
public UserFeedbackResponse getDeliveredFeedback(long feedbackDeliverId) {
Map<Long, List<FeedbackResponse>> deliveredDevelopFeedback = getDeliveredDevelopFeedback(feedbackDeliverId);
Map<Long, List<FeedbackResponse>> deliverSocialFeedback = getDeliveredSocialFeedback(feedbackDeliverId);
return getUserFeedbackResponse(deliveredDevelopFeedback, deliverSocialFeedback);

return getUserFeedbackResponse(deliveredDevelopFeedback, deliverSocialFeedback, room -> true);
}

private Map<Long, List<FeedbackResponse>> getDeliveredDevelopFeedback(long feedbackDeliverId) {
Expand All @@ -50,7 +52,8 @@ private Map<Long, List<FeedbackResponse>> getDeliveredSocialFeedback(long feedba
public UserFeedbackResponse getReceivedFeedback(long feedbackReceiverId) {
Map<Long, List<FeedbackResponse>> receivedDevelopFeedback = getReceivedDevelopFeedback(feedbackReceiverId);
Map<Long, List<FeedbackResponse>> receivedSocialFeedback = getReceivedSocialFeedback(feedbackReceiverId);
return getUserFeedbackResponse(receivedDevelopFeedback, receivedSocialFeedback);

return getUserFeedbackResponse(receivedDevelopFeedback, receivedSocialFeedback, Room::isClosed);
}

private Map<Long, List<FeedbackResponse>> getReceivedDevelopFeedback(long feedbackReceiverId) {
Expand All @@ -67,11 +70,12 @@ private Map<Long, List<FeedbackResponse>> getReceivedSocialFeedback(long feedbac
.collect(Collectors.groupingBy(FeedbackResponse::roomId));
}

private UserFeedbackResponse getUserFeedbackResponse(Map<Long, List<FeedbackResponse>> developFeedback, Map<Long, List<FeedbackResponse>> socialFeedback) {
List<Room> rooms = roomRepository.findAllById(
extractDistinctKeyStreams(developFeedback, socialFeedback).toList());
private UserFeedbackResponse getUserFeedbackResponse(Map<Long, List<FeedbackResponse>> developFeedback, Map<Long, List<FeedbackResponse>> socialFeedback, Predicate<Room> predicate) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

predicate 가 이름을 가지면 좋겠는데, 적절한 이름이 떠오르지 않네요..

List<Long> roomIds = extractDistinctKeyStreams(developFeedback, socialFeedback).toList();
List<Room> rooms = roomRepository.findAllById(roomIds);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findAllByIds 와 findAllById 가 동작이 같은가요? 궁금해서 질문 남깁니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JPA에서는 findAllById가 표준 메서드로 제공되지만, findAllByIds는 없습니다.

findAllById는 기본적으로 여러 개의 ID를 인자로 받아서 해당 ID들에 해당하는 엔티티들을 모두 조회합니다.

스크린샷 2024-10-19 오후 4 46 59

기본적으로 제공되는 것은 findAllById이며, 두 메서드의 동작은 같지 않습니다~

findAllByIds를 사용하려면 직접 메서드를 정의해야겠네요!


return new UserFeedbackResponse(rooms.stream()
.filter(Room::isClosed)
.filter(predicate)
.map(room -> FeedbacksResponse.of(room, emptyListIfNull(developFeedback.get(room.getId())), emptyListIfNull(socialFeedback.get(room.getId()))))
.toList());
}
Expand Down
3 changes: 2 additions & 1 deletion backend/src/main/java/corea/global/util/MapHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
public class MapHandler {

public static <T> Stream<T> extractDistinctKeyStreams(Map<? extends T, ?>... maps) {
return (Stream<T>) Arrays.stream(maps).flatMap(map -> map.keySet().stream())
return (Stream<T>) Arrays.stream(maps)
.flatMap(map -> map.keySet().stream())
.distinct();
}
}
Copy link
Contributor

@ashsty ashsty Oct 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 위에서 room -> trueisXXX로 바꾼다면 여기 "자신이 작성한 피드백을 받는다"

테스트 메서드 로직도 바뀌어야 합니다!

만약 비즈니스 로직을 바꾸지 않는다고 해도 현재는 OPEN 상태인 방을 테스트하고 있는 것 같아서,
CLOSEDPROGRESS인 방을 기준으로 테스트하도록 바꾸어보아도 좋겠네요!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

같이 수정완료했습니다~ 👍

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package corea.feedback.controller;

import config.ControllerTest;
import corea.auth.service.LoginService;
import corea.auth.service.TokenService;
import corea.feedback.dto.UserFeedbackResponse;
import corea.feedback.repository.DevelopFeedbackRepository;
Expand All @@ -15,15 +14,12 @@
import corea.room.domain.Room;
import corea.room.repository.RoomRepository;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import static org.assertj.core.api.Assertions.assertThat;

@Disabled
@ControllerTest
class UserFeedbackControllerTest {

Expand All @@ -39,8 +35,6 @@ class UserFeedbackControllerTest {
@Autowired
private SocialFeedbackRepository socialFeedbackRepository;

@Autowired
private LoginService loginService;
@Autowired
private TokenService tokenService;

Expand All @@ -59,9 +53,11 @@ void deliveredFeedbacks() {

String token = tokenService.createAccessToken(member1);

UserFeedbackResponse response = RestAssured.given().header("Authorization", token).contentType(ContentType.JSON)
UserFeedbackResponse response = RestAssured.given()
.auth().oauth2(token)
.when().get("/user/feedbacks/delivered")
.then().statusCode(200).extract().as(UserFeedbackResponse.class);
.then().statusCode(200)
.extract().as(UserFeedbackResponse.class);

assertThat(response.feedbacks()).hasSize(2);
assertThat(response.feedbacks().get(0).socialFeedback()).hasSize(1);
Expand All @@ -72,8 +68,8 @@ void deliveredFeedbacks() {
@DisplayName("자신이 받은 피드백을 받는다.")
void receivedFeedbacks() {
Member manager = memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON());
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN(manager));
Room room2 = roomRepository.save(RoomFixture.ROOM_DOMAIN(manager));
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Room room2 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Member member1 = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member member2 = memberRepository.save(MemberFixture.MEMBER_YOUNGSU());

Expand All @@ -83,14 +79,44 @@ void receivedFeedbacks() {

String token = tokenService.createAccessToken(member2);

UserFeedbackResponse response = RestAssured.given().header("Authorization", token).contentType(ContentType.JSON)
UserFeedbackResponse response = RestAssured.given()
.auth().oauth2(token)
.when().get("/user/feedbacks/received")
.then().statusCode(200).extract().as(UserFeedbackResponse.class);

.then().statusCode(200)
.extract().as(UserFeedbackResponse.class);

assertThat(response.feedbacks()).hasSize(2);
assertThat(response.feedbacks().get(0).developFeedback()).hasSize(1);
assertThat(response.feedbacks().get(0).socialFeedback()).hasSize(1);
assertThat(response.feedbacks().get(1).developFeedback()).hasSize(1);
}

@Test
@DisplayName("자신이 받은 피드백을 받을 때는 닫혀있는 방에서만 받는다.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"자신이 받은 피드백은 닫혀있는 방에서 작성된 피드백만 확인할 수 있다" 와 같은 수정은 어떠신가요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정 완😀

void receivedFeedbacksFromClosedRoom() {
Member manager = memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON());
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN(manager));
Room room2 = roomRepository.save(RoomFixture.ROOM_DOMAIN(manager));
Room room3 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Member member1 = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member member2 = memberRepository.save(MemberFixture.MEMBER_YOUNGSU());

developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), member1, member2));
developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room2.getId(), manager, member2));
developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room3.getId(), manager, member2));
socialFeedbackRepository.save(SocialFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), manager, member2));
socialFeedbackRepository.save(SocialFeedbackFixture.POSITIVE_FEEDBACK(room3.getId(), manager, member2));

String token = tokenService.createAccessToken(member2);

UserFeedbackResponse response = RestAssured.given()
.auth().oauth2(token)
.when().get("/user/feedbacks/received")
.then().statusCode(200)
.extract().as(UserFeedbackResponse.class);

assertThat(response.feedbacks()).hasSize(1);
assertThat(response.feedbacks().get(0).developFeedback()).hasSize(1);
assertThat(response.feedbacks().get(0).socialFeedback()).hasSize(1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class UserFeedbackServiceTest {
private SocialFeedbackRepository socialFeedbackRepository;

@Test
@DisplayName("닫힌 방마다 작성한 피드백들을 구분해서 가져온다.")
@DisplayName("작성한 피드백들을 가져온다.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도 마찬가지로 room3RoomStatus 확인해주시면 좋을 것 같아요! 👍

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

같이 수정완료했습니다~ 👍

void findFeedbacksWithEachRoom() {
Member manager = memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON());
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Expand All @@ -58,11 +58,11 @@ void findFeedbacksWithEachRoom() {

UserFeedbackResponse response = userFeedbackService.getDeliveredFeedback(reviewer.getId());

assertThat(response.feedbacks()).hasSize(2);
assertThat(response.feedbacks()).hasSize(3);
}

@Test
@DisplayName("닫힌 방에서 자신이 해준 피드백들만 가져온다.")
@DisplayName("자신이 해준 피드백들만 가져온다.")
void findFeedbacksWithReviewer() {
Member manager = memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON());
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Expand All @@ -83,25 +83,23 @@ void findFeedbacksWithReviewer() {

assertThat(feedbackResponses.developFeedback()).hasSize(1);
assertThat(feedbackResponses.socialFeedback()).hasSize(1);

}

@Test
@DisplayName("닫힌 방에서 자신이 받은 피드백들만 가져온다.")
void getReceivedFeedback() {
@DisplayName("자신이 받은 피드백을 가져올 땐 방이 닫혀있는 피드백들만 가져온다.")
void getReceivedFeedbackFromClosedRooms() {
Member manager = memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON());
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Room room2 = roomRepository.save(RoomFixture.ROOM_DOMAIN(manager));
Member reviewer1 = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member reviewer2 = memberRepository.save(MemberFixture.MEMBER_ASH());
Member reviewee = memberRepository.save(MemberFixture.MEMBER_YOUNGSU());

developFeedbackRepository.save(
DevelopFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), reviewer1, reviewee));
developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), reviewer1, reviewee));
saveRevieweeToReviewer(room1.getId(), reviewer1, reviewee);
saveRevieweeToReviewer(room1.getId(), reviewer2, reviewee);
developFeedbackRepository.save(
DevelopFeedbackFixture.POSITIVE_FEEDBACK(room2.getId(), reviewer1, reviewee));

developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room2.getId(), reviewer1, reviewee));
saveRevieweeToReviewer(room2.getId(), reviewer1, reviewee);
saveRevieweeToReviewer(room2.getId(), reviewer2, reviewee);

Expand All @@ -112,6 +110,26 @@ void getReceivedFeedback() {
assertThat(feedbackData).hasSize(1);
}

@Test
@DisplayName("자신이 받은 피드백들만 가져온다.")
void getReceivedFeedback() {
Member manager = memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON());
Room room1 = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLOSED(manager));
Member reviewer1 = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member reviewer2 = memberRepository.save(MemberFixture.MEMBER_ASH());
Member reviewee = memberRepository.save(MemberFixture.MEMBER_YOUNGSU());

developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), reviewer1, reviewee));
saveRevieweeToReviewer(room1.getId(), reviewer1, reviewee);
saveRevieweeToReviewer(room1.getId(), reviewer2, reviewee);

UserFeedbackResponse response = userFeedbackService.getReceivedFeedback(reviewee.getId());
List<FeedbackResponse> feedbackData = response.feedbacks()
.get(0)
.developFeedback();
assertThat(feedbackData).hasSize(1);
}

private void saveRevieweeToReviewer(long roomId, Member reviewee, Member reviewer) {
socialFeedbackRepository.save(
new SocialFeedback(null, roomId, reviewer, reviewee, 4, List.of(FeedbackKeyword.REVIEW_FAST, FeedbackKeyword.KIND), "유용한 정보들이 많았어요")
Expand Down