1111import com .jamil .ahadith .features .account .entity .PasswordResetToken ;
1212import com .jamil .ahadith .features .account .event .AccountEmailEvent ;
1313import com .jamil .ahadith .features .account .repository .PasswordResetTokenRepository ;
14- import com .jamil .ahadith .features .audit .service .AuditEventPublisher ;
1514import com .jamil .ahadith .features .user .entity .User ;
1615import com .jamil .ahadith .features .user .entity .UserStatus ;
1716import com .jamil .ahadith .features .user .repository .UserRepository ;
2322import org .springframework .transaction .annotation .Transactional ;
2423
2524import java .time .Instant ;
26- import java .util .Map ;
2725
2826@ Service
2927@ RequiredArgsConstructor
3028public class PasswordResetService {
3129
32- private static final String USERS_TABLE_NAME = "users" ;
33- private static final String PASSWORD_RESET_AUDIT_EVENT = "password reset completed" ;
3430 private static final String ACCOUNT_NOT_ACTIVE_MESSAGE = "Account is not active" ;
3531 private static final String INVALID_PASSWORD_RESET_TOKEN_MESSAGE = "Invalid or expired password reset token" ;
36- private static final String FORGOT_PASSWORD_MESSAGE = "If the email is registered, password reset instructions have been sent" ;
32+ private static final String FORGOT_PASSWORD_MESSAGE =
33+ "If the email is registered, password reset instructions have been sent" ;
3734
3835 private final UserRepository userRepository ;
3936 private final PasswordEncoder passwordEncoder ;
@@ -42,7 +39,6 @@ public class PasswordResetService {
4239 private final MailConfigProperties mailProperties ;
4340 private final PasswordPolicyService passwordPolicyService ;
4441 private final RefreshTokenRevoker refreshTokenRevoker ;
45- private final AuditEventPublisher auditEventPublisher ;
4642 private final RateLimitService rateLimitService ;
4743 private final RateLimitKeyResolver rateLimitKeyResolver ;
4844 private final OneTimeTokenValidator oneTimeTokenValidator ;
@@ -75,7 +71,11 @@ public MessageResponseDto resetPassword(ResetPasswordRequestDto request) {
7571
7672 PasswordResetToken resetToken = passwordResetTokenRepository
7773 .findByTokenHashForUpdate (tokenHash )
78- .orElseThrow (() -> new BadCredentialsException (INVALID_PASSWORD_RESET_TOKEN_MESSAGE ));
74+ .orElseThrow (() ->
75+ new BadCredentialsException (
76+ INVALID_PASSWORD_RESET_TOKEN_MESSAGE
77+ )
78+ );
7979
8080 oneTimeTokenValidator .validate (
8181 resetToken .getConsumedAt (),
@@ -87,55 +87,64 @@ public MessageResponseDto resetPassword(ResetPasswordRequestDto request) {
8787 User user = resetToken .getUser ();
8888 requireActive (user );
8989
90- String encodedPassword = passwordEncoder . encode ( request . getNewPassword ());
91- int previousTokenVersion = user . getTokenVersion ( );
92-
90+ String encodedPassword =
91+ passwordEncoder . encode ( request . getNewPassword () );
92+
9393 user .setPassword (encodedPassword );
94- user .setTokenVersion (previousTokenVersion + 1 );
94+ user .setTokenVersion (user .getTokenVersion () + 1 );
95+
9596 resetToken .setConsumedAt (now );
9697
9798 refreshTokenRevoker .revokeAllForUser (user );
98- createPasswordResetAuditLog (user , previousTokenVersion );
9999
100100 passwordResetTokenRepository .consumeActiveForUser (user , now );
101- // passwordResetTokenRepository.save(resetToken); // Managed via dirty checking
102- // userRepository.save(user); // Managed via dirty checking
103101
104- return new MessageResponseDto ("Password has been reset" );
102+ return new MessageResponseDto (
103+ "Password has been reset"
104+ );
105105 }
106106
107- private void createAndSendPasswordResetToken (User user , Instant now ) {
107+ private void createAndSendPasswordResetToken (
108+ User user ,
109+ Instant now
110+ ) {
108111 passwordResetTokenRepository .consumeActiveForUser (user , now );
109112
110- String rawToken = tokenHashService .generateOpaqueToken ();
111- PasswordResetToken resetToken = new PasswordResetToken ();
113+ String rawToken =
114+ tokenHashService .generateOpaqueToken ();
115+
116+ PasswordResetToken resetToken =
117+ new PasswordResetToken ();
118+
112119 resetToken .setUser (user );
113- resetToken .setTokenHash (tokenHashService .sha256 (rawToken ));
114- resetToken .setExpiresAt (now .plus (mailProperties .getResetTokenTtl ()));
120+ resetToken .setTokenHash (
121+ tokenHashService .sha256 (rawToken )
122+ );
123+ resetToken .setExpiresAt (
124+ now .plus (mailProperties .getResetTokenTtl ())
125+ );
115126
116127 passwordResetTokenRepository .save (resetToken );
117128
118- eventPublisher .publishEvent (new AccountEmailEvent (user , rawToken , AccountEmailEvent .EmailEventType .PASSWORD_RESET ));
129+ eventPublisher .publishEvent (
130+ new AccountEmailEvent (
131+ user ,
132+ rawToken ,
133+ AccountEmailEvent .EmailEventType .PASSWORD_RESET
134+ )
135+ );
119136 }
120137
121138 private void requireActive (User user ) {
122139 if (!isActive (user )) {
123- throw new ForbiddenException (ACCOUNT_NOT_ACTIVE_MESSAGE );
140+ throw new ForbiddenException (
141+ ACCOUNT_NOT_ACTIVE_MESSAGE
142+ );
124143 }
125144 }
126145
127146 private boolean isActive (User user ) {
128- return user != null && user .getStatus () == UserStatus .active ;
129- }
130-
131- private void createPasswordResetAuditLog (User user , int previousTokenVersion ) {
132- auditEventPublisher .publishUpdateAs (
133- user ,
134- USERS_TABLE_NAME ,
135- user .getId (),
136- Map .of ("tokenVersion" , previousTokenVersion ),
137- Map .of ("event" , PASSWORD_RESET_AUDIT_EVENT , "tokenVersion" , user .getTokenVersion ()),
138- PASSWORD_RESET_AUDIT_EVENT
139- );
147+ return user != null
148+ && user .getStatus () == UserStatus .active ;
140149 }
141- }
150+ }
0 commit comments