-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUserService.java
154 lines (135 loc) Β· 6.82 KB
/
UserService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package net.pengcook.user.service;
import java.util.List;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import net.pengcook.authentication.domain.UserInfo;
import net.pengcook.comment.repository.CommentRepository;
import net.pengcook.image.service.ImageClientService;
import net.pengcook.like.repository.RecipeLikeRepository;
import net.pengcook.recipe.domain.Recipe;
import net.pengcook.recipe.repository.RecipeRepository;
import net.pengcook.recipe.service.RecipeService;
import net.pengcook.user.domain.BlockedUserGroup;
import net.pengcook.user.domain.User;
import net.pengcook.user.domain.UserBlock;
import net.pengcook.user.domain.UserFollow;
import net.pengcook.user.domain.UserReport;
import net.pengcook.user.dto.ProfileResponse;
import net.pengcook.user.dto.ReportRequest;
import net.pengcook.user.dto.ReportResponse;
import net.pengcook.user.dto.UpdateProfileRequest;
import net.pengcook.user.dto.UpdateProfileResponse;
import net.pengcook.user.dto.UserBlockResponse;
import net.pengcook.user.dto.UserResponse;
import net.pengcook.user.dto.UsernameCheckResponse;
import net.pengcook.user.exception.NotFoundException;
import net.pengcook.user.exception.UserNotFoundException;
import net.pengcook.user.repository.UserBlockRepository;
import net.pengcook.user.repository.UserFollowRepository;
import net.pengcook.user.repository.UserReportRepository;
import net.pengcook.user.repository.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@AllArgsConstructor
public class UserService {
private final RecipeService recipeService;
private final UserFollowService userFollowService;
private final UserRepository userRepository;
private final RecipeRepository recipeRepository;
private final CommentRepository commentRepository;
private final RecipeLikeRepository recipeLikeRepository;
private final UserBlockRepository userBlockRepository;
private final UserReportRepository userReportRepository;
private final ImageClientService imageClientService;
private final UserFollowRepository userFollowRepository;
@Transactional(readOnly = true)
public ProfileResponse getProfile(long followerId, long followeeId) {
User user = userRepository.findById(followeeId)
.orElseThrow(() -> new UserNotFoundException("μ¬μ©μλ₯Ό μ°Ύμ μ μμ΅λλ€."));
long recipeCount = recipeRepository.countByAuthorId(followeeId);
boolean isFollow = userFollowRepository.existsByFollowerIdAndFolloweeId(followerId, followeeId);
return new ProfileResponse(user, recipeCount, isFollow);
}
@Transactional(readOnly = true)
public UsernameCheckResponse checkUsername(String username) {
boolean userExists = userRepository.existsByUsername(username);
return new UsernameCheckResponse(!userExists);
}
@Transactional
public UpdateProfileResponse updateProfile(long userId, UpdateProfileRequest updateProfileRequest) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new UserNotFoundException("μ¬μ©μλ₯Ό μ°Ύμ μ μμ΅λλ€."));
String userImage = updateProfileRequest.image();
if (!userImage.startsWith("http")) {
userImage = imageClientService.getImageUrl(userImage).url();
}
user.update(
updateProfileRequest.username(),
updateProfileRequest.nickname(),
userImage,
updateProfileRequest.region()
);
return new UpdateProfileResponse(user);
}
@Transactional
public UserBlockResponse blockUser(long blockerId, long blockeeId) {
User blocker = userRepository.findById(blockerId)
.orElseThrow(() -> new UserNotFoundException("μ μμ μΌλ‘ λ‘κ·ΈμΈλμ§ μμμ΅λλ€."));
User blockee = userRepository.findById(blockeeId)
.orElseThrow(() -> new UserNotFoundException("μ°¨λ¨ν μ¬μ©μλ₯Ό μ°Ύμ μ μμ΅λλ€."));
userFollowService.blockUserFollow(blockerId, blockeeId);
UserBlock userBlock = userBlockRepository.save(new UserBlock(blocker, blockee));
return new UserBlockResponse(new UserResponse(userBlock.getBlocker()),
new UserResponse(userBlock.getBlockee()));
}
@Transactional
public ReportResponse report(long reporterId, ReportRequest reportRequest) {
User reporter = userRepository.findById(reporterId)
.orElseThrow(() -> new NotFoundException("μ κ³ μ μ 보λ₯Ό μ‘°νν μ μμ΅λλ€."));
User reportee = userRepository.findById(reportRequest.reporteeId())
.orElseThrow(() -> new NotFoundException("νΌμ κ³ μ μ 보λ₯Ό μ‘°νν μ μμ΅λλ€."));
UserReport userReport = new UserReport(
reporter,
reportee,
reportRequest.reason(),
reportRequest.type(),
reportRequest.targetId(),
reportRequest.details()
);
UserReport savedUserReport = userReportRepository.save(userReport);
return new ReportResponse(savedUserReport);
}
@Transactional(readOnly = true)
public BlockedUserGroup getBlockedUserGroup(long blockerId) {
return userBlockRepository.findAllByBlockerId(blockerId).stream()
.map(UserBlock::getBlockee)
.collect(Collectors.collectingAndThen(Collectors.toSet(), BlockedUserGroup::new));
}
@Transactional
public void deleteUser(UserInfo userInfo) {
User user = userRepository.findById(userInfo.getId())
.orElseThrow(() -> new NotFoundException("μ¬μ©μλ₯Ό μ°Ύμ μ μμ΅λλ€."));
commentRepository.deleteByUserId(userInfo.getId());
recipeLikeRepository.deleteByUserId(userInfo.getId());
userBlockRepository.deleteByBlockerId(userInfo.getId());
userBlockRepository.deleteByBlockeeId(userInfo.getId());
userReportRepository.deleteByReporterId(userInfo.getId());
userReportRepository.deleteByReporteeId(userInfo.getId());
List<Recipe> userRecipes = recipeRepository.findAllByAuthorId(userInfo.getId());
for (Recipe recipe : userRecipes) {
recipeService.deleteRecipe(userInfo, recipe);
}
List<UserFollow> followings = userFollowRepository.findAllByFollowerId(userInfo.getId());
for (UserFollow userFollow : followings) {
userFollow.getFollowee().decreaseFollowerCount();
userFollowRepository.delete(userFollow);
}
List<UserFollow> followers = userFollowRepository.findAllByFolloweeId(userInfo.getId());
for (UserFollow userFollow : followers) {
userFollow.getFollower().decreaseFolloweeCount();
userFollowRepository.delete(userFollow);
}
userRepository.delete(user);
}
}