1111import org .devkor .apu .saerok_server .domain .user .core .entity .UserRoleType ;
1212import org .devkor .apu .saerok_server .domain .user .core .repository .UserRepository ;
1313import org .devkor .apu .saerok_server .domain .user .core .repository .UserRoleRepository ;
14+ import org .devkor .apu .saerok_server .domain .user .core .service .ProfileImageDefaultService ;
1415import org .devkor .apu .saerok_server .global .shared .exception .SocialAuthAlreadyExistsException ;
1516import org .springframework .stereotype .Service ;
1617
17- /**
18- * 새로운 유저에 대한 프로비저닝(Provisioning: 사용자가 요청한 IT 자원을 사용할 수 있는 상태로 준비하는 것)을 담당하는 도메인 서비스
19- * 사용자 관점에서는 "회원가입", 시스템 관점에서는 "프로비저닝".
20- */
2118@ Service
2219@ RequiredArgsConstructor
2320@ Transactional
@@ -26,9 +23,10 @@ public class UserProvisioningService {
2623 private final UserRepository userRepository ;
2724 private final UserRoleRepository userRoleRepository ;
2825 private final SocialAuthRepository socialAuthRepository ;
26+ private final ProfileImageDefaultService profileImageDefaultService ;
2927
3028 /**
31- * 새로운 사용자에게 필요한 자원(User, UserRole, SocialAuth)을 할당한다.
29+ * 새로운 사용자에게 필요한 자원을 할당한다.
3230 * @param provider 소셜 공급자 (ex. Apple, Kakao)
3331 * @param userInfo 소셜 공급자로부터 받은 사용자 정보 (sub, email)
3432 * @return 해당 사용자에게 생성된 SocialAuth 엔티티
@@ -40,10 +38,39 @@ public SocialAuth provisionNewUser(SocialProviderType provider, SocialUserInfo u
4038 }
4139
4240 User user = userRepository .save (User .createUser (userInfo .email ()));
41+ profileImageDefaultService .setRandomVariant (user );
42+
4343 userRoleRepository .save (UserRole .createUserRole (user , UserRoleType .USER ));
4444
4545 return socialAuthRepository .save (
4646 SocialAuth .createSocialAuth (user , provider , userInfo .sub ())
4747 );
4848 }
49+
50+ /**
51+ * 탈퇴했던 사용자가 재가입할 때 필요한 자원을 다시 준비한다.
52+ * 기존 users 레코드를 그대로 사용하고, 다음을 수행한다:
53+ * - signupStatus → PROFILE_REQUIRED
54+ * - deleted_at → null
55+ * - joined_at → 현재 시각
56+ * - 이메일이 비어 있으면 소셜에서 받은 이메일로 복구
57+ * - USER 롤이 없으면 다시 부여
58+ * - 기본 프로필 이미지가 비어 있으면 랜덤 배정
59+ */
60+ public void provisionRejoinedUser (User user , String email ) {
61+
62+ user .restoreForRejoin ();
63+
64+ if (user .getEmail () == null && email != null ) {
65+ user .setEmail (email );
66+ }
67+
68+ if (userRoleRepository .findByUser (user ).isEmpty ()) {
69+ userRoleRepository .save (UserRole .createUserRole (user , UserRoleType .USER ));
70+ }
71+
72+ if (user .getDefaultProfileImageVariant () == null ) {
73+ profileImageDefaultService .setRandomVariant (user );
74+ }
75+ }
4976}
0 commit comments