33import static org .clokey .member .entity .QFollow .follow ;
44import static org .clokey .member .entity .QMember .member ;
55
6- import com .querydsl .core .types .Projections ;
6+ import com .querydsl .core .Tuple ;
7+ import com .querydsl .core .types .Expression ;
78import com .querydsl .core .types .dsl .BooleanExpression ;
89import com .querydsl .core .types .dsl .Expressions ;
910import com .querydsl .jpa .JPAExpressions ;
1011import com .querydsl .jpa .impl .JPAQueryFactory ;
12+ import java .util .ArrayList ;
1113import java .util .List ;
1214import lombok .RequiredArgsConstructor ;
1315import org .clokey .domain .member .dto .response .FollowMemberResponse ;
1416import org .clokey .member .entity .QBlock ;
1517import org .clokey .member .entity .QFollow ;
18+ import org .clokey .member .enums .Visibility ;
1619import org .springframework .data .domain .PageRequest ;
1720import org .springframework .data .domain .Slice ;
1821import org .springframework .data .domain .SliceImpl ;
@@ -28,23 +31,25 @@ public class FollowRepositoryImpl implements FollowRepositoryCustom {
2831 public Slice <FollowMemberResponse > findAllFollowingsByMemberId (
2932 Long currentId , Long targetId , Long lastFollowId , Integer size ) {
3033 QFollow followSub = new QFollow ("followSub" );
34+ BooleanExpression isFollowingExpression =
35+ JPAExpressions .selectOne ()
36+ .from (followSub )
37+ .where (
38+ followSub .followFrom .id .eq (currentId ),
39+ followSub .followTo .id .eq (member .id ))
40+ .exists ();
41+ BooleanExpression isMeExpression = member .id .eq (currentId );
3142
32- List <FollowMemberResponse > results =
43+ List <Tuple > tuples =
3344 queryFactory
3445 .select (
35- Projections .constructor (
36- FollowMemberResponse .class ,
37- follow .id ,
38- member .id ,
39- member .nickname ,
40- member .profileImageUrl ,
41- JPAExpressions .selectOne ()
42- .from (followSub )
43- .where (
44- followSub .followFrom .id .eq (currentId ),
45- followSub .followTo .id .eq (member .id ))
46- .exists (),
47- member .id .eq (currentId )))
46+ follow .id ,
47+ member .id ,
48+ member .nickname ,
49+ member .profileImageUrl ,
50+ member .visibility ,
51+ isFollowingExpression ,
52+ isMeExpression )
4853 .from (follow )
4954 .join (follow .followTo , member )
5055 .where (
@@ -55,30 +60,35 @@ public Slice<FollowMemberResponse> findAllFollowingsByMemberId(
5560 .orderBy (follow .id .desc ())
5661 .fetch ();
5762
63+ List <FollowMemberResponse > results =
64+ mapToFollowMemberResponses (tuples , isFollowingExpression , isMeExpression );
65+
5866 return checkLastPage (size , results );
5967 }
6068
6169 @ Override
6270 public Slice <FollowMemberResponse > findAllFollowersByMemberId (
6371 Long currentId , Long targetId , Long lastFollowId , Integer size ) {
6472 QFollow followSub = new QFollow ("followSub" );
73+ BooleanExpression isFollowingExpression =
74+ JPAExpressions .selectOne ()
75+ .from (followSub )
76+ .where (
77+ followSub .followFrom .id .eq (currentId ),
78+ followSub .followTo .id .eq (member .id ))
79+ .exists ();
80+ BooleanExpression isMeExpression = member .id .eq (currentId );
6581
66- List <FollowMemberResponse > results =
82+ List <Tuple > tuples =
6783 queryFactory
6884 .select (
69- Projections .constructor (
70- FollowMemberResponse .class ,
71- follow .id ,
72- member .id ,
73- member .nickname ,
74- member .profileImageUrl ,
75- JPAExpressions .selectOne ()
76- .from (followSub )
77- .where (
78- followSub .followFrom .id .eq (currentId ),
79- followSub .followTo .id .eq (member .id ))
80- .exists (),
81- member .id .eq (currentId )))
85+ follow .id ,
86+ member .id ,
87+ member .nickname ,
88+ member .profileImageUrl ,
89+ member .visibility ,
90+ isFollowingExpression ,
91+ isMeExpression )
8292 .from (follow )
8393 .join (follow .followFrom , member )
8494 .where (
@@ -89,9 +99,33 @@ public Slice<FollowMemberResponse> findAllFollowersByMemberId(
8999 .orderBy (follow .id .desc ())
90100 .fetch ();
91101
102+ List <FollowMemberResponse > results =
103+ mapToFollowMemberResponses (tuples , isFollowingExpression , isMeExpression );
104+
92105 return checkLastPage (size , results );
93106 }
94107
108+ private List <FollowMemberResponse > mapToFollowMemberResponses (
109+ List <Tuple > tuples ,
110+ Expression <Boolean > isFollowingExpression ,
111+ Expression <Boolean > isMeExpression ) {
112+ List <FollowMemberResponse > responses = new ArrayList <>(tuples .size ());
113+
114+ for (Tuple tuple : tuples ) {
115+ responses .add (
116+ new FollowMemberResponse (
117+ tuple .get (follow .id ),
118+ tuple .get (member .id ),
119+ tuple .get (member .nickname ),
120+ tuple .get (member .profileImageUrl ),
121+ Visibility .PUBLIC .equals (tuple .get (member .visibility )),
122+ Boolean .TRUE .equals (tuple .get (isFollowingExpression )),
123+ Boolean .TRUE .equals (tuple .get (isMeExpression ))));
124+ }
125+
126+ return responses ;
127+ }
128+
95129 private BooleanExpression blockFilter (Long currentId ) {
96130 QBlock blockCheck = new QBlock ("blockCheck" );
97131
0 commit comments