-
Notifications
You must be signed in to change notification settings - Fork 0
/
UserService.java
165 lines (143 loc) · 6.14 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
155
156
157
158
159
160
161
162
163
164
165
package com.m3pro.groundflip.service;
import java.io.IOException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.m3pro.groundflip.domain.dto.user.UserDeleteRequest;
import com.m3pro.groundflip.domain.dto.user.UserInfoRequest;
import com.m3pro.groundflip.domain.dto.user.UserInfoResponse;
import com.m3pro.groundflip.domain.entity.AppleRefreshToken;
import com.m3pro.groundflip.domain.entity.User;
import com.m3pro.groundflip.domain.entity.UserCommunity;
import com.m3pro.groundflip.enums.Provider;
import com.m3pro.groundflip.enums.UserStatus;
import com.m3pro.groundflip.exception.AppException;
import com.m3pro.groundflip.exception.ErrorCode;
import com.m3pro.groundflip.jwt.JwtProvider;
import com.m3pro.groundflip.repository.AppleRefreshTokenRepository;
import com.m3pro.groundflip.repository.FcmTokenRepository;
import com.m3pro.groundflip.repository.RankingHistoryRepository;
import com.m3pro.groundflip.repository.UserCommunityRepository;
import com.m3pro.groundflip.repository.UserRankingRedisRepository;
import com.m3pro.groundflip.repository.UserRepository;
import com.m3pro.groundflip.service.oauth.AppleApiClient;
import com.m3pro.groundflip.util.DateUtils;
import com.m3pro.groundflip.util.S3Uploader;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Service
@RequiredArgsConstructor
@Slf4j
public class UserService {
private final RankingHistoryRepository rankingHistoryRepository;
private final UserRankingRedisRepository userRankingRedisRepository;
private final UserRepository userRepository;
private final AppleRefreshTokenRepository appleRefreshTokenRepository;
private final UserCommunityRepository userCommunityRepository;
private final FcmTokenRepository fcmTokenRepository;
private final S3Uploader s3Uploader;
private final JwtProvider jwtProvider;
private final AppleApiClient appleApiClient;
@Value("${image.default}")
private String defaultImagePath;
/**
* 유저의 정보를 반환한다.
* @param userId 사용자 Id
* @return 사용자 ID, 사용자 닉네임, 사용자 프로필 사진 주소, 그룹 ID, 그룹 이름, 사용자 출생년도, 사용자 성별
*/
public UserInfoResponse getUserInfo(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
List<UserCommunity> userCommunity = userCommunityRepository.findByUserId(userId);
LocalDate localDate = user.getBirthYear().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year = localDate.getYear();
if (userCommunity.isEmpty()) {
return UserInfoResponse.from(user, year, null, null);
} else {
Long communityId = userCommunity.get(0).getCommunity().getId();
String communityName = userCommunity.get(0).getCommunity().getName();
return UserInfoResponse.from(user, year, communityId, communityName);
}
}
/**
* 유저의 정보를 수정한다
* @Param userId 유저id
* @Param userInfoRequest 유저정보dto (gender, year, nickname)
* @Param 이미지 multipartFile
* convertToDate() int로 들어온 year을 Date로 변환
* checkNicknameExists() 닉네임 중복 체크를 위해 닉네임이 있는지 확인
* */
@Transactional
public void putUserInfo(Long userId, UserInfoRequest userInfoRequest, MultipartFile multipartFile) throws
IOException {
String fileS3Url;
User user = userRepository.findById(userId)
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
if (checkNicknameExists(userInfoRequest, user)) {
throw new AppException(ErrorCode.DUPLICATED_NICKNAME);
}
if (multipartFile != null) {
fileS3Url = s3Uploader.uploadFiles(multipartFile, userId);
} else {
if (userInfoRequest.getDefaultCheck() == 1) {
fileS3Url = defaultImagePath;
} else {
fileS3Url = user.getProfileImage();
}
}
user.updateGender(userInfoRequest.getGender());
user.updateBirthYear(convertToDate(userInfoRequest.getBirthYear()));
user.updateNickName(userInfoRequest.getNickname());
user.updateStatus(UserStatus.COMPLETE);
user.updateProfileImage(fileS3Url);
userRepository.save(user);
userRankingRedisRepository.saveUserInRanking(user.getId());
}
private Date convertToDate(int year) {
LocalDate localDate = LocalDate.of(year, 1, 1);
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
}
private boolean checkNicknameExists(UserInfoRequest userInfoRequest, User user) {
boolean isDuplicate = false;
if (!userInfoRequest.getNickname().equals(user.getNickname())) {
if (userRepository.findByNickname(userInfoRequest.getNickname()).isPresent()) {
isDuplicate = true;
}
}
return isDuplicate;
}
@Transactional
public void deleteUser(Long userId, UserDeleteRequest userDeleteRequest) {
User deletedUser = userRepository.findById(userId)
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
if (deletedUser.getProvider() == Provider.APPLE) {
revokeAppleToken(deletedUser.getId());
}
fcmTokenRepository.deleteByUser(deletedUser);
deletedUser.updateBirthYear(convertToDate(1900));
deletedUser.updateNickName(null);
deletedUser.updateProfileImage(null);
deletedUser.updateEmail("unknown@unknown.com");
jwtProvider.expireToken(userDeleteRequest.getAccessToken());
jwtProvider.expireToken(userDeleteRequest.getRefreshToken());
int year = LocalDate.now().getYear();
int week = DateUtils.getWeekOfDate(LocalDate.now());
rankingHistoryRepository.deleteByUserIdAndYearAndWeek(userId, year, week);
userRankingRedisRepository.deleteUserInRanking(userId);
}
private void revokeAppleToken(Long userId) {
try {
AppleRefreshToken appleRefreshToken = appleRefreshTokenRepository.findByUserId(userId)
.orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR));
appleApiClient.revokeToken(appleRefreshToken.getRefreshToken());
appleRefreshTokenRepository.delete(appleRefreshToken);
} catch (Exception e) {
log.warn("revoke apple token failed userId : [{}]", userId);
}
}
}