AlarmWalutowy monitoruje kursy walut i wysyła powiadomienia e‑mail, gdy zmiana przekroczy zdefiniowany próg. System składa się z dwóch mikroserwisów:
- dataprovider – API dla użytkowników (rejestracja/logowanie JWT, subskrypcje, odczyt danych, wysyłka maili).
- datagatherer – cyklicznie pobiera kursy i publikuje zdarzenia do RabbitMQ.
Role:
ROLE_USER,ROLE_ADMIN(seedowane przez Flyway).
Powiadomienia: w dev korzystamy z MailHog.
- Flyway: migracje dla
roles,user_roles+ seed ról oraz przypięcieROLE_USERdo istniejących kont. - Docker: multi‑stage Dockerfile, start jako bootowalne JAR‑y (Spring Boot 3).
- Spójna konfiguracja profilu prod (Docker Compose) i dev (lokalnie).
- Swagger w dataprovider.
- Porządki w encjach/DTO (
User,Role,RateTick,UserDTO,SubscriptionDTO,RateTickDTO), uproszczony AuthService/AuthController, logowanie wNotificationService, mapowania wMappers.
datagatherer (8081) ──publikuje──▶ RabbitMQ ◀──subskrybuje── dataprovider (8080)
│
PostgreSQL (Flyway)
│
MailHog (SMTP)
Java 21, Spring Boot 3.3 • Spring Security (JWT) • Spring Data JPA • PostgreSQL • Flyway • RabbitMQ • MailHog • Docker/Compose • Lombok • JUnit 5/Mockito
W katalogu głównym repo:
docker compose up -d --buildKontenery i porty:
| Nazwa | Port hosta | Opis |
|---|---|---|
ca_dataprovider |
8080 | API (profil prod) |
ca_datagatherer |
8081 | Zbieranie kursów (profil prod) |
ca_postgres |
5432 | Postgres + Flyway |
ca_rabbit |
5672 / 15672 | RabbitMQ (AMQP / panel) |
ca_mailhog |
1025 / 8025 | SMTP / UI |
Dostępy:
- Swagger (dataprovider): http://localhost:8080/swagger-ui/index.html
- RabbitMQ UI: http://localhost:15672 (guest/guest)
- MailHog UI: http://localhost:8025
Compose uruchamia profile
prodi spina serwisy z Postgres/RabbitMQ/MailHog. Flyway automatycznie tworzy schemat i seeduje role.
Opcjonalnie odpal MailHog:
docker run --rm -d -p 1025:1025 -p 8025:8025 mailhog/mailhogUruchom API:
mvn spring-boot:run -pl dataprovider -Dspring-boot.run.profiles=devFragment application-dev.yml (dataprovider):
spring:
mail:
host: localhost
port: 1025
properties:
mail:
smtp:
auth: false
starttls:
enable: false
app:
notifications:
enabled: true
from: no-reply@alarm-walutowy.local- Pliki:
dataprovider/src/main/resources/db/migration - Tabele:
users,subscriptions,rate_history,roles,user_roles - Seed:
ROLE_USER,ROLE_ADMIN+ przypięcieROLE_USERdo istniejącychusers
Przydatne polecenia:
# historia Flyway
docker exec -it ca_postgres psql -U postgres -d currency_alert \
-c "select version, description, success from flyway_schema_history order by installed_rank;"
# role
docker exec -it ca_postgres psql -U postgres -d currency_alert -c "select * from roles;"- UI:
/swagger-ui/index.html(tylkodataprovider) - JWT w nagłówku:
Authorization: Bearer <jwt-token>
Rejestracja – POST /api/auth/register
{ "username": "jan", "password": "tajne123", "email": "jan@example.com" }Logowanie – POST /api/auth/login
{ "username": "jan", "password": "tajne123" }Odpowiedź:
{
"token": "<jwt-token>",
"user": { "id": 1, "username": "jan", "email": "jan@example.com" }
}Subskrypcje:
GET /api/subscriptions, POST /api/subscriptions, DELETE /api/subscriptions/{id}
| Kategoria | Funkcjonalność | Estymata (h) | Status w 1.5 |
|---|---|---|---|
| M | Rejestracja i logowanie z JWT | 8 | ✅ |
| M | Subskrypcje walut z progami alertów | 12 | ✅ |
| M | Powiadomienia e-mail (MailHog w dev) | 6 | ✅ |
| M | Integracja z zewn. API kursów | 10 | ✅ |
| M | Role użytkowników + migracje (Flyway) | 8 | ✅ |
| S | Historia kursów + DTO | 8 | ✅ |
| S | Panel statusu API (/api/status) |
3 | ✅ |
| C | Dashboard web (React/Thymeleaf) | 16 | ❌ |
| W | Google OAuth | - | ❌ |
| W | Deploy na VPS z CI/CD | - | ❌ |
mvn test- Jednostkowe:
AuthService,UserService,NotificationService - Integracyjne: flow rejestracja/logowanie
mvn -B -DskipTests -pl dataprovider -am clean package
mvn -B -DskipTests -pl datagatherer -am clean packageUruchamianie:
java -jar dataprovider/target/dataprovider-*.jar --spring.profiles.active=prod
java -jar datagatherer/target/datagatherer-*.jar --spring.profiles.active=prodAktualne wydanie: 1.5
Projekt w ramach bootcampu Java CodersLab
Autor: Gabriel Stremecki