Skip to content

Commit 6625b92

Browse files
authored
Merge pull request #79 from it-at-m/feature/replace-hazelcast-with-database
Replace Hazelcast with database
2 parents 63dc2a6 + b78eb10 commit 6625b92

File tree

26 files changed

+499
-206
lines changed

26 files changed

+499
-206
lines changed

captchaservice-backend/pom.xml

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@
5656

5757
<!-- Additional required dependencies -->
5858
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> <!-- Needed to make MapStruct and Lombok work together -->
59+
60+
<!-- Flyway maven plugin configuration for local stack database -->
61+
<flyway.url>jdbc:postgresql://localhost:5432/postgres</flyway.url>
62+
<flyway.user>admin</flyway.user>
63+
<flyway.password>admin</flyway.password>
64+
<flyway.locations>classpath:db/migration/schema,classpath:db/migration/testdata</flyway.locations>
5965
</properties>
6066

6167

@@ -76,6 +82,14 @@
7682
<dependencies>
7783

7884
<!-- Spring Boot -->
85+
<dependency>
86+
<groupId>org.springframework.boot</groupId>
87+
<artifactId>spring-boot-starter-data-rest</artifactId>
88+
</dependency>
89+
<dependency>
90+
<groupId>org.springframework.boot</groupId>
91+
<artifactId>spring-boot-starter-data-jpa</artifactId>
92+
</dependency>
7993
<dependency>
8094
<groupId>org.springframework.boot</groupId>
8195
<artifactId>spring-boot-starter-web</artifactId>
@@ -131,6 +145,30 @@
131145
<artifactId>json-path</artifactId>
132146
</dependency>
133147

148+
<!-- Database -->
149+
<dependency>
150+
<groupId>org.postgresql</groupId>
151+
<artifactId>postgresql</artifactId>
152+
</dependency>
153+
<dependency>
154+
<groupId>org.hibernate.orm</groupId>
155+
<artifactId>hibernate-core</artifactId>
156+
</dependency>
157+
<!-- Hibernate Model Gen for type safe criterias -->
158+
<dependency>
159+
<groupId>org.hibernate.orm</groupId>
160+
<artifactId>hibernate-jpamodelgen</artifactId>
161+
</dependency>
162+
<!-- Database migrations -->
163+
<dependency>
164+
<groupId>org.flywaydb</groupId>
165+
<artifactId>flyway-core</artifactId>
166+
</dependency>
167+
<dependency>
168+
<groupId>org.flywaydb</groupId>
169+
<artifactId>flyway-database-postgresql</artifactId>
170+
</dependency>
171+
134172
<!-- Other -->
135173
<dependency>
136174
<groupId>org.apache.httpcomponents.client5</groupId>
@@ -189,6 +227,11 @@
189227
<artifactId>junit-jupiter</artifactId>
190228
<scope>test</scope>
191229
</dependency>
230+
<dependency>
231+
<groupId>org.testcontainers</groupId>
232+
<artifactId>postgresql</artifactId>
233+
<scope>test</scope>
234+
</dependency>
192235
<dependency>
193236
<groupId>org.junit.jupiter</groupId>
194237
<artifactId>junit-jupiter-api</artifactId>
@@ -270,11 +313,6 @@
270313
<artifactId>altcha</artifactId>
271314
<version>1.1.2</version>
272315
</dependency>
273-
<dependency>
274-
<groupId>com.hazelcast</groupId>
275-
<artifactId>hazelcast</artifactId>
276-
<version>5.3.8</version>
277-
</dependency>
278316
</dependencies>
279317

280318
<scm>
@@ -447,6 +485,18 @@
447485
</execution>
448486
</executions>
449487
</plugin>
488+
<plugin>
489+
<!-- Flyway Maven plugin for local database management
490+
Usage:
491+
- Clean database: mvn flyway:clean
492+
- Apply migrations: mvn flyway:migrate
493+
- Reset and migrate: mvn flyway:clean flyway:migrate
494+
495+
Note: Use -Dflyway.cleanDisabled=false when running clean command
496+
-->
497+
<groupId>org.flywaydb</groupId>
498+
<artifactId>flyway-maven-plugin</artifactId>
499+
</plugin>
450500
</plugins>
451501
</build>
452502

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) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package de.muenchen.captchaservice.common;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
import jakarta.persistence.MappedSuperclass;
8+
import java.io.Serial;
9+
import java.io.Serializable;
10+
import java.util.UUID;
11+
import lombok.EqualsAndHashCode;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
import lombok.Setter;
15+
import lombok.ToString;
16+
17+
@MappedSuperclass
18+
@NoArgsConstructor
19+
@Getter
20+
@Setter
21+
@ToString
22+
@EqualsAndHashCode
23+
public abstract class BaseEntity implements Serializable {
24+
25+
@Serial
26+
private static final long serialVersionUID = 1L;
27+
28+
@Column(name = "id", length = 36)
29+
@Id
30+
@GeneratedValue(strategy = GenerationType.UUID)
31+
private UUID id;
32+
33+
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/common/HazelcastConstants.java

Lines changed: 0 additions & 6 deletions
This file was deleted.

captchaservice-backend/src/main/java/de/muenchen/captchaservice/configuration/hazelcast/HazelcastConfiguration.java

Lines changed: 0 additions & 82 deletions
This file was deleted.

captchaservice-backend/src/main/java/de/muenchen/captchaservice/configuration/hazelcast/HazelcastProperties.java

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package de.muenchen.captchaservice.entity;
2+
3+
import de.muenchen.captchaservice.common.BaseEntity;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.Index;
7+
import jakarta.persistence.Table;
8+
import jakarta.validation.constraints.NotNull;
9+
import jakarta.validation.constraints.Size;
10+
import lombok.*;
11+
12+
import java.time.Instant;
13+
14+
@Entity
15+
@Table(
16+
indexes = {
17+
@Index(name = "idx_captcha_request_source_address_hash", columnList = "sourceAddressHash"),
18+
@Index(name = "idx_captcha_request_expires_at", columnList = "expiresAt")
19+
}
20+
)
21+
22+
// Definition of getter, setter, ...
23+
@Getter
24+
@Setter
25+
@ToString(callSuper = true)
26+
@EqualsAndHashCode(callSuper = true)
27+
@NoArgsConstructor
28+
@AllArgsConstructor
29+
public class CaptchaRequest extends BaseEntity {
30+
31+
private static final long serialVersionUID = 1L;
32+
33+
// ========= //
34+
// Variables //
35+
// ========= //
36+
37+
@Column(nullable = false, length = 64)
38+
@NotNull
39+
@Size(min = 64, max = 64)
40+
private String sourceAddressHash;
41+
42+
@NotNull
43+
private Instant expiresAt;
44+
45+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package de.muenchen.captchaservice.entity;
2+
3+
import de.muenchen.captchaservice.common.BaseEntity;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.Index;
7+
import jakarta.persistence.Table;
8+
import jakarta.validation.constraints.NotNull;
9+
import jakarta.validation.constraints.Size;
10+
import lombok.*;
11+
12+
import java.time.Instant;
13+
14+
@Entity
15+
@Table(
16+
indexes = {
17+
@Index(name = "idx_invalidated_payload_payload_hash", columnList = "payloadHash"),
18+
@Index(name = "idx_invalidated_payload_expires_at", columnList = "expiresAt")
19+
}
20+
)
21+
// Definition of getter, setter, ...
22+
@Getter
23+
@Setter
24+
@ToString(callSuper = true)
25+
@EqualsAndHashCode(callSuper = true)
26+
@NoArgsConstructor
27+
@AllArgsConstructor
28+
public class InvalidatedPayload extends BaseEntity {
29+
30+
private static final long serialVersionUID = 1L;
31+
32+
// ========= //
33+
// Variables //
34+
// ========= //
35+
36+
@Column(nullable = false, length = 64)
37+
@NotNull
38+
@Size(min = 64, max = 64)
39+
private String payloadHash;
40+
41+
@NotNull
42+
private Instant expiresAt;
43+
44+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.muenchen.captchaservice.repository;
2+
3+
import de.muenchen.captchaservice.entity.CaptchaRequest;
4+
import org.springframework.data.repository.CrudRepository;
5+
import org.springframework.data.repository.PagingAndSortingRepository;
6+
7+
import java.time.Instant;
8+
import java.util.UUID;
9+
10+
public interface CaptchaRequestRepository extends PagingAndSortingRepository<CaptchaRequest, UUID>, CrudRepository<CaptchaRequest, UUID> {
11+
long countBySourceAddressHashIgnoreCaseAndExpiresAtGreaterThanEqual(String sourceAddressHash, Instant validUntil);
12+
13+
long deleteByExpiresAtLessThan(Instant validUntil);
14+
15+
int countBySourceAddressHashIgnoreCase(String sourceAddressHash);
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.muenchen.captchaservice.repository;
2+
3+
import de.muenchen.captchaservice.entity.InvalidatedPayload;
4+
import org.springframework.data.repository.CrudRepository;
5+
import org.springframework.data.repository.PagingAndSortingRepository;
6+
7+
import java.time.Instant;
8+
import java.util.UUID;
9+
10+
public interface InvalidatedPayloadRepository extends PagingAndSortingRepository<InvalidatedPayload, UUID>, CrudRepository<InvalidatedPayload, UUID> {
11+
long countByPayloadHashIgnoreCaseAndExpiresAtGreaterThanEqual(String payloadHash, Instant validUntil);
12+
13+
long deleteByExpiresAtLessThan(Instant validUntil);
14+
15+
long countByPayloadHash(String payloadHash);
16+
}

0 commit comments

Comments
 (0)