44import java .util .List ;
55import java .util .Optional ;
66
7+ import org .springframework .beans .factory .annotation .Autowired ;
78import org .springframework .context .ApplicationEventPublisher ;
89import org .springframework .data .redis .core .StringRedisTemplate ;
910import org .springframework .stereotype .Service ;
2425import com .back .global .error .code .EventErrorCode ;
2526import com .back .global .error .code .PreRegisterErrorCode ;
2627import com .back .global .error .exception .ErrorException ;
28+ import com .back .global .security .service .FingerprintService ;
2729
28- import lombok .RequiredArgsConstructor ;
2930import lombok .extern .slf4j .Slf4j ;
3031
3132@ Slf4j
3233@ Service
33- @ RequiredArgsConstructor
3434@ Transactional (readOnly = true )
3535public class PreRegisterService {
3636
@@ -40,68 +40,113 @@ public class PreRegisterService {
4040 private final ApplicationEventPublisher eventPublisher ;
4141 private final StringRedisTemplate redisTemplate ;
4242 private final S3PresignedService s3PresignedService ;
43+ private FingerprintService fingerprintService ;
44+
45+ public PreRegisterService (
46+ PreRegisterRepository preRegisterRepository ,
47+ EventRepository eventRepository ,
48+ UserRepository userRepository ,
49+ ApplicationEventPublisher eventPublisher ,
50+ StringRedisTemplate redisTemplate ,
51+ S3PresignedService s3PresignedService ) {
52+ this .preRegisterRepository = preRegisterRepository ;
53+ this .eventRepository = eventRepository ;
54+ this .userRepository = userRepository ;
55+ this .eventPublisher = eventPublisher ;
56+ this .redisTemplate = redisTemplate ;
57+ this .s3PresignedService = s3PresignedService ;
58+ }
59+
60+ @ Autowired (required = false )
61+ public void setFingerprintService (FingerprintService fingerprintService ) {
62+ this .fingerprintService = fingerprintService ;
63+ }
4364
4465 private static final String SMS_VERIFIED_PREFIX = "SMS_VERIFIED:" ;
4566
4667 @ Transactional
47- public PreRegisterResponse register (Long eventId , Long userId , PreRegisterCreateRequest request ) {
68+ public PreRegisterResponse register (Long eventId , Long userId , PreRegisterCreateRequest request , String visitorId ) {
4869 Event event = findEventById (eventId );
4970 User user = findUserById (userId );
5071
51- // 사전등록 기간 검증
52- validatePreRegistrationPeriod (event );
72+ try {
73+ // 사전등록 기간 검증
74+ validatePreRegistrationPeriod (event );
5375
54- // SMS 인증 완료 여부 검증 (플래그 삭제하지 않고 검증만)
55- validateSmsVerificationWithoutDelete (request .phoneNumber ());
76+ // SMS 인증 완료 여부 검증 (플래그 삭제하지 않고 검증만)
77+ validateSmsVerificationWithoutDelete (request .phoneNumber ());
5678
57- // 본인 인증 정보 검증 (회원가입 정보와 대조)
58- validateUserInfo (user , request );
79+ // 본인 인증 정보 검증 (회원가입 정보와 대조)
80+ validateUserInfo (user , request );
5981
60- // 약관 동의 검증
61- validateAgreements (request );
82+ // 약관 동의 검증
83+ validateAgreements (request );
6284
63- // 기존 사전등록 확인 (CANCELED 상태면 재활용)
64- Optional <PreRegister > existingPreRegister = preRegisterRepository .findByEvent_IdAndUser_Id (eventId , userId );
85+ // 기존 사전등록 확인 (CANCELED 상태면 재활용)
86+ Optional <PreRegister > existingPreRegister = preRegisterRepository .findByEvent_IdAndUser_Id (eventId , userId );
6587
66- if (existingPreRegister .isPresent ()) {
67- PreRegister preRegister = existingPreRegister .get ();
88+ if (existingPreRegister .isPresent ()) {
89+ PreRegister preRegister = existingPreRegister .get ();
6890
69- // REGISTERED 상태면 중복 등록 예외
70- if (preRegister .isRegistered ()) {
71- throw new ErrorException (PreRegisterErrorCode .ALREADY_PRE_REGISTERED );
72- }
91+ // REGISTERED 상태면 중복 등록 예외
92+ if (preRegister .isRegistered ()) {
93+ throw new ErrorException (PreRegisterErrorCode .ALREADY_PRE_REGISTERED );
94+ }
7395
74- // CANCELED 상태면 재등록 (상태만 변경)
75- preRegister .reRegister ();
96+ // CANCELED 상태면 재등록 (상태만 변경)
97+ preRegister .reRegister ();
7698
77- // 모든 검증 통과 후 SMS 인증 플래그 삭제
78- deleteSmsVerificationFlag (request .phoneNumber ());
99+ // 모든 검증 통과 후 SMS 인증 플래그 삭제
100+ deleteSmsVerificationFlag (request .phoneNumber ());
79101
80- return PreRegisterResponse .from (preRegister );
81- }
102+ // Fingerprint 성공 기록
103+ if (fingerprintService != null && visitorId != null ) {
104+ fingerprintService .recordAttempt (visitorId , true );
105+ }
82106
83- // 새로운 사전등록 생성
84- PreRegister preRegister = PreRegister .builder ()
85- .event (event )
86- .user (user )
87- .preRegisterAgreeTerms (request .agreeTerms ())
88- .preRegisterAgreePrivacy (request .agreePrivacy ())
89- .build ();
107+ return PreRegisterResponse .from (preRegister );
108+ }
90109
91- PreRegister savedPreRegister = preRegisterRepository .save (preRegister );
110+ // 새로운 사전등록 생성
111+ PreRegister preRegister = PreRegister .builder ()
112+ .event (event )
113+ .user (user )
114+ .preRegisterAgreeTerms (request .agreeTerms ())
115+ .preRegisterAgreePrivacy (request .agreePrivacy ())
116+ .build ();
92117
93- // 모든 검증 통과 후 SMS 인증 플래그 삭제
94- deleteSmsVerificationFlag (request .phoneNumber ());
118+ PreRegister savedPreRegister = preRegisterRepository .save (preRegister );
95119
96- eventPublisher .publishEvent (
97- new PreRegisterDoneMessage (
98- userId ,
99- savedPreRegister .getId (),
100- event .getTitle ()
101- )
102- );
120+ // 모든 검증 통과 후 SMS 인증 플래그 삭제
121+ deleteSmsVerificationFlag (request .phoneNumber ());
122+
123+ eventPublisher .publishEvent (
124+ new PreRegisterDoneMessage (
125+ userId ,
126+ savedPreRegister .getId (),
127+ event .getTitle ()
128+ )
129+ );
130+
131+ // Fingerprint 성공 기록
132+ if (fingerprintService != null && visitorId != null ) {
133+ fingerprintService .recordAttempt (visitorId , true );
134+ }
103135
104- return PreRegisterResponse .from (savedPreRegister );
136+ return PreRegisterResponse .from (savedPreRegister );
137+ } catch (ErrorException e ) {
138+ // Fingerprint 실패 기록 (검증 실패)
139+ if (fingerprintService != null && visitorId != null ) {
140+ fingerprintService .recordAttempt (visitorId , false );
141+ }
142+ throw e ;
143+ } catch (Exception e ) {
144+ // Fingerprint 실패 기록 (시스템 에러)
145+ if (fingerprintService != null && visitorId != null ) {
146+ fingerprintService .recordAttempt (visitorId , false );
147+ }
148+ throw e ;
149+ }
105150 }
106151
107152 @ Transactional
@@ -217,4 +262,3 @@ private void deleteSmsVerificationFlag(String phoneNumber) {
217262 redisTemplate .delete (verifiedKey );
218263 }
219264}
220-
0 commit comments