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] 피드백 미작성시 받은 피드백 안보이는 기능(#640) #643

Merged
merged 18 commits into from
Oct 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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 @@ -42,4 +42,8 @@ public DevelopFeedback findDevelopFeedback(long roomId, long deliverId, String u
return developFeedbackRepository.findByRoomIdAndDeliverIdAndReceiverUsername(roomId, deliverId, username)
.orElseThrow(() -> new CoreaException(ExceptionType.FEEDBACK_NOT_FOUND));
}

public boolean existsByRoomIdAndDeliverAndReceiver(long roomId, long deliverId, long receiverId) {
return developFeedbackRepository.existsByRoomIdAndDeliverIdAndReceiverId(roomId, deliverId, receiverId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,8 @@ public SocialFeedback findSocialFeedback(long roomId, long deliverId, String use
return socialFeedbackRepository.findByRoomIdAndDeliverIdAndReceiverUsername(roomId, deliverId, username)
.orElseThrow(() -> new CoreaException(ExceptionType.FEEDBACK_NOT_FOUND));
}

public boolean existsByRoomIdAndDeliverAndReceiver(long rooomId, long deliverId, long receiverId) {
return socialFeedbackRepository.existsByRoomIdAndDeliverIdAndReceiverId(rooomId, deliverId, receiverId);
}
}
25 changes: 25 additions & 0 deletions backend/src/main/java/corea/feedback/dto/FeedbackOutput.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import corea.feedback.util.FeedbackKeywordConverter;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.Collections;
import java.util.List;

@Schema(description = "개발 피드백 + 커뮤니케이션 피드백 조회 응답")
Expand All @@ -23,6 +24,9 @@ public record FeedbackOutput(@Schema(description = "피드백 아이디", exampl
@Schema(description = "유저 이름", example = "jcoding-play")
String username,

@Schema(description = "내가 상대방의 피드백 작성을 완료하였는지 여부", example = "false")
boolean isWrited,
Copy link
Contributor

Choose a reason for hiding this comment

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

isFeedbackCompleted 같은 이름이 더 어울리는 것 같기는 하네요...

MatchResultResponse에서도 마찬가지입니다.
대신 바꾸게 되면 프론트에 노티줘야 할듯. 👀


@Schema(description = "선택한 피드백 키워드", example = "[\"코드를 이해하기 쉬웠어요\", \"컨벤션이 잘 지켜졌어요\"]")
List<String> feedbackKeywords,

Expand All @@ -32,13 +36,17 @@ public record FeedbackOutput(@Schema(description = "피드백 아이디", exampl
@Schema(description = "부가 작성 가능한 피드백 텍스트", example = "처음 자바를 접해봤다고 했는데 생각보다 매우 잘 구성되어 있는 코드였습니다. ...")
String feedbackText) {

private static final boolean FEEDBACK_COMPLETE = true;
private static final boolean FEEDBACK_INCOMPLETE = false;

public static FeedbackOutput fromReceiver(DevelopFeedback developFeedback) {
return new FeedbackOutput(
developFeedback.getId(),
developFeedback.getRoomId(),
developFeedback.getDeliver().getId(),
developFeedback.getDeliver().getThumbnailUrl(),
developFeedback.getDeliver().getUsername(),
FEEDBACK_COMPLETE,
FeedbackKeywordConverter.convertToMessages(developFeedback.getKeywords()),
developFeedback.getEvaluatePoint(),
developFeedback.getFeedBackText()
Expand All @@ -52,6 +60,7 @@ public static FeedbackOutput fromDeliver(DevelopFeedback developFeedback) {
developFeedback.getReceiver().getId(),
developFeedback.getReceiver().getThumbnailUrl(),
developFeedback.getReceiver().getUsername(),
FEEDBACK_COMPLETE,
FeedbackKeywordConverter.convertToMessages(developFeedback.getKeywords()),
developFeedback.getEvaluatePoint(),
developFeedback.getFeedBackText()
Expand All @@ -65,6 +74,7 @@ public static FeedbackOutput fromReceiver(SocialFeedback socialFeedback) {
socialFeedback.getDeliver().getId(),
socialFeedback.getDeliver().getThumbnailUrl(),
socialFeedback.getDeliver().getUsername(),
FEEDBACK_COMPLETE,
FeedbackKeywordConverter.convertToMessages(socialFeedback.getKeywords()),
socialFeedback.getEvaluatePoint(),
socialFeedback.getFeedBackText()
Expand All @@ -78,9 +88,24 @@ public static FeedbackOutput fromDeliver(SocialFeedback socialFeedback) {
socialFeedback.getReceiver().getId(),
socialFeedback.getReceiver().getThumbnailUrl(),
socialFeedback.getReceiver().getUsername(),
FEEDBACK_COMPLETE,
FeedbackKeywordConverter.convertToMessages(socialFeedback.getKeywords()),
socialFeedback.getEvaluatePoint(),
socialFeedback.getFeedBackText()
);
}

public static FeedbackOutput masking(FeedbackOutput feedbackOutput) {
return new FeedbackOutput(
feedbackOutput.feedbackId(),
feedbackOutput.roomId,
feedbackOutput.receiverId,
feedbackOutput.profile,
feedbackOutput.username,
FEEDBACK_INCOMPLETE,
Collections.emptyList(),
0,
""
);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package corea.feedback.dto;

import corea.room.domain.Room;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.Collections;
import java.util.List;

@Schema(description = "개발 피드백 + 커뮤니케이션 피드백 작성 응답")
Expand All @@ -20,6 +22,9 @@ public record FeedbackResponse(@Schema(description = "피드백 아이디", exam
@Schema(description = "유저 이름", example = "jcoding-play")
String username,

@Schema(description = "내가 상대방의 피드백 작성을 완료하였는지 여부", example = "false")
Copy link
Contributor

Choose a reason for hiding this comment

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

마찬가지입뉘다.

boolean isWrited,

@Schema(description = "선택한 피드백 키워드", example = "[\"코드를 이해하기 쉬웠어요\", \"컨벤션이 잘 지켜졌어요\"]")
List<String> feedbackKeywords,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ private FeedbackResponse toFeedbackResponse(FeedbackOutput output) {
output.receiverId(),
output.profile(),
output.username(),
output.isWrited(),
output.feedbackKeywords(),
output.evaluationPoint(),
output.feedbackText()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import corea.room.domain.Room;
import corea.room.repository.RoomRepository;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.function.TriFunction;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -41,23 +42,49 @@ public UserFeedbackResponse getReceivedFeedback(long feedbackReceiverId) {
Map<Long, List<FeedbackOutput>> developFeedbackOutput = developFeedbackReader.collectReceivedDevelopFeedback(feedbackReceiverId);
Map<Long, List<FeedbackOutput>> socialFeedbackOutput = socialFeedbackReader.collectReceivedSocialFeedback(feedbackReceiverId);

maskingIfNoFeedbackDeliver(feedbackReceiverId, developFeedbackOutput, socialFeedbackOutput);

return getUserFeedbackResponse(developFeedbackOutput, socialFeedbackOutput, Room::isClosed);
}

private UserFeedbackResponse getUserFeedbackResponse(Map<Long, List<FeedbackOutput>> developFeedbackOutput, Map<Long, List<FeedbackOutput>> socialFeedbackOutput, Predicate<Room> predicate) {
private UserFeedbackResponse getUserFeedbackResponse(Map<Long, List<FeedbackOutput>> developFeedbackOutput, Map<Long, List<FeedbackOutput>> socialFeedbackOutput, Predicate<Room> roomStatusPredicate) {
Map<Long, List<FeedbackResponse>> developFeedbacks = feedbackMapper.toFeedbackResponseMap(developFeedbackOutput);
Map<Long, List<FeedbackResponse>> socialFeedbacks = feedbackMapper.toFeedbackResponseMap(socialFeedbackOutput);

List<FeedbacksResponse> feedbacksResponses = getFeedbacksResponses(developFeedbacks, socialFeedbacks, predicate);
List<FeedbacksResponse> feedbacksResponses = getFeedbacksResponses(developFeedbacks, socialFeedbacks, roomStatusPredicate);
return new UserFeedbackResponse(feedbacksResponses);
}

private List<FeedbacksResponse> getFeedbacksResponses(Map<Long, List<FeedbackResponse>> developFeedbacks, Map<Long, List<FeedbackResponse>> socialFeedbacks, Predicate<Room> predicate) {
private void maskingIfNoFeedbackDeliver(long receiverId, Map<Long, List<FeedbackOutput>> developFeedbackOutput, Map<Long, List<FeedbackOutput>> socialFeedbackOutput) {
developFeedbackOutput.forEach((key, value) -> developFeedbackOutput.put(key, maskingFeedback(receiverId, value, true)));
socialFeedbackOutput.forEach((key, value) -> socialFeedbackOutput.put(key, maskingFeedback(receiverId, value, false)));
}

private List<FeedbackOutput> maskingFeedback(long receiverId, List<FeedbackOutput> feedbackOutputs, boolean needToCheckSocialFeedback) {

TriFunction<Long, Long, Long, Boolean> feedbackExistencePredicate = needToCheckSocialFeedback ? socialFeedbackReader::existsByRoomIdAndDeliverAndReceiver : developFeedbackReader::existsByRoomIdAndDeliverAndReceiver;
return feedbackOutputs.stream()
.map(feedbackOutput -> {
if (needToMasking(receiverId, feedbackOutput, feedbackExistencePredicate)) {
return FeedbackOutput.masking(feedbackOutput);
}
return feedbackOutput;
})
.toList();
}

private boolean needToMasking(long receiverId, FeedbackOutput feedbackResponse, TriFunction<Long, Long, Long, Boolean> feedbackExistencePredicate) {
long roomId = feedbackResponse.roomId();
long deliverId = feedbackResponse.receiverId();
return !feedbackExistencePredicate.apply(roomId, receiverId, deliverId);
}

private List<FeedbacksResponse> getFeedbacksResponses(Map<Long, List<FeedbackResponse>> developFeedbacks, Map<Long, List<FeedbackResponse>> socialFeedbacks, Predicate<Room> roomStatusPredicate) {
List<Long> roomIds = extractDistinctKeyStreams(developFeedbacks, socialFeedbacks).toList();
List<Room> rooms = roomRepository.findAllById(roomIds);

return rooms.stream()
.filter(predicate)
.filter(roomStatusPredicate)
.map(room -> FeedbacksResponse.of(room, emptyListIfNull(developFeedbacks.get(room.getId())), emptyListIfNull(socialFeedbacks.get(room.getId()))))
.toList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;

@ServiceTest
class UserFeedbackServiceTest {
Expand Down Expand Up @@ -160,4 +161,35 @@ void getFeedback_when_no_feedback_written() {
assertThat(receivedFeedback.feedbacks()).isEmpty();
assertThat(deliveredFeedback.feedbacks()).isEmpty();
}

@Test
@DisplayName("내가 피드백을 작성하지 않은 상대로부터 받은 피드백은 빈 응답으로 치환한다.")
void feedbackMaskingTest() {
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 reviewer3 = memberRepository.save(MemberFixture.MEMBER_MOVIN());
Member reviewee = memberRepository.save(MemberFixture.MEMBER_YOUNGSU());

developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), reviewer1, reviewee));
developFeedbackRepository.save(DevelopFeedbackFixture.POSITIVE_FEEDBACK(room1.getId(), reviewer3, 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();
FeedbackResponse unmaskedFeedbackData = feedbackData.get(0);
FeedbackResponse maskedFeedbackData = feedbackData.get(1);

assertAll(
() -> assertThat(feedbackData).hasSize(2),
() -> assertThat(unmaskedFeedbackData.isWrited()).isTrue(),
() -> assertThat(unmaskedFeedbackData.feedbackText()).isNotEmpty(),
() -> assertThat(maskedFeedbackData.isWrited()).isFalse(),
() -> assertThat(maskedFeedbackData.feedbackText()).isEmpty()
);
}
}
Loading