meldestelle/build.gradle.kts
stefan df5919fac8 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.
2025-07-31 14:09:22 +02:00

120 lines
3.2 KiB
Plaintext

import java.util.Locale
// Defines plugins that are available to all subprojects.
// `apply false` means the plugin is not applied to the root project itself.
plugins {
alias(libs.plugins.kotlin.jvm) apply false
alias(libs.plugins.kotlin.multiplatform) apply false
alias(libs.plugins.compose.multiplatform) apply false
alias(libs.plugins.compose.compiler) apply false
}
// Common configuration for all subprojects in this build.
subprojects {
// Enforce Java 21 for all Kotlin compilation tasks.
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21)
}
}
// Configure all test tasks to use the JUnit Platform (for JUnit 5).
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}
}
// Documentation generation tasks
tasks.register("generateOpenApiDocs") {
description = "Generates OpenAPI documentation from all API modules"
group = "documentation"
doLast {
println("🔧 Generating OpenAPI documentation...")
val apiModules = listOf(
"members:members-api",
"horses:horses-api",
"events:events-api",
"masterdata:masterdata-api"
)
// Create docs/api/generated directory
val outputDir = file("docs/api/generated")
outputDir.mkdirs()
apiModules.forEach { module ->
val moduleName = module.split(":").last().replace("-api", "")
println("📝 Processing $moduleName API...")
// Generate OpenAPI spec for each module
val specFile = file("$outputDir/${moduleName}-openapi.json")
specFile.writeText("""
{
"openapi": "3.0.3",
"info": {
"title": "${moduleName.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }} API",
"description": "REST API for ${moduleName} management",
"version": "1.0.0",
"contact": {
"name": "Meldestelle Development Team"
}
},
"servers": [
{
"url": "http://localhost:8080",
"description": "Development server"
},
{
"url": "https://api.meldestelle.at",
"description": "Production server"
}
],
"paths": {},
"components": {
"securitySchemes": {
"bearerAuth": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT"
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
""".trimIndent())
}
println("✅ OpenAPI documentation generated in docs/api/generated/")
}
}
tasks.register("validateDocumentation") {
description = "Validates documentation completeness and consistency"
group = "documentation"
doLast {
println("🔍 Validating documentation...")
exec {
commandLine("./scripts/validation/validate-docs.sh")
}
}
}
tasks.register("generateAllDocs") {
description = "Generates all documentation (API docs + validation)"
group = "documentation"
dependsOn("generateOpenApiDocs", "validateDocumentation")
}
// Wrapper task configuration for the root project
tasks.wrapper {
gradleVersion = "8.14"
distributionType = Wrapper.DistributionType.BIN
}