8
8
import com .github .nramc .dev .journey .api .services .confirmationcode .ConfirmationCode ;
9
9
import com .github .nramc .dev .journey .api .services .confirmationcode .ConfirmationCodeService ;
10
10
import com .github .nramc .dev .journey .api .services .confirmationcode .ConfirmationUseCase ;
11
+ import com .github .nramc .dev .journey .api .web .dto .user .security .UserSecurityAttribute ;
12
+ import com .github .nramc .dev .journey .api .web .exceptions .BusinessException ;
11
13
import com .github .nramc .dev .journey .api .web .exceptions .TechnicalException ;
14
+ import com .github .nramc .dev .journey .api .web .resources .rest .users .security .email .UserSecurityEmailAddressAttributeService ;
12
15
import jakarta .mail .MessagingException ;
13
16
import lombok .RequiredArgsConstructor ;
14
17
import lombok .extern .slf4j .Slf4j ;
@@ -32,6 +35,7 @@ public class EmailConfirmationCodeService implements ConfirmationCodeService {
32
35
private final MailService mailService ;
33
36
private final ConfirmationCodeRepository codeRepository ;
34
37
private final EmailCodeValidator emailCodeValidator ;
38
+ private final UserSecurityEmailAddressAttributeService emailAddressAttributeService ;
35
39
36
40
/**
37
41
* Generate Email code securely
@@ -44,15 +48,22 @@ public class EmailConfirmationCodeService implements ConfirmationCodeService {
44
48
@ Override
45
49
public void send (AuthUser authUser , ConfirmationUseCase useCase ) {
46
50
51
+ UserSecurityAttribute emailAttribute = getUserEmailSecurityAttribute (authUser );
52
+
47
53
EmailCode emailCode = generateEmailCode ();
48
54
49
- sendEmailCode (useCase , emailCode , authUser );
55
+ sendEmailCode (useCase , emailCode , authUser , emailAttribute );
50
56
51
- saveEmailCode (useCase , emailCode , authUser );
57
+ saveEmailCode (useCase , emailCode , authUser , emailAttribute );
52
58
53
59
log .info ("Email Code has been sent to registered email address" );
54
60
}
55
61
62
+ private UserSecurityAttribute getUserEmailSecurityAttribute (AuthUser authUser ) {
63
+ return emailAddressAttributeService .provideEmailAttributeIfExists (authUser )
64
+ .orElseThrow (() -> new BusinessException ("email.not.exists" , "Email not registered" ));
65
+ }
66
+
56
67
/**
57
68
* Verify given Email Code for authenticated user.
58
69
* In order to consider code is valid, below conditions should be satisfied
@@ -68,6 +79,7 @@ public boolean verify(ConfirmationCode confirmationCode, AuthUser authUser, Conf
68
79
boolean isEmailCodeValid = emailCodeValidator .isValid (confirmationCode , authUser );
69
80
70
81
if (isEmailCodeValid ) {
82
+ emailAddressAttributeService .setVerifiedStatus (true , authUser );
71
83
invalidateAllCodes (authUser );
72
84
log .info ("Email Code verified successfully and all codes invalidated" );
73
85
}
@@ -80,25 +92,26 @@ EmailCode generateEmailCode() {
80
92
return EmailCode .valueOf (code );
81
93
}
82
94
83
- private void sendEmailCode (ConfirmationUseCase useCase , EmailCode emailCode , AuthUser authUser ) {
95
+ private void sendEmailCode (ConfirmationUseCase useCase , EmailCode emailCode , AuthUser authUser ,
96
+ UserSecurityAttribute emailAttribute ) {
84
97
try {
85
98
Map <String , Object > parameters = new HashedMap <>();
86
99
parameters .put ("name" , authUser .getName ());
87
100
parameters .put ("ottPin" , emailCode .code ());
88
101
89
- mailService .sendEmailUsingTemplate (EMAIL_CODE_TEMPLATE_HTML , authUser . getEmailAddress (), getSubject (useCase ), parameters );
102
+ mailService .sendEmailUsingTemplate (EMAIL_CODE_TEMPLATE_HTML , emailAttribute . value (), getSubject (useCase ), parameters );
90
103
} catch (RuntimeException | MessagingException ex ) {
91
104
throw new TechnicalException ("Unable to send Email Code" , ex );
92
105
}
93
106
}
94
107
95
- private void saveEmailCode (ConfirmationUseCase useCase , EmailCode code , AuthUser authUser ) {
108
+ private void saveEmailCode (ConfirmationUseCase useCase , EmailCode code , AuthUser authUser , UserSecurityAttribute emailAttribute ) {
96
109
ConfirmationCodeEntity entity = ConfirmationCodeEntity .builder ()
97
110
.id (UUID .randomUUID ().toString ())
98
111
.type (ConfirmationCodeType .EMAIL_CODE )
99
112
.code (code .code ())
100
113
.username (authUser .getUsername ())
101
- .receiver (authUser . getEmailAddress ())
114
+ .receiver (emailAttribute . value ())
102
115
.isActive (true )
103
116
.createdAt (LocalDateTime .now ().minusMinutes (2 ))
104
117
.useCase (useCase )
0 commit comments