Skip to content

Commit 45dbfa5

Browse files
committed
[BE] fix: 친구 목록 조회시 사용자 정보를 추가반환 (#99)
1 parent bf4d07e commit 45dbfa5

File tree

7 files changed

+91
-51
lines changed

7 files changed

+91
-51
lines changed

src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/FriendController.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import lombok.RequiredArgsConstructor;
1313
import org.springframework.web.bind.annotation.*;
1414

15-
import java.util.List;
16-
1715
@RestController
1816
@RequiredArgsConstructor
1917
@RequestMapping("/friends")
@@ -99,9 +97,8 @@ public SuccessResponse<String> deleteFriend(
9997
@Override
10098
@GetMapping("/sent")
10199
public SuccessResponse<FriendsResponse> getSentFriendRequests(final @MemberID String userId) {
102-
List<Friend> sent = friendUseCase.getSentFriendRequests(userId);
103100
return SuccessResponse.ok(
104-
FriendsResponse.from(sent)
101+
friendUseCase.getSentFriendRequests(userId)
105102
);
106103
}
107104

@@ -112,9 +109,8 @@ public SuccessResponse<FriendsResponse> getSentFriendRequests(final @MemberID St
112109
@Override
113110
@GetMapping("/received")
114111
public SuccessResponse<FriendsResponse> getReceivedFriendRequests(final @MemberID String userId) {
115-
List<Friend> received = friendUseCase.getReceivedFriendRequests(userId);
116112
return SuccessResponse.ok(
117-
FriendsResponse.from(received)
113+
friendUseCase.getReceivedFriendRequests(userId)
118114
);
119115
}
120116

@@ -125,9 +121,8 @@ public SuccessResponse<FriendsResponse> getReceivedFriendRequests(final @MemberI
125121
@Override
126122
@GetMapping("/list")
127123
public SuccessResponse<FriendsResponse> getFriends(final @MemberID String userId) {
128-
List<Friend> friends = friendUseCase.getFriends(userId);
129124
return SuccessResponse.ok(
130-
FriendsResponse.from(friends)
125+
friendUseCase.getFriends(userId)
131126
);
132127
}
133128
}
Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,39 @@
11
package com.asyncgate.user_server.dto.response;
22

3-
import com.asyncgate.user_server.domain.Friend;
3+
import com.asyncgate.user_server.domain.FriendStatus;
4+
import com.asyncgate.user_server.domain.Member;
5+
import com.asyncgate.user_server.dto.response.UserClientInfoResponses.UserClientInfoResponse;
6+
import io.swagger.v3.oas.annotations.media.ArraySchema;
7+
import io.swagger.v3.oas.annotations.media.Schema;
48

59
import java.util.List;
610

7-
public record FriendsResponse(List<FriendResponse> friends) {
8-
public static FriendsResponse from(final List<Friend> friendList) {
9-
List<FriendResponse> responses = friendList.stream()
10-
.map(FriendResponse::from)
11-
.toList();
12-
return new FriendsResponse(responses);
11+
/**
12+
* 친구 목록 응답 DTO
13+
* <p>
14+
* 친구 목록은 다음과 같은 상태에 따라 다를 수 있습니다:
15+
* - `PENDING`: 사용자가 요청한 친구 목록
16+
* - `RECEIVED`: 사용자가 요청을 받은 친구 목록
17+
* - `ACCEPTED`: 실제 친구 목록 (요청을 수락한 친구 목록)
18+
*/
19+
@Schema(description = "상태에 맞는 친구 목록 응답")
20+
public record FriendsResponse(
21+
22+
@ArraySchema(schema = @Schema(description = "상태에 맞는 친구 목록", implementation = UserClientInfoResponse.class))
23+
List<UserClientInfoResponse> friends,
24+
25+
@Schema(
26+
description = "친구 목록들과의 관계 상태 (예: PENDING, ACCEPTED, REJECTED)",
27+
example = "ACCEPTED"
28+
)
29+
FriendStatus status
30+
) {
31+
public static FriendsResponse of(final List<Member> members, final FriendStatus status) {
32+
return new FriendsResponse(
33+
members.stream()
34+
.map(UserClientInfoResponse::from)
35+
.toList(),
36+
status
37+
);
1338
}
1439
}

src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendQueryDslRepository.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,23 @@ public class FriendQueryDslRepository {
1919
/**
2020
* 본인이 보낸 친구 요청: 요청자(requestedBy)가 userId인 경우, 상태(PENDING)와 soft delete 조건 적용
2121
*/
22-
public List<FriendEntity> findSentFriendRequests(final String requestedUserId) {
23-
return jpaQueryFactory.selectFrom(friendEntity)
22+
public List<String> findSentFriendRequests(final String userId) {
23+
List<FriendEntity> pendingFriendEntities = jpaQueryFactory.selectFrom(friendEntity)
2424
.where(
25-
friendEntity.requestedBy.eq(requestedUserId),
25+
friendEntity.requestedBy.eq(userId),
2626
friendEntity.status.eq(FriendStatus.PENDING),
2727
friendEntity.deleted.eq(false)
2828
)
2929
.fetch();
30+
31+
return transFriendIds(userId, pendingFriendEntities);
3032
}
3133

3234
/**
3335
* 본인이 받은 친구 요청: 친구 관계에 포함되면서 요청자(requestedBy)가 userId가 아닌 경우 (상태=PENDING)
3436
*/
35-
public List<FriendEntity> findReceivedFriendRequests(final String userId) {
36-
return jpaQueryFactory.selectFrom(friendEntity)
37+
public List<String> findReceivedFriendRequests(final String userId) {
38+
List<FriendEntity> pendingFriendEntities = jpaQueryFactory.selectFrom(friendEntity)
3739
.where(
3840
friendEntity.status.eq(FriendStatus.PENDING),
3941
friendEntity.deleted.eq(false),
@@ -42,19 +44,35 @@ public List<FriendEntity> findReceivedFriendRequests(final String userId) {
4244
friendEntity.requestedBy.ne(userId)
4345
)
4446
.fetch();
47+
48+
return transFriendIds(userId, pendingFriendEntities);
49+
}
50+
51+
private List<String> transFriendIds(String userId, List<FriendEntity> friendEntities) {
52+
return friendEntities.stream().map(
53+
friendEntity -> {
54+
if (friendEntity.getUserId1().equals(userId)) {
55+
return friendEntity.getUserId2();
56+
} else {
57+
return friendEntity.getUserId1();
58+
}
59+
}
60+
).toList();
4561
}
4662

4763
/**
4864
* 본인의 실제 친구: 친구 관계에 포함되고 상태가 ACCEPTED인 경우 (soft delete 조건 포함)
4965
*/
50-
public List<FriendEntity> findFriendsByUserId(final String userId) {
51-
return jpaQueryFactory.selectFrom(friendEntity)
66+
public List<String> findFriendsIdByUserId(final String userId) {
67+
List<FriendEntity> friendEntities = jpaQueryFactory.selectFrom(friendEntity)
5268
.where(
5369
friendEntity.status.eq(FriendStatus.ACCEPTED),
5470
friendEntity.deleted.eq(false),
5571
friendEntity.userId1.eq(userId)
5672
.or(friendEntity.userId2.eq(userId))
5773
)
5874
.fetch();
75+
76+
return transFriendIds(userId, friendEntities);
5977
}
6078
}

src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepository.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ public interface FriendRepository {
1111

1212
void deleteById(String friendId);
1313

14-
List<Friend> findSentFriendRequests(String requestedUserId);
14+
List<String> findSentFriendRequests(String requestedUserId);
1515

16-
List<Friend> findReceivedFriendRequests(String userId);
16+
List<String> findReceivedFriendRequests(String userId);
1717

18-
List<Friend> findFriendsByUserId(String userId);
18+
List<String> findFriendIdsByUserId(String userId);
1919
}

src/backend/user-server/src/main/java/com/asyncgate/user_server/repository/FriendRepositoryImpl.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,17 @@ public void deleteById(final String friendId) {
4242
}
4343

4444
@Override
45-
public List<Friend> findSentFriendRequests(final String requestedUserId) {
46-
return queryDslRepository.findSentFriendRequests(requestedUserId)
47-
.stream().map(
48-
DomainUtil.FriendMapper::toDomain
49-
).toList();
45+
public List<String> findSentFriendRequests(final String userId) {
46+
return queryDslRepository.findSentFriendRequests(userId);
5047
}
5148

5249
@Override
53-
public List<Friend> findReceivedFriendRequests(final String userId) {
54-
return queryDslRepository.findReceivedFriendRequests(userId)
55-
.stream().map(
56-
DomainUtil.FriendMapper::toDomain
57-
).toList();
50+
public List<String> findReceivedFriendRequests(final String userId) {
51+
return queryDslRepository.findReceivedFriendRequests(userId);
5852
}
5953

6054
@Override
61-
public List<Friend> findFriendsByUserId(final String userId) {
62-
return queryDslRepository.findFriendsByUserId(userId)
63-
.stream().map(
64-
DomainUtil.FriendMapper::toDomain
65-
).toList();
55+
public List<String> findFriendIdsByUserId(final String userId) {
56+
return queryDslRepository.findFriendsIdByUserId(userId);
6657
}
6758
}

src/backend/user-server/src/main/java/com/asyncgate/user_server/service/FriendService.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.asyncgate.user_server.service;
22

33
import com.asyncgate.user_server.domain.Friend;
4+
import com.asyncgate.user_server.domain.FriendStatus;
45
import com.asyncgate.user_server.domain.Member;
6+
import com.asyncgate.user_server.dto.response.FriendsResponse;
57
import com.asyncgate.user_server.exception.FailType;
68
import com.asyncgate.user_server.exception.UserServerException;
79
import com.asyncgate.user_server.repository.FriendRepository;
@@ -79,17 +81,26 @@ public void deleteFriend(final String userId, final String friendId) {
7981
}
8082

8183
@Override
82-
public List<Friend> getSentFriendRequests(final String userId) {
83-
return friendRepository.findSentFriendRequests(userId);
84+
public FriendsResponse getSentFriendRequests(final String userId) {
85+
List<String> sentFriendIds = friendRepository.findSentFriendRequests(userId);
86+
return FriendsResponse.of(
87+
memberRepository.getByMemberIds(sentFriendIds), FriendStatus.PENDING
88+
);
8489
}
8590

8691
@Override
87-
public List<Friend> getReceivedFriendRequests(final String userId) {
88-
return friendRepository.findReceivedFriendRequests(userId);
92+
public FriendsResponse getReceivedFriendRequests(final String userId) {
93+
List<String> receivedFriendIds = friendRepository.findReceivedFriendRequests(userId);
94+
return FriendsResponse.of(
95+
memberRepository.getByMemberIds(receivedFriendIds), FriendStatus.PENDING
96+
);
8997
}
9098

9199
@Override
92-
public List<Friend> getFriends(final String userId) {
93-
return friendRepository.findFriendsByUserId(userId);
100+
public FriendsResponse getFriends(final String userId) {
101+
List<String> friendsIds = friendRepository.findFriendIdsByUserId(userId);
102+
return FriendsResponse.of(
103+
memberRepository.getByMemberIds(friendsIds), FriendStatus.ACCEPTED
104+
);
94105
}
95106
}

src/backend/user-server/src/main/java/com/asyncgate/user_server/usecase/FriendUseCase.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.asyncgate.user_server.domain.Friend;
44
import com.asyncgate.user_server.domain.Member;
5-
6-
import java.util.List;
5+
import com.asyncgate.user_server.dto.response.FriendsResponse;
6+
import com.asyncgate.user_server.dto.response.UserClientInfoResponses;
77

88
public interface FriendUseCase {
99
Member getByEmail(String email);
@@ -16,10 +16,10 @@ public interface FriendUseCase {
1616

1717
void deleteFriend(String userId, String friendId);
1818

19-
List<Friend> getFriends(String userId);
19+
FriendsResponse getFriends(String userId);
2020

21-
List<Friend> getSentFriendRequests(String userId);
21+
FriendsResponse getSentFriendRequests(String userId);
2222

23-
List<Friend> getReceivedFriendRequests(String userId);
23+
FriendsResponse getReceivedFriendRequests(String userId);
2424

2525
}

0 commit comments

Comments
 (0)