Skip to content

Commit fc03e25

Browse files
committed
implemented task to delete invalid data
1 parent 10c294b commit fc03e25

File tree

9 files changed

+152
-4
lines changed

9 files changed

+152
-4
lines changed

captchaservice-backend/src/main/java/de/muenchen/captchaservice/MicroServiceApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
67

78
/**
89
* Application class for starting the microservice.
910
*/
1011
@SpringBootApplication
1112
@ConfigurationPropertiesScan
13+
@EnableScheduling
1214
@SuppressWarnings("PMD.UseUtilityClass")
1315
public class MicroServiceApplication {
1416
public static void main(final String[] args) {

captchaservice-backend/src/main/java/de/muenchen/captchaservice/repository/CaptchaRequestRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@
99

1010
public interface CaptchaRequestRepository extends PagingAndSortingRepository<CaptchaRequest, UUID>, CrudRepository<CaptchaRequest, UUID> {
1111
long countBySourceAddressHashIgnoreCaseAndValidUntilGreaterThanEqual(String sourceAddressHash, Instant validUntil);
12+
13+
long deleteByValidUntilLessThan(Instant validUntil);
14+
15+
int countBySourceAddressHash(String sourceAddressHash);
1216
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/repository/InvalidatedPayloadRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@
99

1010
public interface InvalidatedPayloadRepository extends PagingAndSortingRepository<InvalidatedPayload, UUID>, CrudRepository<InvalidatedPayload, UUID> {
1111
long countByPayloadHashIgnoreCaseAndValidUntilGreaterThanEqual(String payloadHash, Instant validUntil);
12+
13+
long deleteByValidUntilLessThan(Instant validUntil);
14+
15+
long countByPayloadHash(String payloadHash);
1216
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import de.muenchen.captchaservice.entity.InvalidatedPayload;
77
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
88
import de.muenchen.captchaservice.service.difficulty.DifficultyService;
9+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
910
import lombok.extern.slf4j.Slf4j;
1011
import org.altcha.altcha.Altcha;
1112
import org.apache.commons.codec.digest.DigestUtils;
@@ -21,8 +22,9 @@ public class CaptchaService {
2122
private final InvalidatedPayloadRepository invalidatedPayloadRepository;
2223
private final DifficultyService difficultyService;
2324

25+
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
2426
public CaptchaService(final CaptchaProperties captchaProperties, final DifficultyService difficultyService,
25-
InvalidatedPayloadRepository invalidatedPayloadRepository) {
27+
final InvalidatedPayloadRepository invalidatedPayloadRepository) {
2628
this.captchaProperties = captchaProperties;
2729
this.invalidatedPayloadRepository = invalidatedPayloadRepository;
2830
this.difficultyService = difficultyService;

captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/difficulty/DifficultyService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import de.muenchen.captchaservice.data.SourceAddress;
77
import de.muenchen.captchaservice.entity.CaptchaRequest;
88
import de.muenchen.captchaservice.repository.CaptchaRequestRepository;
9+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
910
import lombok.extern.slf4j.Slf4j;
1011
import org.springframework.stereotype.Service;
1112

@@ -20,7 +21,8 @@ public class DifficultyService {
2021

2122
private final CaptchaRequestRepository captchaRequestRepository;
2223

23-
public DifficultyService(final CaptchaProperties captchaProperties, CaptchaRequestRepository captchaRequestRepository) {
24+
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
25+
public DifficultyService(final CaptchaProperties captchaProperties, final CaptchaRequestRepository captchaRequestRepository) {
2426
this.captchaProperties = captchaProperties;
2527
this.captchaRequestRepository = captchaRequestRepository;
2628
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package de.muenchen.captchaservice.service.invalidateddate;
2+
3+
import de.muenchen.captchaservice.repository.CaptchaRequestRepository;
4+
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
5+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
6+
import jakarta.transaction.Transactional;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.stereotype.Service;
9+
10+
import java.time.Instant;
11+
12+
@Service
13+
@Slf4j
14+
public class InvalidatedDataService {
15+
private final CaptchaRequestRepository captchaRequestRepository;
16+
private final InvalidatedPayloadRepository invalidatedPayloadRepository;
17+
18+
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
19+
public InvalidatedDataService(final CaptchaRequestRepository captchaRequestRepository, final InvalidatedPayloadRepository invalidatedPayloadRepository) {
20+
this.captchaRequestRepository = captchaRequestRepository;
21+
this.invalidatedPayloadRepository = invalidatedPayloadRepository;
22+
}
23+
24+
@Transactional
25+
public void deleteInvalidatedData() {
26+
final long deletedCaptchaRequestCount = captchaRequestRepository.deleteByValidUntilLessThan(Instant.now());
27+
if (deletedCaptchaRequestCount > 0) {
28+
log.info("Deleted {} invalid CaptchaRequests", deletedCaptchaRequestCount);
29+
}
30+
final long deletedInvalidatedPayloadCount = invalidatedPayloadRepository.deleteByValidUntilLessThan(Instant.now());
31+
if (deletedInvalidatedPayloadCount > 0) {
32+
log.info("Deleted {} invalid InvalidatedPayloads", deletedInvalidatedPayloadCount);
33+
}
34+
}
35+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package de.muenchen.captchaservice.task;
2+
3+
import de.muenchen.captchaservice.service.invalidateddate.InvalidatedDataService;
4+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.scheduling.annotation.Scheduled;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.util.concurrent.TimeUnit;
10+
11+
@Component
12+
@Slf4j
13+
public class DeleteInvalidatedDataTask {
14+
private final InvalidatedDataService invalidatedDataService;
15+
16+
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
17+
public DeleteInvalidatedDataTask(final InvalidatedDataService invalidatedDataService) {
18+
this.invalidatedDataService = invalidatedDataService;
19+
}
20+
21+
@Scheduled(fixedRate = 1, timeUnit = TimeUnit.HOURS)
22+
public void deleteInvalidatedData() {
23+
invalidatedDataService.deleteInvalidatedData();
24+
}
25+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package de.muenchen.captchaservice.service.invalidateddate;
2+
3+
import de.muenchen.captchaservice.TestConstants;
4+
import de.muenchen.captchaservice.entity.CaptchaRequest;
5+
import de.muenchen.captchaservice.entity.InvalidatedPayload;
6+
import de.muenchen.captchaservice.repository.CaptchaRequestRepository;
7+
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
8+
import de.muenchen.captchaservice.util.DatabaseTestUtil;
9+
import org.apache.commons.codec.digest.DigestUtils;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.test.context.SpringBootTest;
13+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
14+
import org.springframework.test.context.ActiveProfiles;
15+
import org.testcontainers.containers.PostgreSQLContainer;
16+
import org.testcontainers.junit.jupiter.Container;
17+
import org.testcontainers.utility.DockerImageName;
18+
19+
import java.time.Instant;
20+
import java.time.Period;
21+
22+
import static de.muenchen.captchaservice.TestConstants.SPRING_NO_SECURITY_PROFILE;
23+
import static de.muenchen.captchaservice.TestConstants.SPRING_TEST_PROFILE;
24+
import static org.junit.jupiter.api.Assertions.assertEquals;
25+
26+
@SpringBootTest
27+
@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE })
28+
class InvalidatedDataServiceTest {
29+
30+
@Container
31+
@ServiceConnection
32+
@SuppressWarnings("unused")
33+
private static final PostgreSQLContainer<?> POSTGRE_SQL_CONTAINER = new PostgreSQLContainer<>(
34+
DockerImageName.parse(TestConstants.TESTCONTAINERS_POSTGRES_IMAGE));
35+
@Autowired
36+
private CaptchaRequestRepository captchaRequestRepository;
37+
@Autowired
38+
private DatabaseTestUtil databaseTestUtil;
39+
@Autowired
40+
private InvalidatedPayloadRepository invalidatedPayloadRepository;
41+
@Autowired
42+
private InvalidatedDataService invalidatedDataService;
43+
44+
@Test
45+
void deleteInvalidatedData() {
46+
databaseTestUtil.clearDatabase();
47+
48+
final String validHash = DigestUtils.sha256Hex("valid");
49+
final String invalidHash = DigestUtils.sha256Hex("invalid");
50+
51+
// Invalid data
52+
captchaRequestRepository.save(new CaptchaRequest(validHash, Instant.now().plus(Period.ofDays(1))));
53+
captchaRequestRepository.save(new CaptchaRequest(validHash, Instant.now().plus(Period.ofDays(1))));
54+
invalidatedPayloadRepository.save(new InvalidatedPayload(validHash, Instant.now().plus(Period.ofDays(1))));
55+
invalidatedPayloadRepository.save(new InvalidatedPayload(validHash, Instant.now().plus(Period.ofDays(1))));
56+
57+
// Valid data
58+
captchaRequestRepository.save(new CaptchaRequest(invalidHash, Instant.now().minus(Period.ofDays(1))));
59+
captchaRequestRepository.save(new CaptchaRequest(invalidHash, Instant.now().minus(Period.ofDays(1))));
60+
invalidatedPayloadRepository.save(new InvalidatedPayload(invalidHash, Instant.now().minus(Period.ofDays(1))));
61+
invalidatedPayloadRepository.save(new InvalidatedPayload(invalidHash, Instant.now().minus(Period.ofDays(1))));
62+
63+
assertEquals(4, invalidatedPayloadRepository.count());
64+
assertEquals(4, captchaRequestRepository.count());
65+
66+
invalidatedDataService.deleteInvalidatedData();
67+
68+
assertEquals(2, invalidatedPayloadRepository.count());
69+
assertEquals(2, captchaRequestRepository.count());
70+
assertEquals(2, captchaRequestRepository.countBySourceAddressHash(validHash));
71+
assertEquals(2, invalidatedPayloadRepository.countByPayloadHash(validHash));
72+
}
73+
74+
}

captchaservice-backend/src/test/java/de/muenchen/captchaservice/util/DatabaseTestUtil.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package de.muenchen.captchaservice.util;
22

3-
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
43
import de.muenchen.captchaservice.repository.CaptchaRequestRepository;
4+
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
55
import org.springframework.stereotype.Component;
66

77
@Component
@@ -10,7 +10,7 @@ public class DatabaseTestUtil {
1010
private final CaptchaRequestRepository captchaRequestRepository;
1111
private final InvalidatedPayloadRepository invalidatedPayloadRepository;
1212

13-
public DatabaseTestUtil(CaptchaRequestRepository captchaRequestRepository, InvalidatedPayloadRepository invalidatedPayloadRepository) {
13+
public DatabaseTestUtil(final CaptchaRequestRepository captchaRequestRepository, final InvalidatedPayloadRepository invalidatedPayloadRepository) {
1414
this.captchaRequestRepository = captchaRequestRepository;
1515
this.invalidatedPayloadRepository = invalidatedPayloadRepository;
1616
}

0 commit comments

Comments
 (0)