Skip to content

Commit 6364e9b

Browse files
committed
👀 Adding docker-compose.yml to external dependencies dev environment
👀 adding a application-local.yml to unit tests use H2 instead of Postgres SQL 🍮 logging levels fixed to flight-tracker apps
1 parent fe80fd8 commit 6364e9b

File tree

8 files changed

+288
-57
lines changed

8 files changed

+288
-57
lines changed

README.md

Lines changed: 136 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,90 @@ A Spring Boot application for tracking flight events.
2020

2121
### Prerequisites
2222

23-
- JDK 21
24-
- Maven 3.8+
23+
- Java 21
24+
- Maven 3.9.6
25+
- Docker and Docker Compose
26+
27+
### External Dependencies
28+
29+
The application requires the following external services:
30+
31+
- Redis 7.4
32+
- PostgreSQL 17
33+
- Apache Kafka 4
34+
35+
#### Using Docker Compose
36+
37+
The project includes a `docker-compose.yml` file that sets up all required services. To manage the services:
38+
39+
```bash
40+
# Start all services
41+
docker-compose up -d
42+
43+
# Stop all services
44+
docker-compose down
45+
46+
# View logs for all services
47+
docker-compose logs -f
48+
49+
# View logs for a specific service
50+
docker-compose logs -f redis
51+
docker-compose logs -f postgres
52+
docker-compose logs -f kafka
53+
54+
# Restart a specific service
55+
docker-compose restart redis
56+
docker-compose restart postgres
57+
docker-compose restart kafka
58+
59+
# Stop and remove all containers and volumes
60+
docker-compose down -v
61+
```
62+
63+
#### Service Details
64+
65+
- **Redis**
66+
- Port: 6379
67+
- No authentication required
68+
- Data persistence enabled
69+
70+
- **PostgreSQL**
71+
- Port: 5432
72+
- Database: flighttracker
73+
- Username: flighttracker
74+
- Password: flighttracker
75+
- Schema: flighttracker
76+
77+
- **Kafka**
78+
- Port: 9092
79+
- Auto topic creation enabled
80+
- Single broker configuration
81+
82+
#### Manual Service Management
83+
84+
If you prefer to manage services individually:
85+
86+
```bash
87+
# Redis
88+
docker run -d --name redis -p 6379:6379 redis:7.4
89+
90+
# PostgreSQL
91+
docker run -d --name postgres \
92+
-e POSTGRES_USER=flighttracker \
93+
-e POSTGRES_PASSWORD=flighttracker \
94+
-e POSTGRES_DB=flighttracker \
95+
-p 5432:5432 \
96+
postgres:17
97+
98+
# Kafka
99+
docker run -d --name kafka \
100+
-p 9092:9092 \
101+
-e KAFKA_BROKER_ID=1 \
102+
-e KAFKA_LISTENERS=PLAINTEXT://:9092 \
103+
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
104+
-e KAFKA_AUTO_CREATE_TOPICS_ENABLE=true \
105+
apache/kafka:4
106+
```
25107

26108
### Cloning the Repository
27109

@@ -63,41 +145,58 @@ To enable automatic badge updates and coverage reports, ensure the following Git
63145
## Project Structure
64146

65147
```
66-
src/
67-
├── main/
68-
│ ├── java/
69-
│ │ └── dev/
70-
│ │ └── luismachadoreis/
71-
│ │ └── flighttracker/
72-
│ │ └── server/
73-
│ │ ├── api/
74-
│ │ │ └── PingController.java
75-
│ │ ├── application/
76-
│ │ │ ├── dto/
77-
│ │ │ │ └── PingDTO.java
78-
│ │ │ └── PingService.java
79-
│ │ ├── domain/
80-
│ │ │ ├── event/
81-
│ │ │ │ └── PingCreated.java
82-
│ │ │ ├── Ping.java
83-
│ │ │ └── PingRepository.java
84-
│ │ ├── infrastructure/
85-
│ │ │ ├── event/
86-
│ │ │ │ ├── FlightDataSubscriber.java
87-
│ │ │ │ ├── PingEventPublisher.java
88-
│ │ │ │ └── PingEventSubscriber.java
89-
│ │ │ ├── kafka/
90-
│ │ │ └── repository/
91-
│ │ └── FlightTrackerApplication.java
92-
│ └── resources/
93-
│ └── application.yml
94-
└── test/
95-
└── java/
96-
└── dev/
97-
└── luismachadoreis/
98-
└── flighttracker/
99-
└── server/
100-
└── FlightTrackerApplicationTests.java
148+
.
149+
├── .github/
150+
│ └── workflows/
151+
│ └── maven.yml
152+
├── src/
153+
│ ├── main/
154+
│ │ ├── java/
155+
│ │ │ └── dev/
156+
│ │ │ └── luismachadoreis/
157+
│ │ │ └── flighttracker/
158+
│ │ │ └── server/
159+
│ │ │ ├── api/
160+
│ │ │ │ └── PingController.java
161+
│ │ │ ├── application/
162+
│ │ │ │ ├── dto/
163+
│ │ │ │ │ └── PingDTO.java
164+
│ │ │ │ └── PingService.java
165+
│ │ │ ├── domain/
166+
│ │ │ │ ├── event/
167+
│ │ │ │ │ └── PingCreated.java
168+
│ │ │ │ ├── Ping.java
169+
│ │ │ │ └── PingRepository.java
170+
│ │ │ ├── infrastructure/
171+
│ │ │ │ ├── event/
172+
│ │ │ │ │ ├── FlightDataSubscriber.java
173+
│ │ │ │ │ ├── PingEventPublisher.java
174+
│ │ │ │ │ └── PingEventSubscriber.java
175+
│ │ │ │ ├── kafka/
176+
│ │ │ │ │ ├── FlightDataConsumer.java
177+
│ │ │ │ │ └── KafkaConfig.java
178+
│ │ │ │ └── repository/
179+
│ │ │ │ └── JpaPingRepository.java
180+
│ │ │ └── FlightTrackerApplication.java
181+
│ │ └── resources/
182+
│ │ └── application.yml
183+
│ └── test/
184+
│ └── java/
185+
│ └── dev/
186+
│ └── luismachadoreis/
187+
│ └── flighttracker/
188+
│ └── server/
189+
│ └── FlightTrackerApplicationTests.java
190+
├── badges/
191+
│ ├── jacoco.svg
192+
│ └── branches.svg
193+
├── db/
194+
│ └── init-scripts/
195+
│ └── 01-init.sql
196+
├── docker-compose.yml
197+
├── LICENSE.md
198+
├── pom.xml
199+
└── README.md
101200
```
102201

103202
## License

db/init-scripts/01-init.sql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-- Create the database if it doesn't exist
2+
CREATE DATABASE flighttracker;
3+
4+
-- Connect to the database
5+
\c flighttracker;
6+
7+
-- Create schema if it doesn't exist
8+
CREATE SCHEMA IF NOT EXISTS flighttracker;
9+
10+
-- Set the search path
11+
SET search_path TO flighttracker;
12+
13+
-- Grant privileges
14+
GRANT ALL PRIVILEGES ON DATABASE flighttracker TO flighttracker;
15+
GRANT ALL PRIVILEGES ON SCHEMA flighttracker TO flighttracker;
16+
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA flighttracker TO flighttracker;
17+
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA flighttracker TO flighttracker;
18+
19+
-- Set default privileges for future objects
20+
ALTER DEFAULT PRIVILEGES IN SCHEMA flighttracker GRANT ALL ON TABLES TO flighttracker;
21+
ALTER DEFAULT PRIVILEGES IN SCHEMA flighttracker GRANT ALL ON SEQUENCES TO flighttracker;

docker-compose.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
version: '3.8'
2+
3+
services:
4+
redis:
5+
image: redis:latest
6+
ports:
7+
- "6379:6379"
8+
volumes:
9+
- redis_data:/data
10+
command: redis-server --appendonly yes
11+
12+
kafka:
13+
image: apache/kafka:latest
14+
ports:
15+
- "9092:9092"
16+
volumes:
17+
- kafka_data:/kafka/data
18+
19+
postgres:
20+
image: postgres:17
21+
ports:
22+
- "5432:5432"
23+
environment:
24+
POSTGRES_USER: flighttracker
25+
POSTGRES_PASSWORD: flighttracker
26+
POSTGRES_DB: flighttracker
27+
volumes:
28+
- postgres_data:/var/lib/postgresql/data
29+
- ./db/init-scripts:/docker-entrypoint-initdb.d
30+
healthcheck:
31+
test: ["CMD-SHELL", "pg_isready -U flighttracker"]
32+
interval: 5s
33+
timeout: 5s
34+
retries: 5
35+
36+
volumes:
37+
redis_data:
38+
kafka_data:
39+
postgres_data:

pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,22 @@
3737
<artifactId>spring-boot-starter-data-jpa</artifactId>
3838
</dependency>
3939

40+
<dependency>
41+
<groupId>org.springframework.boot</groupId>
42+
<artifactId>spring-boot-starter-data-redis</artifactId>
43+
</dependency>
44+
4045
<dependency>
4146
<groupId>org.springframework.kafka</groupId>
4247
<artifactId>spring-kafka</artifactId>
4348
</dependency>
4449

50+
<dependency>
51+
<groupId>org.postgresql</groupId>
52+
<artifactId>postgresql</artifactId>
53+
<scope>runtime</scope>
54+
</dependency>
55+
4556
<dependency>
4657
<groupId>org.springframework.boot</groupId>
4758
<artifactId>spring-boot-starter-test</artifactId>
@@ -112,6 +123,19 @@
112123
</compilerArgs>
113124
</configuration>
114125
</plugin>
126+
<plugin>
127+
<groupId>org.apache.maven.plugins</groupId>
128+
<artifactId>maven-surefire-plugin</artifactId>
129+
<version>3.2.5</version>
130+
<configuration>
131+
<argLine>
132+
-javaagent:"${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.build.directory}/jacoco.exec"
133+
</argLine>
134+
<systemPropertyVariables>
135+
<spring.profiles.active>test</spring.profiles.active>
136+
</systemPropertyVariables>
137+
</configuration>
138+
</plugin>
115139
</plugins>
116140
</build>
117141

src/main/java/dev/luismachadoreis/flighttracker/server/application/PingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ public PingDTO createPing(PingDTO pingDTO) {
3838
pingDTO.positionSource()
3939
);
4040

41-
pingRepository.save(ping);
4241
ping.registerPingCreated();
42+
pingRepository.save(ping);
4343

4444
return pingDTO;
4545
}

src/main/java/dev/luismachadoreis/flighttracker/server/infrastructure/event/PingEventPublisher.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@
22

33
import dev.luismachadoreis.flighttracker.server.domain.event.PingCreated;
44
import lombok.extern.slf4j.Slf4j;
5-
import org.springframework.context.event.EventListener;
65
import org.springframework.stereotype.Component;
6+
import org.springframework.transaction.event.TransactionPhase;
7+
import org.springframework.transaction.event.TransactionalEventListener;
78

89
@Slf4j
910
@Component
1011
public class PingEventPublisher {
1112

12-
@EventListener
13+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
1314
public void handlePingCreated(PingCreated event) {
1415
log.info("Ping created: icao24={}, callsign={}, at {}",
1516
event.icao24(),
1617
event.callsign(),
1718
event.timestamp());
1819
}
19-
20-
2120

2221
}

src/main/resources/application.yml

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,38 @@ spring:
33
bootstrap-servers: localhost:9092
44
consumer:
55
group-id: flight-tracker-group
6+
auto-offset-reset: earliest
7+
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
8+
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
9+
properties:
10+
spring.json.trusted.packages: "dev.luismachadoreis.flighttracker.server.application.dto"
611
topic:
712
flight-positions: flight-positions
813
ping-created: ping-created
9-
14+
1015
jpa:
1116
hibernate:
1217
ddl-auto: update
13-
show-sql: true
14-
18+
show-sql: false
19+
properties:
20+
hibernate:
21+
format_sql: true
22+
dialect: org.hibernate.dialect.PostgreSQLDialect
23+
1524
datasource:
16-
url: jdbc:h2:mem:flighttracker
17-
driver-class-name: org.h2.Driver
18-
username: sa
19-
password: password
20-
21-
h2:
22-
console:
23-
enabled: true
24-
path: /h2-console
25+
url: jdbc:postgresql://localhost:5432/flighttracker
26+
username: flighttracker
27+
password: flighttracker
28+
driver-class-name: org.postgresql.Driver
29+
30+
redis:
31+
host: localhost
32+
port: 6379
2533

26-
default:
27-
request:
28-
limit: 50
34+
logging:
35+
level:
36+
root: INFO
37+
dev.luismachadoreis.flighttracker.server: DEBUG
38+
org.springframework.kafka: INFO
39+
org.hibernate: INFO
40+
org.springframework.data: INFO

0 commit comments

Comments
 (0)