-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathProfileService.java
More file actions
87 lines (70 loc) · 3.46 KB
/
ProfileService.java
File metadata and controls
87 lines (70 loc) · 3.46 KB
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
package life.mosu.mosuserver.application.profile;
import life.mosu.mosuserver.domain.profile.entity.Gender;
import life.mosu.mosuserver.domain.profile.entity.ProfileJpaEntity;
import life.mosu.mosuserver.domain.profile.repository.ProfileJpaRepository;
import life.mosu.mosuserver.domain.user.entity.UserJpaEntity;
import life.mosu.mosuserver.domain.user.entity.UserRole;
import life.mosu.mosuserver.domain.user.repository.UserJpaRepository;
import life.mosu.mosuserver.global.exception.CustomRuntimeException;
import life.mosu.mosuserver.global.exception.ErrorCode;
import life.mosu.mosuserver.global.util.PhoneNumberUtil;
import life.mosu.mosuserver.presentation.profile.dto.EditProfileRequest;
import life.mosu.mosuserver.presentation.profile.dto.ProfileDetailResponse;
import life.mosu.mosuserver.presentation.profile.dto.SignUpProfileRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
@RequiredArgsConstructor
public class ProfileService {
private final UserJpaRepository userRepository;
private final ProfileJpaRepository profileJpaRepository;
private final ProfileEventTxService eventTxService;
@Transactional
public void registerProfile(Long userId, SignUpProfileRequest request) {
UserJpaEntity user = userRepository.findById(userId).orElseThrow(
() -> new CustomRuntimeException(ErrorCode.USER_NOT_FOUND, userId)
);
checkIfProfileExistsForUser(user);
try {
ProfileJpaEntity profile = request.toEntity(userId);
profileJpaRepository.save(profile);
user.grantUserRole();
syncUserInfoFromProfile(user, request);
eventTxService.publishSuccessEvent(userId);
} catch (DataIntegrityViolationException ex) {
throw new CustomRuntimeException(ErrorCode.PROFILE_ALREADY_EXISTS, userId);
} catch (Exception ex) {
log.error("프로필 등록 실패: {}", ex.getMessage(), ex);
throw ex;
}
}
@Transactional
public void editProfile(Long userId, EditProfileRequest request) {
ProfileJpaEntity profile = profileJpaRepository.findByUserId(userId)
.orElseThrow(() -> new CustomRuntimeException(ErrorCode.PROFILE_NOT_FOUND, userId));
profile.edit(request);
}
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public ProfileDetailResponse getProfile(Long userId) {
ProfileJpaEntity profile = profileJpaRepository.findByUserId(userId)
.orElseThrow(
() -> new CustomRuntimeException(ErrorCode.PROFILE_DOES_NOT_EXIST, userId));
return ProfileDetailResponse.from(profile);
}
private void checkIfProfileExistsForUser(UserJpaEntity user) {
if (user.getUserRole() != UserRole.ROLE_PENDING) {
throw new CustomRuntimeException(ErrorCode.PROFILE_ALREADY_EXISTS, user.getId());
}
}
private void syncUserInfoFromProfile(UserJpaEntity user, SignUpProfileRequest request) {
if (user.isMosuUser()) {
user.updateUserInfo(Gender.fromName(request.gender()), request.userName(),
PhoneNumberUtil.formatPhoneNumber(request.phoneNumber()), request.birth());
}
}
}