Skip to content

Commit 78d6328

Browse files
committed
♻️ blocking logic
1 parent 95017c4 commit 78d6328

File tree

5 files changed

+60
-7
lines changed

5 files changed

+60
-7
lines changed

backend/src/main/java/net/pengcook/user/aop/BlockedUserFilterAspect.java

+25-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import lombok.RequiredArgsConstructor;
66
import net.pengcook.authentication.domain.UserInfo;
77
import net.pengcook.user.domain.BlockeeGroup;
8+
import net.pengcook.user.domain.BlockerGroup;
89
import net.pengcook.user.domain.Ownable;
10+
import net.pengcook.user.exception.ForbiddenException;
911
import net.pengcook.user.service.UserService;
1012
import org.aspectj.lang.ProceedingJoinPoint;
1113
import org.aspectj.lang.annotation.Around;
@@ -36,8 +38,9 @@ public Object filterBlockedAuthorsFromList(ProceedingJoinPoint joinPoint) throws
3638
}
3739

3840
BlockeeGroup blockeeGroup = userService.getBlockeeGroup(userInfo.getId());
41+
BlockerGroup blockerGroup = userService.getBlockerGroup(userInfo.getId());
3942

40-
return filterBlockedUsers(ownables, blockeeGroup);
43+
return filterBlockedUsers(ownables, blockeeGroup, blockerGroup);
4144
}
4245

4346
@Pointcut("execution(java.util.Optional<net.pengcook.user.domain.Ownable+> net.pengcook..repository..*(..))")
@@ -55,17 +58,22 @@ public Object filterBlockedAuthorFromOptional(ProceedingJoinPoint joinPoint) thr
5558

5659
BlockeeGroup blockeeGroup = userService.getBlockeeGroup(userInfo.getId());
5760
if (blockeeGroup.contains(ownableOptional.get().getOwnerId())) {
58-
return Optional.empty();
61+
throw new ForbiddenException("차단한 사용자입니다.");
62+
}
63+
64+
BlockerGroup blockerGroup = userService.getBlockerGroup(userInfo.getId());
65+
if (blockerGroup.contains(ownableOptional.get().getOwnerId())) {
66+
throw new ForbiddenException("게시글을 이용할 수 없습니다.");
5967
}
6068

6169
return ownableOptional;
6270
}
6371

6472
@Pointcut("execution(net.pengcook.user.domain.Ownable+ net.pengcook..repository..*(..))")
65-
public void repositoryMethodsReturningOwnable() {
73+
public void repositoryMethodsReturningAuthorAble() {
6674
}
6775

68-
@Around("repositoryMethodsReturningOwnable()")
76+
@Around("repositoryMethodsReturningAuthorAble()")
6977
public Object filterBlockedAuthor(ProceedingJoinPoint joinPoint) throws Throwable {
7078
Ownable ownable = (Ownable) joinPoint.proceed();
7179

@@ -76,7 +84,12 @@ public Object filterBlockedAuthor(ProceedingJoinPoint joinPoint) throws Throwabl
7684

7785
BlockeeGroup blockeeGroup = userService.getBlockeeGroup(userInfo.getId());
7886
if (blockeeGroup.contains(ownable.getOwnerId())) {
79-
return null;
87+
throw new ForbiddenException("차단한 사용자입니다.");
88+
}
89+
90+
BlockerGroup blockerGroup = userService.getBlockerGroup(userInfo.getId());
91+
if (blockerGroup.contains(ownable.getOwnerId())) {
92+
throw new ForbiddenException("게시글을 이용할 수 없습니다.");
8093
}
8194

8295
return ownable;
@@ -91,9 +104,14 @@ private UserInfo getCurrentUserInfo() {
91104
}
92105
}
93106

94-
private List<Ownable> filterBlockedUsers(List<Ownable> ownables, BlockeeGroup blockeeGroup) {
95-
return ownables.stream()
107+
private List<Ownable> filterBlockedUsers(
108+
List<Ownable> authorAbles,
109+
BlockeeGroup blockeeGroup,
110+
BlockerGroup blockerGroup
111+
) {
112+
return authorAbles.stream()
96113
.filter(item -> !blockeeGroup.contains(item.getOwnerId()))
114+
.filter(item -> !blockerGroup.contains(item.getOwnerId()))
97115
.toList();
98116
}
99117
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package net.pengcook.user.domain;
2+
3+
import java.util.Set;
4+
import lombok.AllArgsConstructor;
5+
6+
@AllArgsConstructor
7+
public class BlockerGroup {
8+
9+
private final Set<User> users;
10+
11+
public boolean contains(long userId) {
12+
return users.stream()
13+
.anyMatch(user -> user.isSameUser(userId));
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package net.pengcook.user.exception;
2+
3+
import org.springframework.http.HttpStatus;
4+
5+
public class ForbiddenException extends UserException {
6+
public ForbiddenException(String message) {
7+
super(HttpStatus.FORBIDDEN, message);
8+
}
9+
}

backend/src/main/java/net/pengcook/user/repository/UserBlockRepository.java

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
public interface UserBlockRepository extends JpaRepository<UserBlock, Long> {
1010
List<UserBlock> findAllByBlockerId(long blockerId);
1111

12+
List<UserBlock> findAllByBlockeeId(long blockeeId);
13+
1214
void deleteByBlockeeId(long blockeeId);
1315

1416
void deleteByBlockerId(long blockerId);

backend/src/main/java/net/pengcook/user/service/UserService.java

+9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.pengcook.recipe.repository.RecipeRepository;
1111
import net.pengcook.recipe.service.RecipeService;
1212
import net.pengcook.user.domain.BlockeeGroup;
13+
import net.pengcook.user.domain.BlockerGroup;
1314
import net.pengcook.user.domain.User;
1415
import net.pengcook.user.domain.UserBlock;
1516
import net.pengcook.user.domain.UserReport;
@@ -116,6 +117,14 @@ public BlockeeGroup getBlockeeGroup(long blockerId) {
116117
.collect(Collectors.collectingAndThen(Collectors.toSet(), BlockeeGroup::new));
117118
}
118119

120+
@Transactional(readOnly = true)
121+
public BlockerGroup getBlockerGroup(long blockeeId) {
122+
123+
return userBlockRepository.findAllByBlockeeId(blockeeId).stream()
124+
.map(UserBlock::getBlocker)
125+
.collect(Collectors.collectingAndThen(Collectors.toSet(), BlockerGroup::new));
126+
}
127+
119128
@Transactional
120129
public void deleteUser(UserInfo userInfo) {
121130
User user = userRepository.findById(userInfo.getId())

0 commit comments

Comments
 (0)