Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -12,8 +12,6 @@
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/friends")
Expand Down Expand Up @@ -99,9 +97,8 @@ public SuccessResponse<String> deleteFriend(
@Override
@GetMapping("/sent")
public SuccessResponse<FriendsResponse> getSentFriendRequests(final @MemberID String userId) {
List<Friend> sent = friendUseCase.getSentFriendRequests(userId);
return SuccessResponse.ok(
FriendsResponse.from(sent)
friendUseCase.getSentFriendRequests(userId)
);
}

Expand All @@ -112,9 +109,8 @@ public SuccessResponse<FriendsResponse> getSentFriendRequests(final @MemberID St
@Override
@GetMapping("/received")
public SuccessResponse<FriendsResponse> getReceivedFriendRequests(final @MemberID String userId) {
List<Friend> received = friendUseCase.getReceivedFriendRequests(userId);
return SuccessResponse.ok(
FriendsResponse.from(received)
friendUseCase.getReceivedFriendRequests(userId)
);
}

Expand All @@ -125,9 +121,8 @@ public SuccessResponse<FriendsResponse> getReceivedFriendRequests(final @MemberI
@Override
@GetMapping("/list")
public SuccessResponse<FriendsResponse> getFriends(final @MemberID String userId) {
List<Friend> friends = friendUseCase.getFriends(userId);
return SuccessResponse.ok(
FriendsResponse.from(friends)
friendUseCase.getFriends(userId)
);
}
}
Original file line number Diff line number Diff line change
@@ -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<FriendResponse> friends) {
public static FriendsResponse from(final List<Friend> friendList) {
List<FriendResponse> responses = friendList.stream()
.map(FriendResponse::from)
.toList();
return new FriendsResponse(responses);
/**
* 친구 목록 응답 DTO
* <p>
* 친구 목록은 다음과 같은 상태에 따라 다를 수 있습니다:
* - `PENDING`: 사용자가 요청한 친구 목록
* - `RECEIVED`: 사용자가 요청을 받은 친구 목록
* - `ACCEPTED`: 실제 친구 목록 (요청을 수락한 친구 목록)
*/
@Schema(description = "상태에 맞는 친구 목록 응답")
public record FriendsResponse(

@ArraySchema(schema = @Schema(description = "상태에 맞는 친구 목록", implementation = UserClientInfoResponse.class))
List<UserClientInfoResponse> friends,

@Schema(
description = "친구 목록들과의 관계 상태 (예: PENDING, ACCEPTED, REJECTED)",
example = "ACCEPTED"
)
FriendStatus status
) {
public static FriendsResponse of(final List<Member> members, final FriendStatus status) {
return new FriendsResponse(
members.stream()
.map(UserClientInfoResponse::from)
.toList(),
status
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,23 @@ public class FriendQueryDslRepository {
/**
* 본인이 보낸 친구 요청: 요청자(requestedBy)가 userId인 경우, 상태(PENDING)와 soft delete 조건 적용
*/
public List<FriendEntity> findSentFriendRequests(final String requestedUserId) {
return jpaQueryFactory.selectFrom(friendEntity)
public List<String> findSentFriendRequests(final String userId) {
List<FriendEntity> 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<FriendEntity> findReceivedFriendRequests(final String userId) {
return jpaQueryFactory.selectFrom(friendEntity)
public List<String> findReceivedFriendRequests(final String userId) {
List<FriendEntity> pendingFriendEntities = jpaQueryFactory.selectFrom(friendEntity)
.where(
friendEntity.status.eq(FriendStatus.PENDING),
friendEntity.deleted.eq(false),
Expand All @@ -42,19 +44,35 @@ public List<FriendEntity> findReceivedFriendRequests(final String userId) {
friendEntity.requestedBy.ne(userId)
)
.fetch();

return transFriendIds(userId, pendingFriendEntities);
}

private List<String> transFriendIds(String userId, List<FriendEntity> friendEntities) {
return friendEntities.stream().map(
friendEntity -> {
if (friendEntity.getUserId1().equals(userId)) {
return friendEntity.getUserId2();
} else {
return friendEntity.getUserId1();
}
}
).toList();
}

/**
* 본인의 실제 친구: 친구 관계에 포함되고 상태가 ACCEPTED인 경우 (soft delete 조건 포함)
*/
public List<FriendEntity> findFriendsByUserId(final String userId) {
return jpaQueryFactory.selectFrom(friendEntity)
public List<String> findFriendsIdByUserId(final String userId) {
List<FriendEntity> friendEntities = jpaQueryFactory.selectFrom(friendEntity)
.where(
friendEntity.status.eq(FriendStatus.ACCEPTED),
friendEntity.deleted.eq(false),
friendEntity.userId1.eq(userId)
.or(friendEntity.userId2.eq(userId))
)
.fetch();

return transFriendIds(userId, friendEntities);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ public interface FriendRepository {

void deleteById(String friendId);

List<Friend> findSentFriendRequests(String requestedUserId);
List<String> findSentFriendRequests(String requestedUserId);

List<Friend> findReceivedFriendRequests(String userId);
List<String> findReceivedFriendRequests(String userId);

List<Friend> findFriendsByUserId(String userId);
List<String> findFriendIdsByUserId(String userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,26 +42,17 @@ public void deleteById(final String friendId) {
}

@Override
public List<Friend> findSentFriendRequests(final String requestedUserId) {
return queryDslRepository.findSentFriendRequests(requestedUserId)
.stream().map(
DomainUtil.FriendMapper::toDomain
).toList();
public List<String> findSentFriendRequests(final String userId) {
return queryDslRepository.findSentFriendRequests(userId);
}

@Override
public List<Friend> findReceivedFriendRequests(final String userId) {
return queryDslRepository.findReceivedFriendRequests(userId)
.stream().map(
DomainUtil.FriendMapper::toDomain
).toList();
public List<String> findReceivedFriendRequests(final String userId) {
return queryDslRepository.findReceivedFriendRequests(userId);
}

@Override
public List<Friend> findFriendsByUserId(final String userId) {
return queryDslRepository.findFriendsByUserId(userId)
.stream().map(
DomainUtil.FriendMapper::toDomain
).toList();
public List<String> findFriendIdsByUserId(final String userId) {
return queryDslRepository.findFriendsIdByUserId(userId);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -79,17 +81,26 @@ public void deleteFriend(final String userId, final String friendId) {
}

@Override
public List<Friend> getSentFriendRequests(final String userId) {
return friendRepository.findSentFriendRequests(userId);
public FriendsResponse getSentFriendRequests(final String userId) {
List<String> sentFriendIds = friendRepository.findSentFriendRequests(userId);
return FriendsResponse.of(
memberRepository.getByMemberIds(sentFriendIds), FriendStatus.PENDING
);
}

@Override
public List<Friend> getReceivedFriendRequests(final String userId) {
return friendRepository.findReceivedFriendRequests(userId);
public FriendsResponse getReceivedFriendRequests(final String userId) {
List<String> receivedFriendIds = friendRepository.findReceivedFriendRequests(userId);
return FriendsResponse.of(
memberRepository.getByMemberIds(receivedFriendIds), FriendStatus.PENDING
);
}

@Override
public List<Friend> getFriends(final String userId) {
return friendRepository.findFriendsByUserId(userId);
public FriendsResponse getFriends(final String userId) {
List<String> friendsIds = friendRepository.findFriendIdsByUserId(userId);
return FriendsResponse.of(
memberRepository.getByMemberIds(friendsIds), FriendStatus.ACCEPTED
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -16,10 +16,10 @@ public interface FriendUseCase {

void deleteFriend(String userId, String friendId);

List<Friend> getFriends(String userId);
FriendsResponse getFriends(String userId);

List<Friend> getSentFriendRequests(String userId);
FriendsResponse getSentFriendRequests(String userId);

List<Friend> getReceivedFriendRequests(String userId);
FriendsResponse getReceivedFriendRequests(String userId);

}
Loading