Skip to content

Commit 7bf03f9

Browse files
committed
moved userStats.isFollowedByMe to user.IsFollowedByMe
1 parent 1cbd30d commit 7bf03f9

19 files changed

+110
-96
lines changed

src/main/java/com/myapp/dto/PostDTO.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ public class PostDTO {
1919
private final Boolean isMyPost;
2020

2121
public static PostDTO newInstance(Micropost post, UserStats userStats, Boolean isMyPost) {
22-
final UserDTO userDTO = UserDTO.newInstance(post.getUser(), userStats, isMyPost);
22+
final UserDTO userDTO = UserDTO.builder2(post.getUser(), userStats)
23+
.isMyself(isMyPost)
24+
.build();
2325

2426
return PostDTO.builder()
2527
.id(post.getId())

src/main/java/com/myapp/dto/RelatedUserDTO.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class RelatedUserDTO {
1717
private final UserStats userStats;
1818
private final long relationshipId;
1919
private final Boolean isMyself;
20-
private final boolean isFollowedByMe;
20+
private final Boolean isFollowedByMe;
2121

2222
public static RelatedUserDTO newInstance(User user, Relationship relationship, UserStats userStats, Boolean isMyself) {
2323
final String avatarHash = Utils.md5(user.getUsername());

src/main/java/com/myapp/dto/UserDTO.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@ public class UserDTO {
1919
private final Boolean isMyself;
2020
private final Boolean isFollowedByMe;
2121

22+
public String getEmail() {
23+
return Optional.ofNullable(isMyself)
24+
.filter(Boolean::booleanValue)
25+
.map(b -> this.email)
26+
.orElse(null);
27+
}
28+
2229
public static UserDTO newInstance(User user, UserStats userStats, Boolean isMyself) {
2330
final String avatarHash = Utils.md5(user.getUsername());
2431

2532
return UserDTO.builder()
2633
.id(user.getId())
27-
.email(Optional.ofNullable(isMyself)
28-
.filter(Boolean::booleanValue)
29-
.map(b -> user.getUsername())
30-
.orElse(null))
34+
.email(user.getUsername())
3135
.name(user.getName())
3236
.avatarHash(avatarHash)
33-
.isMyself(isMyself)
3437
.userStats(userStats)
38+
.isMyself(isMyself)
3539
.build();
3640
}
3741

@@ -44,6 +48,7 @@ public static UserDTOBuilder builder2(User user, UserStats userStats) {
4448

4549
return UserDTO.builder()
4650
.id(user.getId())
51+
.email(user.getUsername())
4752
.name(user.getName())
4853
.avatarHash(avatarHash)
4954
.userStats(userStats);

src/main/java/com/myapp/dto/UserStats.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ public class UserStats {
1111
private final long micropostCnt;
1212
private final long followingCnt;
1313
private final long followerCnt;
14-
private final boolean isFollowedByMe;
1514

1615
@QueryProjection
17-
public UserStats(long micropostCnt, long followingCnt, long followerCnt, boolean isFollowedByMe) {
16+
public UserStats(long micropostCnt, long followingCnt, long followerCnt) {
1817
this.micropostCnt = micropostCnt;
1918
this.followingCnt = followingCnt;
2019
this.followerCnt = followerCnt;
21-
this.isFollowedByMe = isFollowedByMe;
2220
}
2321

2422
}

src/main/java/com/myapp/repository/MicropostCustomRepositoryImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public Stream<Row> findAsFeed(User user, PageParams pageParams) {
3232
final QRelationship qRelationship = QRelationship.relationship;
3333

3434
final ConstructorExpression<UserStats> userStatsExpression =
35-
UserStatsQueryHelper.userStatsExpression(qMicropost.user, user);
35+
UserStatsQueryHelper.userStatsExpression(qMicropost.user);
3636
final JPQLQuery<Relationship> relationshipSubQuery = JPAExpressions
3737
.selectFrom(qRelationship)
3838
.where(qRelationship.follower.eq(user)

src/main/java/com/myapp/repository/RelatedUserCustomRepository.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
public interface RelatedUserCustomRepository extends Repository<User, Long> {
1414

15-
List<Row> findFollowings(User user, User currentUser, PageParams pageParams);
15+
List<Row> findFollowings(User user, PageParams pageParams);
1616

17-
List<Row> findFollowers(User user, User currentUser, PageParams pageParams);
17+
List<Row> findFollowers(User user, PageParams pageParams);
1818

1919
@Value
2020
@Builder

src/main/java/com/myapp/repository/RelatedUserCustomRepositoryImpl.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ public RelatedUserCustomRepositoryImpl(JPAQueryFactory queryFactory) {
2828
}
2929

3030
@Override
31-
public List<Row> findFollowings(User subject, User currentUser, PageParams pageParams) {
31+
public List<Row> findFollowings(User subject, PageParams pageParams) {
3232
final ConstructorExpression<UserStats> userStatsExpression =
33-
UserStatsQueryHelper.userStatsExpression(qUser, currentUser);
33+
UserStatsQueryHelper.userStatsExpression(qUser);
3434

3535
return queryFactory.select(qUser, qRelationship, userStatsExpression)
3636
.from(qUser)
@@ -53,9 +53,9 @@ public List<Row> findFollowings(User subject, User currentUser, PageParams pageP
5353
}
5454

5555
@Override
56-
public List<Row> findFollowers(User subject, User currentUser, PageParams pageParams) {
56+
public List<Row> findFollowers(User subject, PageParams pageParams) {
5757
final ConstructorExpression<UserStats> userStatsExpression =
58-
UserStatsQueryHelper.userStatsExpression(qUser, currentUser);
58+
UserStatsQueryHelper.userStatsExpression(qUser);
5959

6060
return queryFactory.select(qUser, qRelationship, userStatsExpression)
6161
.from(qUser)

src/main/java/com/myapp/repository/UserCustomRepository.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
public interface UserCustomRepository extends Repository<User, Long> {
1212

13-
Optional<Row> findOne(Long userId, User currentUser);
13+
Optional<Row> findOne(Long userId);
1414

1515
@Value
1616
@Builder

src/main/java/com/myapp/repository/UserCustomRepositoryImpl.java

+8-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.myapp.repository;
22

33
import com.myapp.domain.QUser;
4-
import com.myapp.domain.User;
54
import com.myapp.dto.UserStats;
65
import com.myapp.repository.helper.UserStatsQueryHelper;
76
import com.querydsl.core.Tuple;
@@ -25,20 +24,19 @@ public UserCustomRepositoryImpl(JPAQueryFactory queryFactory) {
2524
}
2625

2726
@Override
28-
public Optional<Row> findOne(Long userId, User currentUser) {
27+
public Optional<Row> findOne(Long userId) {
2928
final ConstructorExpression<UserStats> userStatsExpression =
30-
UserStatsQueryHelper.userStatsExpression(qUser, currentUser);
29+
UserStatsQueryHelper.userStatsExpression(qUser);
3130
final Tuple row = queryFactory.select(qUser, userStatsExpression)
3231
.from(qUser)
3332
.where(qUser.id.eq(userId))
3433
.fetchOne();
35-
return Optional.ofNullable(row)
36-
.map(tuple ->
37-
Row.builder()
38-
.user(tuple.get(qUser))
39-
.userStats(tuple.get(userStatsExpression))
40-
.build()
41-
);
34+
return Optional.ofNullable(row).map(tuple ->
35+
Row.builder()
36+
.user(tuple.get(qUser))
37+
.userStats(tuple.get(userStatsExpression))
38+
.build()
39+
);
4240
}
4341

4442

src/main/java/com/myapp/repository/helper/UserStatsQueryHelper.java

+2-15
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,14 @@
1414

1515
public class UserStatsQueryHelper {
1616

17-
public static ConstructorExpression<UserStats> userStatsExpression(QUser qUser, User currentUser) {
17+
public static ConstructorExpression<UserStats> userStatsExpression(QUser qUser) {
1818
return Projections.constructor(UserStats.class,
1919
cntPostsQuery(qUser),
2020
cntFollowingsQuery(qUser),
21-
cntFollowersQuery(qUser),
22-
isFollowedByMeQuery(qUser, currentUser)
21+
cntFollowersQuery(qUser)
2322
);
2423
}
2524

26-
private static JPQLQuery<Boolean> isFollowedByMeQuery(QUser qUser, User currentUser) {
27-
final QRelationship qRelationship = new QRelationship("relationship_is_followed_by_me");
28-
return JPAExpressions.select(qRelationship.count().eq(1L))
29-
.from(qRelationship)
30-
.where(qRelationship.followed.eq(qUser)
31-
.and(Optional.ofNullable(currentUser)
32-
.map(qRelationship.follower::eq)
33-
.orElse(qRelationship.ne(qRelationship)) // make it always false when no current user
34-
)
35-
);
36-
}
37-
3825
private static JPQLQuery<Long> cntFollowersQuery(QUser qUser) {
3926
final QRelationship qRelationship = new QRelationship("relationship_cnt_followers");
4027
return JPAExpressions.select(qRelationship.count())

src/main/java/com/myapp/service/MicropostServiceImpl.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import java.util.List;
1515
import java.util.Optional;
16+
import java.util.function.Function;
1617
import java.util.stream.Collectors;
1718

1819
@Service
@@ -44,22 +45,16 @@ public void delete(Long id) throws NotPermittedException {
4445
public List<PostDTO> findAsFeed(PageParams pageParams) {
4546
final User currentUser = securityContextService.currentUser();
4647
return micropostCustomRepository.findAsFeed(currentUser, pageParams)
47-
.map(r -> {
48-
final Boolean isMyPost = (r.getMicropost().getUser().equals(currentUser));
49-
return PostDTO.newInstance(r.getMicropost(), r.getUserStats(), isMyPost);
50-
})
48+
.map(toDTO(currentUser))
5149
.collect(Collectors.toList());
5250
}
5351

5452
@Override
5553
public List<PostDTO> findByUser(Long userId, PageParams pageParams) {
5654
final User user = userRepository.findOne(userId);
5755
final User currentUser = securityContextService.currentUser();
58-
final Boolean isMyself = Optional.ofNullable(currentUser)
59-
.map(user::equals)
60-
.orElse(null);
6156
return micropostCustomRepository.findByUser(user, pageParams)
62-
.map(r -> PostDTO.newInstance(r.getMicropost(), isMyself))
57+
.map(toDTO(currentUser))
6358
.collect(Collectors.toList());
6459
}
6560

@@ -76,4 +71,13 @@ public Micropost saveMyPost(Micropost post) {
7671
return micropostRepository.save(post);
7772
}
7873

74+
private Function<MicropostCustomRepository.Row, PostDTO> toDTO(User currentUser) {
75+
return r -> {
76+
final Boolean isMyPost = Optional.ofNullable(currentUser)
77+
.map(u -> r.getMicropost().getUser().equals(u))
78+
.orElse(null);
79+
return PostDTO.newInstance(r.getMicropost(), r.getUserStats(), isMyPost);
80+
};
81+
}
82+
7983
}

src/main/java/com/myapp/service/RelationshipServiceImpl.java

+9-8
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,17 @@ public RelationshipServiceImpl(RelationshipRepository relationshipRepository,
3535
@Override
3636
public List<RelatedUserDTO> findFollowings(Long userId, PageParams pageParams) {
3737
final User user = userRepository.findOne(userId);
38-
final User currentUser = securityContextService.currentUser();
39-
final List<RelatedUserCustomRepository.Row> rows = relatedUserCustomRepository.findFollowings(user, currentUser, pageParams);
38+
final List<RelatedUserCustomRepository.Row> rows = relatedUserCustomRepository.findFollowings(user, pageParams);
4039

41-
return rowsToRelatedUsers(currentUser, rows);
40+
return rowsToRelatedUsers(rows);
4241
}
4342

4443
@Override
4544
public List<RelatedUserDTO> findFollowers(Long userId, PageParams pageParams) {
4645
final User user = userRepository.findOne(userId);
47-
final User currentUser = securityContextService.currentUser();
48-
final List<RelatedUserCustomRepository.Row> rows = relatedUserCustomRepository.findFollowers(user, currentUser, pageParams);
46+
final List<RelatedUserCustomRepository.Row> rows = relatedUserCustomRepository.findFollowers(user, pageParams);
4947

50-
return rowsToRelatedUsers(currentUser, rows);
48+
return rowsToRelatedUsers(rows);
5149
}
5250

5351
@Override
@@ -70,15 +68,18 @@ public void unfollow(Long userId) throws RelationshipNotFoundException {
7068
relationshipRepository.delete(relationship);
7169
}
7270

73-
private List<RelatedUserDTO> rowsToRelatedUsers(User currentUser, List<RelatedUserCustomRepository.Row> rows) {
71+
private List<RelatedUserDTO> rowsToRelatedUsers(List<RelatedUserCustomRepository.Row> rows) {
72+
final User currentUser = securityContextService.currentUser();
7473
final List<User> relatedUsers = rows.stream()
7574
.map(RelatedUserCustomRepository.Row::getUser)
7675
.collect(Collectors.toList());
7776

7877
final List<User> followedByMe = userRepository.findFollowedBy(currentUser, relatedUsers);
7978

8079
return rows.stream().map(row -> {
81-
final boolean isFollowedByMe = followedByMe.contains(row.getUser());
80+
final Boolean isFollowedByMe = Optional.ofNullable(currentUser)
81+
.map(u -> followedByMe.contains(row.getUser()))
82+
.orElse(null) ;
8283
final Boolean isMyself = Optional.ofNullable(currentUser)
8384
.map(u -> currentUser.equals(row.getUser()))
8485
.orElse(null);

src/main/java/com/myapp/service/UserServiceImpl.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,14 @@ public UserServiceImpl(UserRepository userRepository,
3737

3838
@Override
3939
public Optional<UserDTO> findOne(Long id) {
40-
final User currentUser = securityContextService.currentUser();
41-
42-
return userCustomRepository.findOne(id, currentUser).map(r -> {
43-
final boolean isFollowedByMe = relationshipRepository.findOneByFollowerAndFollowed(currentUser, r.getUser()).isPresent();
40+
return userCustomRepository.findOne(id).map(r -> {
41+
final User currentUser = securityContextService.currentUser();
42+
final Boolean isFollowedByMe = Optional.ofNullable(currentUser)
43+
.map(u -> relationshipRepository
44+
.findOneByFollowerAndFollowed(u, r.getUser())
45+
.isPresent()
46+
)
47+
.orElse(null);
4448
final Boolean isMyself = Optional.ofNullable(currentUser)
4549
.map(u -> u.equals(r.getUser()))
4650
.orElse(null);

src/test/groovy/com/myapp/controller/UserControllerTest.groovy

+4-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class UserControllerTest extends BaseControllerTest {
125125
given:
126126
userService.findOne(1) >> {
127127
User user = new User(id: 1, username: "test1@test.com", password: "secret", name: "test")
128-
UserStats userStats = new UserStats(3, 2, 1, false)
128+
UserStats userStats = new UserStats(3, 2, 1)
129129
return Optional.of(UserDTO.newInstance(user, userStats, null))
130130
}
131131

@@ -139,6 +139,7 @@ class UserControllerTest extends BaseControllerTest {
139139
andExpect(jsonPath('$.email', isEmptyOrNullString()))
140140
andExpect(jsonPath('$.avatarHash', is("94fba03762323f286d7c3ca9e001c541")))
141141
andExpect(jsonPath('$.isMyself', nullValue()))
142+
andExpect(jsonPath('$.isFollowedByMe', nullValue()))
142143
andExpect(jsonPath('$.userStats').exists())
143144
andExpect(jsonPath('$.userStats.micropostCnt', is(3)))
144145
andExpect(jsonPath('$.userStats.followingCnt', is(2)))
@@ -164,7 +165,7 @@ class UserControllerTest extends BaseControllerTest {
164165
signIn()
165166
userService.findMe() >> {
166167
User user = new User(id: 1, username: "test1@test.com", password: "secret", name: "test")
167-
UserStats userStats = new UserStats(3, 2, 1, true)
168+
UserStats userStats = new UserStats(3, 2, 1)
168169
return Optional.of(UserDTO.newInstance(user, userStats, true))
169170
}
170171

@@ -178,6 +179,7 @@ class UserControllerTest extends BaseControllerTest {
178179
andExpect(jsonPath('$.email', is("test1@test.com")))
179180
andExpect(jsonPath('$.avatarHash', is("94fba03762323f286d7c3ca9e001c541")))
180181
andExpect(jsonPath('$.isMyself', is(true)))
182+
andExpect(jsonPath('$.isFollowedByMe', nullValue()))
181183
andExpect(jsonPath('$.userStats').exists())
182184
andExpect(jsonPath('$.userStats.micropostCnt', is(3)))
183185
andExpect(jsonPath('$.userStats.followingCnt', is(2)))

src/test/groovy/com/myapp/repository/MicropostCustomRepositoryTest.groovy

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class MicropostCustomRepositoryTest extends BaseRepositoryTest {
3232
}
3333

3434
when:
35-
def result = micropostCustomRepository.findAsFeed(follower, new PageParams()).collect()
35+
List<MicropostCustomRepository.Row> result = micropostCustomRepository.findAsFeed(follower, new PageParams()).collect()
3636

3737
then:
3838
result.size() == 4
@@ -48,7 +48,7 @@ class MicropostCustomRepositoryTest extends BaseRepositoryTest {
4848
Micropost post3 = micropostRepository.save(new Micropost(content: "test3", user: user))
4949

5050
when:
51-
def result = micropostCustomRepository.findAsFeed(user, new PageParams(sinceId: post2.id)).collect()
51+
List<MicropostCustomRepository.Row> result = micropostCustomRepository.findAsFeed(user, new PageParams(sinceId: post2.id)).collect()
5252

5353
then:
5454
result.size() == 1
@@ -70,7 +70,7 @@ class MicropostCustomRepositoryTest extends BaseRepositoryTest {
7070
Micropost post3 = micropostRepository.save(new Micropost(content: "test3", user: user))
7171

7272
when:
73-
def result = micropostCustomRepository.findByUser(user, new PageParams(sinceId: post2.id)).collect()
73+
List<MicropostCustomRepository.Row> result = micropostCustomRepository.findByUser(user, new PageParams(sinceId: post2.id)).collect()
7474

7575
then:
7676
result.size() == 1

0 commit comments

Comments
 (0)