Skip to content

Commit 7159e7a

Browse files
📝 CodeRabbit Chat: Refactor CaptchaService to use AtomicLong counter for invalidated payloads
1 parent 5cf8b5b commit 7159e7a

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/captcha/CaptchaService.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.micrometer.core.instrument.Counter;
1313
import io.micrometer.core.instrument.DistributionSummary;
1414
import io.micrometer.core.instrument.Gauge;
15+
import java.util.concurrent.atomic.AtomicLong;
1516
import lombok.extern.slf4j.Slf4j;
1617
import org.altcha.altcha.Altcha;
1718
import org.apache.commons.codec.digest.DigestUtils;
@@ -29,6 +30,7 @@ public class CaptchaService {
2930
private final Counter challengeCounter;
3031
private final Counter verifySuccessCounter;
3132
private final DistributionSummary tookTimeSummary;
33+
private final AtomicLong invalidatedPayloadCount = new AtomicLong(0);
3234

3335
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
3436
public CaptchaService(final CaptchaProperties captchaProperties, final DifficultyService difficultyService,
@@ -37,6 +39,9 @@ public CaptchaService(final CaptchaProperties captchaProperties, final Difficult
3739
this.invalidatedPayloadRepository = invalidatedPayloadRepository;
3840
this.difficultyService = difficultyService;
3941

42+
// Initialize counter with current count from database
43+
this.invalidatedPayloadCount.set(invalidatedPayloadRepository.countByExpiresAtGreaterThan(Instant.now()));
44+
4045
// Initialize metrics
4146
this.challengeCounter = Counter.builder("captcha.challenge.requests")
4247
.description("Counter for captcha challenge requests")
@@ -47,7 +52,7 @@ public CaptchaService(final CaptchaProperties captchaProperties, final Difficult
4752
this.tookTimeSummary = DistributionSummary.builder("captcha.verify.took.time")
4853
.description("Summary of the time taken to verify captcha payloads")
4954
.register(registry);
50-
Gauge.builder("captcha.invalidated.payloads", invalidatedPayloadRepository, repo -> repo.countByExpiresAtGreaterThan(Instant.now()))
55+
Gauge.builder("captcha.invalidated.payloads", invalidatedPayloadCount, AtomicLong::get)
5156
.description("Gauge for the number of currently invalidated payloads")
5257
.register(registry);
5358
}
@@ -92,6 +97,7 @@ public boolean verify(final String siteKey, final ExtendedPayload payload) {
9297
public void invalidatePayload(final Altcha.Payload payload) {
9398
final String payloadHash = getPayloadHash(payload);
9499
final InvalidatedPayload invalidatedPayload = new InvalidatedPayload(payloadHash, Instant.now().plusSeconds(captchaProperties.captchaTimeoutSeconds()));
100+
invalidatedPayloadCount.incrementAndGet();
95101
invalidatedPayloadRepository.save(invalidatedPayload);
96102
log.debug("Invalidated payloadHash: {}", payloadHash);
97103
}
@@ -113,4 +119,14 @@ private static String getPayloadHash(final Altcha.Payload payload) {
113119
payload.signature));
114120
}
115121

122+
123+
/**
124+
* Decrements the invalidated payload counter when expired payloads are cleaned up.
125+
* This method should be called by the ExpiredDataService when it removes expired entries.
126+
*
127+
* @param count the number of expired payloads that were removed
128+
*/
129+
public void decrementInvalidatedPayloadCount(long count) {
130+
invalidatedPayloadCount.addAndGet(-count);
131+
}
116132
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/expireddata/ExpiredDataService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import de.muenchen.captchaservice.repository.CaptchaRequestRepository;
44
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
5+
import de.muenchen.captchaservice.service.captcha.CaptchaService;
56
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
67
import jakarta.transaction.Transactional;
78
import lombok.extern.slf4j.Slf4j;
@@ -14,11 +15,13 @@
1415
public class ExpiredDataService {
1516
private final CaptchaRequestRepository captchaRequestRepository;
1617
private final InvalidatedPayloadRepository invalidatedPayloadRepository;
18+
private final CaptchaService captchaService;
1719

1820
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
19-
public ExpiredDataService(final CaptchaRequestRepository captchaRequestRepository, final InvalidatedPayloadRepository invalidatedPayloadRepository) {
21+
public ExpiredDataService(final CaptchaRequestRepository captchaRequestRepository, final InvalidatedPayloadRepository invalidatedPayloadRepository, final CaptchaService captchaService) {
2022
this.captchaRequestRepository = captchaRequestRepository;
2123
this.invalidatedPayloadRepository = invalidatedPayloadRepository;
24+
this.captchaService = captchaService;
2225
}
2326

2427
@Transactional
@@ -31,6 +34,7 @@ public void deleteExpiredData() {
3134
final long deletedInvalidatedPayloadCount = invalidatedPayloadRepository.deleteByExpiresAtLessThan(now);
3235
if (deletedInvalidatedPayloadCount > 0) {
3336
log.info("Deleted {} expired InvalidatedPayloads", deletedInvalidatedPayloadCount);
37+
captchaService.decrementInvalidatedPayloadCount(deletedInvalidatedPayloadCount);
3438
}
3539
}
3640
}

0 commit comments

Comments
 (0)