Skip to content

Commit 68555d1

Browse files
authored
Merge pull request #29 from jamilhelal37/main
الحق الدومين جميل قاعد يعدل عال main
2 parents 2550159 + b63485a commit 68555d1

17 files changed

Lines changed: 2836 additions & 440 deletions

File tree

src/main/java/com/jamil/ahadith/features/account/service/PasswordResetService.java

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import com.jamil.ahadith.features.account.entity.PasswordResetToken;
1212
import com.jamil.ahadith.features.account.event.AccountEmailEvent;
1313
import com.jamil.ahadith.features.account.repository.PasswordResetTokenRepository;
14-
import com.jamil.ahadith.features.audit.service.AuditEventPublisher;
1514
import com.jamil.ahadith.features.user.entity.User;
1615
import com.jamil.ahadith.features.user.entity.UserStatus;
1716
import com.jamil.ahadith.features.user.repository.UserRepository;
@@ -23,17 +22,15 @@
2322
import org.springframework.transaction.annotation.Transactional;
2423

2524
import java.time.Instant;
26-
import java.util.Map;
2725

2826
@Service
2927
@RequiredArgsConstructor
3028
public 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+
}

src/main/java/com/jamil/ahadith/features/audit/dto/response/ActivityLogResponseDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.time.LocalDateTime;
66
import java.util.Map;
77
import java.util.UUID;
8+
import java.util.List;
89

910
@Data
1011
public class ActivityLogResponseDto {
@@ -18,5 +19,6 @@ public class ActivityLogResponseDto {
1819
private UUID recordId;
1920
private Map<String, Object> oldData;
2021
private Map<String, Object> newData;
22+
private List<String> changes;
2123
private LocalDateTime createdAt;
2224
}

0 commit comments

Comments
 (0)