From 45dbfa5a513f5b8b498551965999fb6a220cd6aa Mon Sep 17 00:00:00 2001 From: toychip Date: Sat, 1 Mar 2025 02:25:14 +0900 Subject: [PATCH] =?UTF-8?q?[BE]=20fix:=20=EC=B9=9C=EA=B5=AC=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=B0=98=ED=99=98=20(#99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FriendController.java | 11 ++---- .../dto/response/FriendsResponse.java | 39 +++++++++++++++---- .../repository/FriendQueryDslRepository.java | 32 +++++++++++---- .../repository/FriendRepository.java | 6 +-- .../repository/FriendRepositoryImpl.java | 21 +++------- .../user_server/service/FriendService.java | 23 ++++++++--- .../user_server/usecase/FriendUseCase.java | 10 ++--- 7 files changed, 91 insertions(+), 51 deletions(-) diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/FriendController.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/FriendController.java index 1247e96f..afe13508 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/FriendController.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/FriendController.java @@ -12,8 +12,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import java.util.List; - @RestController @RequiredArgsConstructor @RequestMapping("/friends") @@ -99,9 +97,8 @@ public SuccessResponse deleteFriend( @Override @GetMapping("/sent") public SuccessResponse getSentFriendRequests(final @MemberID String userId) { - List sent = friendUseCase.getSentFriendRequests(userId); return SuccessResponse.ok( - FriendsResponse.from(sent) + friendUseCase.getSentFriendRequests(userId) ); } @@ -112,9 +109,8 @@ public SuccessResponse getSentFriendRequests(final @MemberID St @Override @GetMapping("/received") public SuccessResponse getReceivedFriendRequests(final @MemberID String userId) { - List received = friendUseCase.getReceivedFriendRequests(userId); return SuccessResponse.ok( - FriendsResponse.from(received) + friendUseCase.getReceivedFriendRequests(userId) ); } @@ -125,9 +121,8 @@ public SuccessResponse getReceivedFriendRequests(final @MemberI @Override @GetMapping("/list") public SuccessResponse getFriends(final @MemberID String userId) { - List friends = friendUseCase.getFriends(userId); return SuccessResponse.ok( - FriendsResponse.from(friends) + friendUseCase.getFriends(userId) ); } } diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/dto/response/FriendsResponse.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/dto/response/FriendsResponse.java index 39ca7f9b..14d896e1 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/dto/response/FriendsResponse.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/dto/response/FriendsResponse.java @@ -1,14 +1,39 @@ package com.asyncgate.user_server.dto.response; -import com.asyncgate.user_server.domain.Friend; +import com.asyncgate.user_server.domain.FriendStatus; +import com.asyncgate.user_server.domain.Member; +import com.asyncgate.user_server.dto.response.UserClientInfoResponses.UserClientInfoResponse; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; -public record FriendsResponse(List friends) { - public static FriendsResponse from(final List friendList) { - List responses = friendList.stream() - .map(FriendResponse::from) - .toList(); - return new FriendsResponse(responses); +/** + * 친구 목록 응답 DTO + *

+ * 친구 목록은 다음과 같은 상태에 따라 다를 수 있습니다: + * - `PENDING`: 사용자가 요청한 친구 목록 + * - `RECEIVED`: 사용자가 요청을 받은 친구 목록 + * - `ACCEPTED`: 실제 친구 목록 (요청을 수락한 친구 목록) + */ +@Schema(description = "상태에 맞는 친구 목록 응답") +public record FriendsResponse( + + @ArraySchema(schema = @Schema(description = "상태에 맞는 친구 목록", implementation = UserClientInfoResponse.class)) + List friends, + + @Schema( + description = "친구 목록들과의 관계 상태 (예: PENDING, ACCEPTED, REJECTED)", + example = "ACCEPTED" + ) + FriendStatus status +) { + public static FriendsResponse of(final List members, final FriendStatus status) { + return new FriendsResponse( + members.stream() + .map(UserClientInfoResponse::from) + .toList(), + status + ); } } diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendQueryDslRepository.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendQueryDslRepository.java index 3c2eb2cc..66cf8f3e 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendQueryDslRepository.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendQueryDslRepository.java @@ -19,21 +19,23 @@ public class FriendQueryDslRepository { /** * 본인이 보낸 친구 요청: 요청자(requestedBy)가 userId인 경우, 상태(PENDING)와 soft delete 조건 적용 */ - public List findSentFriendRequests(final String requestedUserId) { - return jpaQueryFactory.selectFrom(friendEntity) + public List findSentFriendRequests(final String userId) { + List pendingFriendEntities = jpaQueryFactory.selectFrom(friendEntity) .where( - friendEntity.requestedBy.eq(requestedUserId), + friendEntity.requestedBy.eq(userId), friendEntity.status.eq(FriendStatus.PENDING), friendEntity.deleted.eq(false) ) .fetch(); + + return transFriendIds(userId, pendingFriendEntities); } /** * 본인이 받은 친구 요청: 친구 관계에 포함되면서 요청자(requestedBy)가 userId가 아닌 경우 (상태=PENDING) */ - public List findReceivedFriendRequests(final String userId) { - return jpaQueryFactory.selectFrom(friendEntity) + public List findReceivedFriendRequests(final String userId) { + List pendingFriendEntities = jpaQueryFactory.selectFrom(friendEntity) .where( friendEntity.status.eq(FriendStatus.PENDING), friendEntity.deleted.eq(false), @@ -42,13 +44,27 @@ public List findReceivedFriendRequests(final String userId) { friendEntity.requestedBy.ne(userId) ) .fetch(); + + return transFriendIds(userId, pendingFriendEntities); + } + + private List transFriendIds(String userId, List friendEntities) { + return friendEntities.stream().map( + friendEntity -> { + if (friendEntity.getUserId1().equals(userId)) { + return friendEntity.getUserId2(); + } else { + return friendEntity.getUserId1(); + } + } + ).toList(); } /** * 본인의 실제 친구: 친구 관계에 포함되고 상태가 ACCEPTED인 경우 (soft delete 조건 포함) */ - public List findFriendsByUserId(final String userId) { - return jpaQueryFactory.selectFrom(friendEntity) + public List findFriendsIdByUserId(final String userId) { + List friendEntities = jpaQueryFactory.selectFrom(friendEntity) .where( friendEntity.status.eq(FriendStatus.ACCEPTED), friendEntity.deleted.eq(false), @@ -56,5 +72,7 @@ public List findFriendsByUserId(final String userId) { .or(friendEntity.userId2.eq(userId)) ) .fetch(); + + return transFriendIds(userId, friendEntities); } } diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepository.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepository.java index 3021afee..2e5079d5 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepository.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepository.java @@ -11,9 +11,9 @@ public interface FriendRepository { void deleteById(String friendId); - List findSentFriendRequests(String requestedUserId); + List findSentFriendRequests(String requestedUserId); - List findReceivedFriendRequests(String userId); + List findReceivedFriendRequests(String userId); - List findFriendsByUserId(String userId); + List findFriendIdsByUserId(String userId); } diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepositoryImpl.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepositoryImpl.java index ed2bdd57..c69ee87c 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepositoryImpl.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepositoryImpl.java @@ -42,26 +42,17 @@ public void deleteById(final String friendId) { } @Override - public List findSentFriendRequests(final String requestedUserId) { - return queryDslRepository.findSentFriendRequests(requestedUserId) - .stream().map( - DomainUtil.FriendMapper::toDomain - ).toList(); + public List findSentFriendRequests(final String userId) { + return queryDslRepository.findSentFriendRequests(userId); } @Override - public List findReceivedFriendRequests(final String userId) { - return queryDslRepository.findReceivedFriendRequests(userId) - .stream().map( - DomainUtil.FriendMapper::toDomain - ).toList(); + public List findReceivedFriendRequests(final String userId) { + return queryDslRepository.findReceivedFriendRequests(userId); } @Override - public List findFriendsByUserId(final String userId) { - return queryDslRepository.findFriendsByUserId(userId) - .stream().map( - DomainUtil.FriendMapper::toDomain - ).toList(); + public List findFriendIdsByUserId(final String userId) { + return queryDslRepository.findFriendsIdByUserId(userId); } } diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/service/FriendService.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/service/FriendService.java index 9ab157c7..7002e433 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/service/FriendService.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/service/FriendService.java @@ -1,7 +1,9 @@ package com.asyncgate.user_server.service; import com.asyncgate.user_server.domain.Friend; +import com.asyncgate.user_server.domain.FriendStatus; import com.asyncgate.user_server.domain.Member; +import com.asyncgate.user_server.dto.response.FriendsResponse; import com.asyncgate.user_server.exception.FailType; import com.asyncgate.user_server.exception.UserServerException; import com.asyncgate.user_server.repository.FriendRepository; @@ -79,17 +81,26 @@ public void deleteFriend(final String userId, final String friendId) { } @Override - public List getSentFriendRequests(final String userId) { - return friendRepository.findSentFriendRequests(userId); + public FriendsResponse getSentFriendRequests(final String userId) { + List sentFriendIds = friendRepository.findSentFriendRequests(userId); + return FriendsResponse.of( + memberRepository.getByMemberIds(sentFriendIds), FriendStatus.PENDING + ); } @Override - public List getReceivedFriendRequests(final String userId) { - return friendRepository.findReceivedFriendRequests(userId); + public FriendsResponse getReceivedFriendRequests(final String userId) { + List receivedFriendIds = friendRepository.findReceivedFriendRequests(userId); + return FriendsResponse.of( + memberRepository.getByMemberIds(receivedFriendIds), FriendStatus.PENDING + ); } @Override - public List getFriends(final String userId) { - return friendRepository.findFriendsByUserId(userId); + public FriendsResponse getFriends(final String userId) { + List friendsIds = friendRepository.findFriendIdsByUserId(userId); + return FriendsResponse.of( + memberRepository.getByMemberIds(friendsIds), FriendStatus.ACCEPTED + ); } } diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/usecase/FriendUseCase.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/usecase/FriendUseCase.java index 347a349e..76b83f79 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/usecase/FriendUseCase.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/usecase/FriendUseCase.java @@ -2,8 +2,8 @@ import com.asyncgate.user_server.domain.Friend; import com.asyncgate.user_server.domain.Member; - -import java.util.List; +import com.asyncgate.user_server.dto.response.FriendsResponse; +import com.asyncgate.user_server.dto.response.UserClientInfoResponses; public interface FriendUseCase { Member getByEmail(String email); @@ -16,10 +16,10 @@ public interface FriendUseCase { void deleteFriend(String userId, String friendId); - List getFriends(String userId); + FriendsResponse getFriends(String userId); - List getSentFriendRequests(String userId); + FriendsResponse getSentFriendRequests(String userId); - List getReceivedFriendRequests(String userId); + FriendsResponse getReceivedFriendRequests(String userId); } \ No newline at end of file