feat(build): Refactor infrastructure modules and establish single source of truth

This commit introduces a major refactoring of the build system and the core infrastructure modules. The primary goal is to establish a strict "Single Source of Truth" for all dependencies using Gradle Version Catalogs and to create a clean, maintainable, and scalable foundation for all current and future services.

### 1. Centralized Dependency Management (`libs.versions.toml`)

- **Established Single Source of Truth:** All dependency versions are now exclusively managed in `gradle/libs.versions.toml`. Hardcoded versions have been removed from all build scripts.
- **Introduced Gradle Bundles:** To simplify module dependencies, several bundles have been created (e.g., `testing-jvm`, `redis-cache`, `spring-cloud-gateway`, `monitoring-client`). This drastically reduces boilerplate in the `build.gradle.kts` files and improves readability.
- **Cleaned up Aliases:** All library and plugin aliases have been standardized for consistency.

### 2. Infrastructure Module Refactoring

All infrastructure modules (`core`, `platform`, `auth`, `cache`, `event-store`, `messaging`, `monitoring`, `gateway`) have been refactored to align with the new dependency management strategy.

- **Simplified Build Scripts:** The `build.gradle.kts` for each module now uses the new bundles and aliases, making them significantly cleaner and easier to understand.
- **Consistent Structure:** The architecture of each module now clearly follows the Port-Adapter pattern where applicable (e.g., `cache-api`/`redis-cache`).
- **Standardized `platform-bom`:** The project's own Bill of Materials (`platform-bom`) now also includes the Spring Cloud BOM, ensuring version consistency for all Spring-related dependencies.

### 3. Added Infrastructure Documentation

To improve onboarding and architectural understanding, a dedicated `README-*.md` file has been created for each refactored infrastructure module:
- `README-CORE.md`
- `README-PLATFORM.md`
- `README-INFRA-AUTH.md`
- `README-INFRA-CACHE.md`
- `README-INFRA-EVENT-STORE.md`
- `README-INFRA-MESSAGING.md`
- `README-INFRA-MONITORING.md`
- `README-INFRA-GATEWAY.md`

These documents explain the purpose, architecture, and usage of each component within the system. This lays the groundwork for our "Tracer Bullet" development approach.
This commit is contained in:
stefan
2025-07-31 14:09:22 +02:00
parent 81cb4582d6
commit df5919fac8
27 changed files with 882 additions and 356 deletions
+56
View File
@@ -0,0 +1,56 @@
# Platform Module
## Überblick
Das **Platform-Modul** ist das Rückgrat der Build-Infrastruktur des Meldestelle-Projekts. Seine alleinige Aufgabe ist die zentrale Verwaltung und Bereitstellung von Abhängigkeiten und deren Versionen. Dies stellt sicher, dass alle Module im gesamten Projekt dieselben Bibliotheksversionen verwenden, was Inkonsistenzen ("JAR Hell") verhindert und die Wartbarkeit drastisch verbessert.
Das Modul agiert als eine interne "Single Source of Truth" für alle externen Bibliotheken.
## Architektur
Das Platform-Modul ist in drei spezialisierte Untermodule aufgeteilt, die jeweils eine klare Aufgabe haben:
platform/
├── platform-bom/ # Bill of Materials (BOM) - Erzwingt Versionen
├── platform-dependencies/ # Bündelt gemeinsame Laufzeit-Abhängigkeiten
└── platform-testing/ # Bündelt gemeinsame Test-Abhängigkeiten
### `platform-bom`
Dies ist das wichtigste Modul der Plattform. Es ist als "Bill of Materials" (BOM) konfiguriert und nutzt das `java-platform`-Plugin von Gradle.
* **Zweck:** Definiert eine umfassende Liste von Abhängigkeiten und deren exakten, geprüften Versionen. Es importiert auch andere wichtige BOMs (z.B. von Spring Boot und Kotlin).
* **Funktionsweise:** Andere Module importieren diese BOM mit `platform(projects.platform.platformBom)`. Gradle sorgt dann dafür, dass alle transitiven und deklarierten Abhängigkeiten den in der BOM festgelegten Versionen entsprechen.
* **Vorteil:** Absolute Versionskontrolle über das gesamte Projekt.
### `platform-dependencies`
Ein einfaches "Sammelmodul", das die am häufigsten benötigten Laufzeit-Abhängigkeiten bündelt.
* **Zweck:** Vereinfacht die `build.gradle.kts`-Dateien der Service-Module. Anstatt 5-6 einzelne `kotlinx`- und Logging-Bibliotheken hinzuzufügen, genügt eine einzige Abhängigkeit zu diesem Modul.
* **Verwendung:**
```kotlin
// In einem Service-Modul
dependencies {
implementation(projects.platform.platformDependencies)
}
```
### `platform-testing`
Analog zu `platform-dependencies`, aber speziell für Test-Bibliotheken.
* **Zweck:** Stellt ein konsistentes Set an Test-Frameworks (JUnit 5, MockK, AssertJ) und Werkzeugen (Testcontainers) für alle Module bereit.
* **Verwendung:**
```kotlin
// In einem Service-Modul
dependencies {
testImplementation(projects.platform.platformTesting)
}
```
* **Optimierung:** Dieses Modul nutzt die in `libs.versions.toml` definierten `[bundles]`, um die Build-Datei extrem kurz und lesbar zu halten.
---
**Letzte Aktualisierung**: 31. Juli 2025
+17 -12
View File
@@ -1,22 +1,28 @@
// Dieses Modul definiert die "Bill of Materials" (BOM) für das gesamte Projekt.
// Es nutzt das `java-platform`-Plugin, um eine zentrale Liste von Abhängigkeitsversionen
// zu erstellen, die von allen anderen Modulen importiert wird.
// Dies ist die ultimative "Single Source of Truth" für Versionen.
plugins {
`java-platform`
`maven-publish`
`maven-publish` // Nützlich, falls die BOM extern veröffentlicht werden soll
}
javaPlatform {
// Erlaubt die Deklaration von Abhängigkeiten in einer Plattform.
allowDependencies()
}
dependencies {
// KORREKTUR: Alle BOMs werden jetzt über Aliase aus der libs.versions.toml bezogen.
// Importiert andere wichtige BOMs. Die Versionen werden durch diese
// importierten Plattformen transitiv verwaltet.
api(platform(libs.spring.boot.dependencies))
api(platform(libs.spring.cloud.dependencies)) // NEU: Spring Cloud BOM hinzugefügt
api(platform(libs.kotlin.bom))
api(platform(libs.kotlinx.coroutines.bom))
// `constraints` erzwingt spezifische Versionen für einzelne Bibliotheken.
// Alle Versionen werden sicher aus `libs.versions.toml` bezogen.
constraints {
// KORREKTUR: Alle Abhängigkeiten verwenden jetzt Aliase.
// Keine einzige hartcodierte Version mehr in dieser Datei!
// --- Utilities & Other ---
api(libs.caffeine)
api(libs.reactor.kafka)
@@ -26,16 +32,16 @@ dependencies {
api(libs.consul.client)
api(libs.kotlin.logging.jvm)
api(libs.jakarta.annotation.api)
api(libs.auth0.java.jwt)
api(libs.logback.classic)
// --- Spring & SpringDoc ---
api(libs.springdoc.openapi.starter.common)
api(libs.springdoc.openapi.starter.webmvc.ui)
// --- Database & Persistence ---
api(libs.exposed.core)
api(libs.exposed.dao)
api(libs.exposed.jdbc)
api(libs.exposed.kotlin.datetime)
api(libs.bundles.exposed)
api(libs.bundles.flyway)
api(libs.postgresql.driver)
api(libs.hikari.cp)
api(libs.h2.driver)
@@ -50,12 +56,11 @@ dependencies {
api(libs.jackson.datatype.jsr310)
// --- Testcontainers ---
api(libs.testcontainers.core)
api(libs.testcontainers.junit.jupiter)
api(libs.testcontainers.postgresql)
api(libs.bundles.testcontainers)
}
}
// Konfiguration für das Veröffentlichen der BOM (optional, aber gute Praxis).
publishing {
publications {
create<MavenPublication>("maven") {
@@ -1,3 +1,5 @@
/*
// Multiplatform
plugins {
alias(libs.plugins.kotlin.multiplatform)
}
@@ -11,12 +13,6 @@ kotlin {
sourceSets {
val commonMain by getting {
dependencies {
// KORREKTUR: Die explizite `platform()`-Abhängigkeit wird hier entfernt.
// Die Versionen aus der BOM werden trotzdem angewendet.
// KORREKTUR: `stdlib` und `reflect` werden entfernt.
// `stdlib` wird automatisch hinzugefügt.
api(libs.kotlinx.coroutines.core)
api(libs.kotlinx.serialization.json)
api(libs.kotlinx.datetime)
@@ -25,11 +21,30 @@ kotlin {
val jvmMain by getting {
dependencies {
api("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
// KORREKTUR: Hartcodierte Version durch Alias ersetzen
api(libs.kotlin.logging.jvm)
api(libs.kotlinx.coroutines.reactor)
}
}
}
}
*/
// Dieses Modul ist ein reines "Sammelmodul".
// Es hat keinen eigenen Code, sondern bündelt nur gemeinsame Laufzeit-Abhängigkeiten,
// die von den meisten JVM-Modulen benötigt werden.
plugins {
alias(libs.plugins.kotlin.jvm)
}
dependencies {
// Importiert die zentrale BOM, um konsistente Versionen zu gewährleisten.
api(platform(projects.platform.platformBom))
// Stellt die wichtigsten Kotlin(x)-Bibliotheken via `api` bereit,
// damit jedes Modul, das von `platform-dependencies` abhängt, diese automatisch erhält.
api(libs.kotlinx.coroutines.core)
api(libs.kotlinx.serialization.json)
api(libs.kotlinx.datetime)
api(libs.kotlin.logging.jvm)
api(libs.kotlinx.coroutines.reactor)
}
+21 -7
View File
@@ -1,26 +1,21 @@
plugins {
// KORREKTUR: 'java-library' und 'kotlin("jvm")' ersetzen
/*plugins {
alias(libs.plugins.kotlin.multiplatform)
}
kotlin {
// KORREKTUR: JVM- und JS-Ziele definieren
jvm()
js(IR) {
browser()
}
sourceSets {
// Diese Abhängigkeiten sind für alle Plattformen (JVM, JS) verfügbar
val commonTest by getting {
dependencies {
// Die 'kotlin("test")'-Abhängigkeit ist der Standardweg für KMP-Tests
implementation(kotlin("test"))
api(libs.kotlinx.coroutines.test)
}
}
// Diese Abhängigkeiten sind NUR für die JVM-Tests verfügbar
val jvmTest by getting {
dependencies {
api(libs.junit.jupiter.api)
@@ -28,7 +23,6 @@ kotlin {
api(libs.junit.jupiter.params)
api(libs.junit.platform.launcher)
// KORREKTUR: Alle hartcodierten Versionen durch Aliase ersetzen
api(libs.mockk)
api(libs.assertj.core)
api(libs.spring.boot.starter.test)
@@ -40,4 +34,24 @@ kotlin {
}
}
}
}*/
// Dieses Modul bündelt alle für JVM-Tests notwendigen Abhängigkeiten.
// Jedes Modul, das Tests enthält, sollte dieses Modul mit `testImplementation` einbinden.
plugins {
alias(libs.plugins.kotlin.jvm)
}
dependencies {
// Importiert die zentrale BOM für konsistente Versionen.
api(platform(projects.platform.platformBom))
// OPTIMIERUNG: Verwendung von Bundles, um die Konfiguration zu vereinfachen.
// Diese Bundles sind in `libs.versions.toml` definiert.
api(libs.bundles.testing.jvm)
api(libs.bundles.testcontainers)
// Einzelne Test-Abhängigkeiten, die nicht in den Haupt-Bundles enthalten sind.
api(libs.spring.boot.starter.test)
api(libs.h2.driver) // H2 wird oft für In-Memory-Tests benötigt.
}