diff --git a/.dockerignore b/.dockerignore
index f5b89d32..f973e99e 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -94,7 +94,7 @@ temp-data/
**/temp/
**/.temp/
# Exception: Allow temp/ping-service for Docker builds
-!temp/ping-service/
+!services/ping/ping-service/
# ===================================================================
# Gradle wrapper executable (keep gradle wrapper jar)
diff --git a/client/composeApp/build.gradle.kts b/client/composeApp/build.gradle.kts
deleted file mode 100644
index c40bb561..00000000
--- a/client/composeApp/build.gradle.kts
+++ /dev/null
@@ -1,110 +0,0 @@
-import org.jetbrains.compose.desktop.application.dsl.TargetFormat
-import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
-
-plugins {
- alias(libs.plugins.kotlinMultiplatform)
- alias(libs.plugins.kotlinSerialization)
- alias(libs.plugins.composeMultiplatform)
- alias(libs.plugins.composeCompiler)
-// alias(libs.plugins.composeHotReload)
-}
-
-// Project version configuration
-version = "1.0.0"
-group = "at.mocode"
-
-
-kotlin {
-
- // Configure JVM toolchain for all JVM targets
- jvmToolchain(21)
-
- jvm()
-
- js {
- browser()
- binaries.executable()
- }
-
- @OptIn(ExperimentalWasmDsl::class)
- wasmJs {
- browser()
- binaries.executable()
- }
-
- sourceSets {
- commonMain.dependencies {
-
- implementation(projects.client.shared)
- // Core Compose Dependencies - minimiert für kleinere Bundle-Größe
- implementation(compose.runtime)
- implementation(compose.foundation)
- implementation(compose.material3)
- implementation(compose.ui)
- implementation(compose.components.resources)
- // UiToolingPreview nur für Development, nicht für Production WASM
- implementation(compose.components.uiToolingPreview)
-
- implementation(libs.androidx.lifecycle.viewmodelCompose)
- implementation(libs.androidx.lifecycle.runtimeCompose)
-
- // HTTP client dependencies for ping-service - optimiert
- implementation(libs.ktor.client.core)
- implementation(libs.ktor.client.contentNegotiation)
- implementation(libs.ktor.client.serialization.kotlinx.json)
- implementation(libs.kotlinx.coroutines.core)
- implementation(libs.kotlinx.serialization.json)
- }
- commonTest.dependencies {
- implementation(libs.kotlin.test)
- }
- jvmMain.dependencies {
- implementation(compose.desktop.currentOs)
- implementation(libs.kotlinx.coroutines.swing)
- implementation(libs.ktor.client.cio)
- }
-
- }
-}
-
-compose.desktop {
- application {
- mainClass = "at.mocode.MainKt"
-
- nativeDistributions {
- targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
- packageName = "Meldestelle"
- packageVersion = "1.0.0"
-
- // Application metadata
- description = "Pferdesport Meldestelle System - Client Application"
- copyright = "© 2025 Meldestelle Project"
- vendor = "at.mocode"
-
- // Platform-specific configurations
- linux {
- iconFile.set(project.file("src/commonMain/resources/icon.png"))
- packageName = "meldestelle"
- debMaintainer = "stefan@mocode.at"
- menuGroup = "Office"
- }
-
- windows {
- iconFile.set(project.file("src/commonMain/resources/icon.ico"))
- menuGroup = "Meldestelle"
- upgradeUuid = "61DAB35E-17CB-43B8-8A72-39876CF0E021"
- }
-
- macOS {
- iconFile.set(project.file("src/commonMain/resources/icon.icns"))
- bundleID = "at.mocode.meldestelle"
- packageBuildVersion = "1.0.0"
- packageVersion = "1.0.0"
- }
- }
-
- buildTypes.release.proguard {
- configurationFiles.from(project.file("compose-desktop.pro"))
- }
- }
-}
diff --git a/client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml b/client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml
deleted file mode 100644
index 52e9b0ad..00000000
--- a/client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/composeApp/src/commonMain/kotlin/at/mocode/App.kt b/client/composeApp/src/commonMain/kotlin/at/mocode/App.kt
deleted file mode 100644
index 290dc887..00000000
--- a/client/composeApp/src/commonMain/kotlin/at/mocode/App.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package at.mocode
-
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.*
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.*
-import androidx.compose.runtime.*
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.unit.dp
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.lifecycle.viewmodel.compose.viewModel
-import at.mocode.ui.PingViewModel
-import org.jetbrains.compose.ui.tooling.preview.Preview
-
-@Composable
-@Preview
-fun App() {
- MaterialTheme {
- val viewModel: PingViewModel = viewModel()
- val uiState by viewModel.uiState.collectAsStateWithLifecycle()
-
- Column(
- modifier = Modifier
- .background(MaterialTheme.colorScheme.background)
- .fillMaxSize()
- .padding(16.dp)
- .verticalScroll(rememberScrollState()),
- horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = Arrangement.spacedBy(16.dp)
- ) {
-
- // Header
- Card(
- modifier = Modifier.fillMaxWidth()
- ) {
- Column(
- modifier = Modifier.padding(16.dp),
- horizontalAlignment = Alignment.CenterHorizontally
- ) {
- Text(
- text = "Meldestelle - Ping Service Client",
- style = MaterialTheme.typography.headlineMedium
- )
- Text(
- text = "Trace-Bullet Implementation",
- style = MaterialTheme.typography.bodyMedium,
- color = MaterialTheme.colorScheme.secondary
- )
- }
- }
-
- // Action Buttons
- Card(
- modifier = Modifier.fillMaxWidth()
- ) {
- Column(
- modifier = Modifier.padding(16.dp),
- verticalArrangement = Arrangement.spacedBy(8.dp)
- ) {
- Text(
- text = "API Tests",
- style = MaterialTheme.typography.titleMedium
- )
-
- Row(
- modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.spacedBy(8.dp)
- ) {
- Button(
- onClick = { viewModel.simplePing() },
- enabled = !uiState.isLoading,
- modifier = Modifier.weight(1f)
- ) {
- Text("Simple Ping")
- }
-
- Button(
- onClick = { viewModel.enhancedPing() },
- enabled = !uiState.isLoading,
- modifier = Modifier.weight(1f)
- ) {
- Text("Enhanced Ping")
- }
- }
-
- Row(
- modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.spacedBy(8.dp)
- ) {
- Button(
- onClick = { viewModel.healthCheck() },
- enabled = !uiState.isLoading,
- modifier = Modifier.weight(1f)
- ) {
- Text("Health Check")
- }
-
- Button(
- onClick = { viewModel.enhancedPing(simulate = true) },
- enabled = !uiState.isLoading,
- modifier = Modifier.weight(1f),
- colors = ButtonDefaults.buttonColors(
- containerColor = MaterialTheme.colorScheme.error
- )
- ) {
- Text("Test Failure")
- }
- }
- }
- }
-
- // Loading Indicator
- if (uiState.isLoading) {
- CircularProgressIndicator()
- }
-
- // Error Display
- uiState.error?.let { error ->
- Card(
- modifier = Modifier.fillMaxWidth(),
- colors = CardDefaults.cardColors(
- containerColor = MaterialTheme.colorScheme.errorContainer
- )
- ) {
- Text(
- text = error,
- modifier = Modifier.padding(16.dp),
- color = MaterialTheme.colorScheme.onErrorContainer
- )
- }
- }
-
- // Results Display
- uiState.lastPingResponse?.let { response ->
- ResultCard("Simple Ping Result", response)
- }
-
- uiState.lastEnhancedResponse?.let { response ->
- ResultCard("Enhanced Ping Result", response)
- }
-
- uiState.lastHealthResponse?.let { response ->
- ResultCard("Health Check Result", response)
- }
- }
- }
-}
-
-@Composable
-private fun ResultCard(title: String, data: Any) {
- Card(
- modifier = Modifier.fillMaxWidth()
- ) {
- Column(
- modifier = Modifier.padding(16.dp)
- ) {
- Text(
- text = title,
- style = MaterialTheme.typography.titleMedium,
- color = MaterialTheme.colorScheme.primary
- )
- Spacer(modifier = Modifier.height(8.dp))
- Text(
- text = data.toString(),
- style = MaterialTheme.typography.bodySmall,
- modifier = Modifier.fillMaxWidth()
- )
- }
- }
-}
diff --git a/client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt b/client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt
deleted file mode 100644
index 7c4f74cf..00000000
--- a/client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt
+++ /dev/null
@@ -1,88 +0,0 @@
-package at.mocode.ui
-
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import at.mocode.model.EnhancedPingResponse
-import at.mocode.model.HealthResponse
-import at.mocode.model.PingResponse
-import at.mocode.service.PingService
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.launch
-
-data class PingUiState(
- val isLoading: Boolean = false,
- val lastPingResponse: PingResponse? = null,
- val lastEnhancedResponse: EnhancedPingResponse? = null,
- val lastHealthResponse: HealthResponse? = null,
- val error: String? = null
-)
-
-class PingViewModel : ViewModel() {
-
- private val pingService = PingService()
-
- private val _uiState = MutableStateFlow(PingUiState())
- val uiState: StateFlow = _uiState.asStateFlow()
-
- fun simplePing() {
- viewModelScope.launch {
- _uiState.value = _uiState.value.copy(isLoading = true, error = null)
-
- pingService.ping()
- .onSuccess { response ->
- _uiState.value = _uiState.value.copy(
- isLoading = false,
- lastPingResponse = response
- )
- }
- .onFailure { exception ->
- _uiState.value = _uiState.value.copy(
- isLoading = false,
- error = "Ping failed: ${exception.message}"
- )
- }
- }
- }
-
- fun enhancedPing(simulate: Boolean = false) {
- viewModelScope.launch {
- _uiState.value = _uiState.value.copy(isLoading = true, error = null)
-
- pingService.enhancedPing(simulate)
- .onSuccess { response ->
- _uiState.value = _uiState.value.copy(
- isLoading = false,
- lastEnhancedResponse = response
- )
- }
- .onFailure { exception ->
- _uiState.value = _uiState.value.copy(
- isLoading = false,
- error = "Enhanced ping failed: ${exception.message}"
- )
- }
- }
- }
-
- fun healthCheck() {
- viewModelScope.launch {
- _uiState.value = _uiState.value.copy(isLoading = true, error = null)
-
- pingService.health()
- .onSuccess { response ->
- _uiState.value = _uiState.value.copy(
- isLoading = false,
- lastHealthResponse = response
- )
- }
- .onFailure { exception ->
- _uiState.value = _uiState.value.copy(
- isLoading = false,
- error = "Health check failed: ${exception.message}"
- )
- }
- }
- }
-}
diff --git a/client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt b/client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt
deleted file mode 100644
index b8a3d13d..00000000
--- a/client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package at.mocode
-
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ComposeAppCommonTest {
-
- @Test
- fun example() {
- assertEquals(3, 1 + 2)
- }
-}
\ No newline at end of file
diff --git a/client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt b/client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt
deleted file mode 100644
index 1b5f4787..00000000
--- a/client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package at.mocode
-
-import androidx.compose.desktop.ui.tooling.preview.Preview
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.window.Window
-import androidx.compose.ui.window.application
-
-fun main() = application {
- Window(
- onCloseRequest = ::exitApplication,
- title = "Meldestelle",
- ) {
- App()
- }
-}
-
-@Preview
-@Composable
-fun AppDesktopPreview() {
- App()
-}
diff --git a/client/composeApp/src/webMain/kotlin/at/mocode/main.kt b/client/composeApp/src/webMain/kotlin/at/mocode/main.kt
deleted file mode 100644
index 585f9cdd..00000000
--- a/client/composeApp/src/webMain/kotlin/at/mocode/main.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package at.mocode
-
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.window.ComposeViewport
-
-@OptIn(ExperimentalComposeUiApi::class)
-fun main() {
- ComposeViewport {
- App()
- }
-}
diff --git a/client/composeApp/src/webMain/resources/index.html b/client/composeApp/src/webMain/resources/index.html
deleted file mode 100644
index 252c76ef..00000000
--- a/client/composeApp/src/webMain/resources/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
- Meldestelle
-
-
-
-
-
-
diff --git a/client/composeApp/src/webMain/resources/styles.css b/client/composeApp/src/webMain/resources/styles.css
deleted file mode 100644
index 0549b10f..00000000
--- a/client/composeApp/src/webMain/resources/styles.css
+++ /dev/null
@@ -1,7 +0,0 @@
-html, body {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- overflow: hidden;
-}
\ No newline at end of file
diff --git a/client/composeApp/webpack.config.d/watch.js b/client/composeApp/webpack.config.d/watch.js
deleted file mode 100644
index 04713d26..00000000
--- a/client/composeApp/webpack.config.d/watch.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Temporary workaround for [KT-80582](https://youtrack.jetbrains.com/issue/KT-80582)
- *
- * This file should be safe to be removed once the ticket is closed and the project is updated to Kotlin version which solves that issue.
- */
-config.watchOptions = config.watchOptions || {
- ignored: ["**/*.kt", "**/node_modules"]
-}
-
-if (config.devServer) {
- config.devServer.static = config.devServer.static.map(file => {
- if (typeof file === "string") {
- return {
- directory: file,
- watch: false,
- }
- } else {
- return file
- }
- })
-}
\ No newline at end of file
diff --git a/client/shared/build.gradle.kts b/client/shared/build.gradle.kts
deleted file mode 100644
index 6fde779d..00000000
--- a/client/shared/build.gradle.kts
+++ /dev/null
@@ -1,47 +0,0 @@
-import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
-
-plugins {
- alias(libs.plugins.kotlinMultiplatform)
- alias(libs.plugins.kotlinSerialization)
-}
-
-kotlin {
-
- // Configure JVM toolchain for all JVM targets
- jvmToolchain(21)
-
- jvm()
-
- js {
- browser()
- }
-
- @OptIn(ExperimentalWasmDsl::class)
- wasmJs {
- browser()
- }
-
- sourceSets {
- commonMain.dependencies {
- // HTTP Client dependencies for ping-service
- implementation(libs.ktor.client.core)
- implementation(libs.ktor.client.contentNegotiation)
- implementation(libs.ktor.client.serialization.kotlinx.json)
- implementation(libs.kotlinx.serialization.json)
- implementation(libs.kotlinx.coroutines.core)
- }
-
- jvmMain.dependencies {
- implementation(libs.ktor.client.cio)
- }
-
- jsMain.dependencies {
- implementation(libs.ktor.client.js)
- }
-
- commonTest.dependencies {
- implementation(libs.kotlin.test)
- }
- }
-}
-
diff --git a/client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt b/client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt
deleted file mode 100644
index 73160b1b..00000000
--- a/client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-package at.mocode.service
-
-import at.mocode.model.EnhancedPingResponse
-import at.mocode.model.HealthResponse
-import at.mocode.model.PingResponse
-import io.ktor.client.*
-import io.ktor.client.call.*
-import io.ktor.client.plugins.*
-import io.ktor.client.plugins.contentnegotiation.*
-import io.ktor.client.request.*
-import io.ktor.serialization.kotlinx.json.*
-import kotlinx.serialization.json.Json
-
-class PingService {
-
- private val client = HttpClient {
- install(ContentNegotiation) {
- json(Json {
- ignoreUnknownKeys = true
- isLenient = true
- })
- }
- install(HttpTimeout) {
- requestTimeoutMillis = 10000
- connectTimeoutMillis = 5000
- }
- }
-
- private val baseUrl = getBaseUrl()
-
- suspend fun ping(): Result = runCatching {
- client.get("$baseUrl/ping").body()
- }
-
- suspend fun enhancedPing(simulate: Boolean = false): Result = runCatching {
- // Fallback: Use simple ping and enhance response locally
- val response = client.get("$baseUrl/ping").body()
- EnhancedPingResponse(
- status = response.status,
- timestamp = response.timestamp,
- service = response.service,
- circuitBreakerState = if (simulate) "OPEN" else "CLOSED",
- responseTime = 100L
- )
- }
-
- suspend fun health(): Result = runCatching {
- // Fallback: Use simple ping to determine health
- val response = client.get("$baseUrl/ping").body()
- HealthResponse(
- status = response.status,
- timestamp = response.timestamp,
- service = response.service,
- healthy = response.status == "pong"
- )
- }
-
- suspend fun testFailure(): Result = runCatching {
- // Simulate failure for testing
- throw RuntimeException("Simulated failure for testing")
- }
-}
-
-// Platform-specific base URL
-expect fun getBaseUrl(): String
diff --git a/clients/ping-client/build.gradle.kts b/clients/ping-client/build.gradle.kts
new file mode 100644
index 00000000..3dac1127
--- /dev/null
+++ b/clients/ping-client/build.gradle.kts
@@ -0,0 +1,46 @@
+plugins {
+ alias(libs.plugins.kotlinMultiplatform)
+ alias(libs.plugins.kotlinSerialization)
+}
+
+group = "at.mocode"
+version = "1.0.0"
+
+kotlin {
+ jvm()
+ js {
+ browser()
+ }
+ // Keep WASM for dev since sources already present
+ @OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class)
+ wasmJs {
+ browser()
+ }
+
+ jvmToolchain(21)
+
+ sourceSets {
+ val commonMain by getting {
+ dependencies {
+ implementation(projects.services.ping.pingApi)
+
+ implementation(libs.ktor.client.core)
+ implementation(libs.ktor.client.contentNegotiation)
+ implementation(libs.ktor.client.serialization.kotlinx.json)
+
+ implementation(libs.kotlinx.coroutines.core)
+ implementation(libs.kotlinx.serialization.json)
+ }
+ }
+ val commonTest by getting {
+ dependencies {
+ implementation(libs.kotlin.test)
+ }
+ }
+ val jvmMain by getting {
+ dependencies {
+ implementation(libs.ktor.client.cio)
+ }
+ }
+ }
+}
diff --git a/client/shared/src/commonMain/kotlin/at/mocode/Constants.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/Constants.kt
similarity index 100%
rename from client/shared/src/commonMain/kotlin/at/mocode/Constants.kt
rename to clients/ping-client/src/commonMain/kotlin/at/mocode/Constants.kt
diff --git a/client/shared/src/commonMain/kotlin/at/mocode/Greeting.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/Greeting.kt
similarity index 100%
rename from client/shared/src/commonMain/kotlin/at/mocode/Greeting.kt
rename to clients/ping-client/src/commonMain/kotlin/at/mocode/Greeting.kt
diff --git a/client/shared/src/commonMain/kotlin/at/mocode/Platform.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/Platform.kt
similarity index 100%
rename from client/shared/src/commonMain/kotlin/at/mocode/Platform.kt
rename to clients/ping-client/src/commonMain/kotlin/at/mocode/Platform.kt
diff --git a/clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt
new file mode 100644
index 00000000..23baf8b3
--- /dev/null
+++ b/clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt
@@ -0,0 +1,10 @@
+package at.mocode.model
+
+// Deprecated local DTOs are replaced by typealiases to the shared API contract.
+// This preserves binary/source compatibility for existing imports while enforcing SSoT.
+
+typealias PingResponse = at.mocode.ping.api.PingResponse
+
+typealias EnhancedPingResponse = at.mocode.ping.api.EnhancedPingResponse
+
+typealias HealthResponse = at.mocode.ping.api.HealthResponse
diff --git a/clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt
new file mode 100644
index 00000000..d00c4a08
--- /dev/null
+++ b/clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt
@@ -0,0 +1,25 @@
+package at.mocode.ping.client
+
+import at.mocode.ping.api.EnhancedPingResponse
+import at.mocode.ping.api.HealthResponse
+import at.mocode.ping.api.PingApi
+import at.mocode.ping.api.PingResponse
+import io.ktor.client.HttpClient
+import io.ktor.client.call.body
+import io.ktor.client.request.get
+import io.ktor.client.request.parameter
+import at.mocode.service.getBaseUrl
+
+class PingApiClient(
+ private val client: HttpClient,
+ baseUrl: String = getBaseUrl()
+) : PingApi {
+ private val base = "$baseUrl/api/ping"
+
+ override suspend fun simplePing(): PingResponse = client.get("$base/simple").body()
+
+ override suspend fun enhancedPing(simulate: Boolean): EnhancedPingResponse =
+ client.get("$base/enhanced") { parameter("simulate", simulate) }.body()
+
+ override suspend fun healthCheck(): HealthResponse = client.get("$base/health").body()
+}
diff --git a/clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt
new file mode 100644
index 00000000..a7933e91
--- /dev/null
+++ b/clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt
@@ -0,0 +1,43 @@
+package at.mocode.service
+
+import at.mocode.model.EnhancedPingResponse
+import at.mocode.model.HealthResponse
+import at.mocode.model.PingResponse
+import at.mocode.ping.client.PingApiClient
+import io.ktor.client.*
+import io.ktor.client.plugins.*
+import io.ktor.client.plugins.contentnegotiation.*
+import io.ktor.serialization.kotlinx.json.*
+import kotlinx.serialization.json.Json
+
+@Deprecated("Use PingApiClient directly for new code")
+class PingService(
+ private val client: HttpClient = HttpClient {
+ install(ContentNegotiation) {
+ json(Json {
+ ignoreUnknownKeys = true
+ isLenient = true
+ })
+ }
+ install(HttpTimeout) {
+ requestTimeoutMillis = 10000
+ connectTimeoutMillis = 5000
+ }
+ }
+) {
+ private val api = PingApiClient(client)
+
+ suspend fun ping(): Result = runCatching { api.simplePing() }
+
+ suspend fun enhancedPing(simulate: Boolean = false): Result =
+ runCatching { api.enhancedPing(simulate) }
+
+ suspend fun health(): Result = runCatching { api.healthCheck() }
+
+ suspend fun testFailure(): Result = runCatching {
+ throw RuntimeException("Simulated failure for testing")
+ }
+}
+
+// Platform-specific base URL required by PingApiClient via getBaseUrl()
+expect fun getBaseUrl(): String
diff --git a/client/shared/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt b/clients/ping-client/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt
similarity index 100%
rename from client/shared/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt
rename to clients/ping-client/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt
diff --git a/client/shared/src/jsMain/kotlin/at/mocode/Platform.js.kt b/clients/ping-client/src/jsMain/kotlin/at/mocode/Platform.js.kt
similarity index 100%
rename from client/shared/src/jsMain/kotlin/at/mocode/Platform.js.kt
rename to clients/ping-client/src/jsMain/kotlin/at/mocode/Platform.js.kt
diff --git a/client/shared/src/jsMain/kotlin/at/mocode/service/Platform.js.kt b/clients/ping-client/src/jsMain/kotlin/at/mocode/service/Platform.js.kt
similarity index 100%
rename from client/shared/src/jsMain/kotlin/at/mocode/service/Platform.js.kt
rename to clients/ping-client/src/jsMain/kotlin/at/mocode/service/Platform.js.kt
diff --git a/client/shared/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt b/clients/ping-client/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt
similarity index 100%
rename from client/shared/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt
rename to clients/ping-client/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt
diff --git a/client/shared/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt b/clients/ping-client/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt
similarity index 100%
rename from client/shared/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt
rename to clients/ping-client/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt
diff --git a/client/shared/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt b/clients/ping-client/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt
similarity index 100%
rename from client/shared/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt
rename to clients/ping-client/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt
diff --git a/client/shared/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt b/clients/ping-client/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt
similarity index 100%
rename from client/shared/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt
rename to clients/ping-client/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt
diff --git a/docker-compose.services.yml b/docker-compose.services.yml
index 7ceb908d..780af356 100644
--- a/docker-compose.services.yml
+++ b/docker-compose.services.yml
@@ -24,11 +24,12 @@ services:
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DOCKER:-docker}
container_name: meldestelle-ping-service
environment:
- SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
+ SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-docker}
SERVER_PORT: ${PING_SERVICE_PORT:-8082}
CONSUL_HOST: consul
CONSUL_PORT: ${CONSUL_PORT:-8500}
- CONSUL_ENABLED: true
+ CONSUL_ENABLED: ${CONSUL_ENABLED:-true}
+ SPRING_CLOUD_CONSUL_DISCOVERY_ENABLED: ${CONSUL_ENABLED:-true}
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: ${POSTGRES_DB:-meldestelle}
@@ -41,8 +42,15 @@ services:
- "${PING_SERVICE_PORT:-8082}:8082"
networks:
- meldestelle-network
+ depends_on:
+ postgres:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
+ consul:
+ condition: service_healthy
healthcheck:
- test: [ "CMD", "curl", "--fail", "http://localhost:${PING_SERVICE_PORT:-8082}/actuator/health" ]
+ test: [ "CMD", "curl", "--fail", "http://localhost:8082/actuator/health/readiness" ]
interval: 15s
timeout: 5s
retries: 3
diff --git a/dockerfiles/services/ping-service/Dockerfile b/dockerfiles/services/ping-service/Dockerfile
index 7811eab3..179ad5c2 100644
--- a/dockerfiles/services/ping-service/Dockerfile
+++ b/dockerfiles/services/ping-service/Dockerfile
@@ -50,7 +50,7 @@ COPY gradle/ gradle/
COPY platform/ platform/
# Copy client directories (required by settings.gradle.kts)
-COPY client/ client/
+COPY clients/ clients/
# Copy core directories (required by settings.gradle.kts)
COPY core/ core/
@@ -64,19 +64,19 @@ COPY docs/ docs/
# Copy root build configuration
COPY build.gradle.kts ./
-# Copy ping-service specific files last (changes most frequently)
-COPY temp/ping-service/build.gradle.kts temp/ping-service/
-COPY temp/ping-service/src/ temp/ping-service/src/
+# Copy ping modules (changes most frequently)
+COPY services/ping/ping-api/ services/ping/ping-api/
+COPY services/ping/ping-service/ services/ping/ping-service/
# Download and cache dependencies in a separate layer with build cache
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
- ./gradlew :temp:ping-service:dependencies --no-daemon --info
+ ./gradlew :services:ping:ping-service:dependencies --no-daemon --info
# Build the application with optimizations and build cache
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
- ./gradlew :temp:ping-service:bootJar --no-daemon --info \
+ ./gradlew :services:ping:ping-service:bootJar --no-daemon --info \
-Pspring.profiles.active=${SPRING_PROFILES_ACTIVE}
# ===================================================================
@@ -133,7 +133,7 @@ RUN apk update && \
# Copy the built JAR from builder stage with proper ownership
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} \
- /workspace/temp/ping-service/build/libs/*.jar app.jar
+ /workspace/services/ping/ping-service/build/libs/*.jar app.jar
# Switch to non-root user
USER ${APP_USER}
diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock
index 0e514b14..670ce136 100644
--- a/kotlin-js-store/yarn.lock
+++ b/kotlin-js-store/yarn.lock
@@ -63,55 +63,6 @@
resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273"
integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg==
-"@jsonjoy.com/base64@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578"
- integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==
-
-"@jsonjoy.com/buffers@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz#ade6895b7d3883d70f87b5743efaa12c71dfef7a"
- integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==
-
-"@jsonjoy.com/codegen@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207"
- integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==
-
-"@jsonjoy.com/json-pack@^1.11.0":
- version "1.14.0"
- resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz#eda5255ccdaeafb3aa811ff1ae4814790b958b4f"
- integrity sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==
- dependencies:
- "@jsonjoy.com/base64" "^1.1.2"
- "@jsonjoy.com/buffers" "^1.0.0"
- "@jsonjoy.com/codegen" "^1.0.0"
- "@jsonjoy.com/json-pointer" "^1.0.1"
- "@jsonjoy.com/util" "^1.9.0"
- hyperdyperid "^1.2.0"
- thingies "^2.5.0"
-
-"@jsonjoy.com/json-pointer@^1.0.1":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408"
- integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==
- dependencies:
- "@jsonjoy.com/codegen" "^1.0.0"
- "@jsonjoy.com/util" "^1.9.0"
-
-"@jsonjoy.com/util@^1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46"
- integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==
- dependencies:
- "@jsonjoy.com/buffers" "^1.0.0"
- "@jsonjoy.com/codegen" "^1.0.0"
-
-"@leichtgewicht/ip-codec@^2.0.1":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1"
- integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==
-
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
@@ -122,36 +73,6 @@
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"
integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==
-"@types/body-parser@*":
- version "1.19.6"
- resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474"
- integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==
- dependencies:
- "@types/connect" "*"
- "@types/node" "*"
-
-"@types/bonjour@^3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956"
- integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==
- dependencies:
- "@types/node" "*"
-
-"@types/connect-history-api-fallback@^1.5.4":
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3"
- integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==
- dependencies:
- "@types/express-serve-static-core" "*"
- "@types/node" "*"
-
-"@types/connect@*":
- version "3.4.38"
- resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858"
- integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
- dependencies:
- "@types/node" "*"
-
"@types/cors@^2.8.12":
version "2.8.19"
resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342"
@@ -180,74 +101,11 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
-"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0":
- version "5.0.7"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6"
- integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==
- dependencies:
- "@types/node" "*"
- "@types/qs" "*"
- "@types/range-parser" "*"
- "@types/send" "*"
-
-"@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33":
- version "4.19.6"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267"
- integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==
- dependencies:
- "@types/node" "*"
- "@types/qs" "*"
- "@types/range-parser" "*"
- "@types/send" "*"
-
-"@types/express@*":
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956"
- integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==
- dependencies:
- "@types/body-parser" "*"
- "@types/express-serve-static-core" "^5.0.0"
- "@types/serve-static" "*"
-
-"@types/express@^4.17.21":
- version "4.17.23"
- resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef"
- integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==
- dependencies:
- "@types/body-parser" "*"
- "@types/express-serve-static-core" "^4.17.33"
- "@types/qs" "*"
- "@types/serve-static" "*"
-
-"@types/http-errors@*":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472"
- integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==
-
-"@types/http-proxy@^1.17.8":
- version "1.17.16"
- resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240"
- integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==
- dependencies:
- "@types/node" "*"
-
"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
-"@types/mime@^1":
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690"
- integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
-
-"@types/node-forge@^1.3.0":
- version "1.3.14"
- resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b"
- integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==
- dependencies:
- "@types/node" "*"
-
"@types/node@*", "@types/node@>=10.0.0":
version "24.3.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.1.tgz#b0a3fb2afed0ef98e8d7f06d46ef6349047709f3"
@@ -255,59 +113,6 @@
dependencies:
undici-types "~7.10.0"
-"@types/qs@*":
- version "6.14.0"
- resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5"
- integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==
-
-"@types/range-parser@*":
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb"
- integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
-
-"@types/retry@0.12.2":
- version "0.12.2"
- resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a"
- integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==
-
-"@types/send@*":
- version "0.17.5"
- resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.5.tgz#d991d4f2b16f2b1ef497131f00a9114290791e74"
- integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==
- dependencies:
- "@types/mime" "^1"
- "@types/node" "*"
-
-"@types/serve-index@^1.9.4":
- version "1.9.4"
- resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898"
- integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==
- dependencies:
- "@types/express" "*"
-
-"@types/serve-static@*", "@types/serve-static@^1.15.5":
- version "1.15.8"
- resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.8.tgz#8180c3fbe4a70e8f00b9f70b9ba7f08f35987877"
- integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==
- dependencies:
- "@types/http-errors" "*"
- "@types/node" "*"
- "@types/send" "*"
-
-"@types/sockjs@^0.3.36":
- version "0.3.36"
- resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535"
- integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==
- dependencies:
- "@types/node" "*"
-
-"@types/ws@^8.5.10":
- version "8.18.1"
- resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9"
- integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==
- dependencies:
- "@types/node" "*"
-
"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6"
@@ -454,7 +259,7 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-accepts@~1.3.4, accepts@~1.3.8:
+accepts@~1.3.4:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
@@ -496,11 +301,6 @@ ajv@^8.0.0, ajv@^8.9.0:
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
-ansi-html-community@^0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
- integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
-
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
@@ -536,11 +336,6 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-array-flatten@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
- integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
-
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -551,17 +346,12 @@ base64id@2.0.0, base64id@~2.0.0:
resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
-batch@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
- integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==
-
binary-extensions@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
-body-parser@1.20.3, body-parser@^1.19.0:
+body-parser@^1.19.0:
version "1.20.3"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
@@ -579,14 +369,6 @@ body-parser@1.20.3, body-parser@^1.19.0:
type-is "~1.6.18"
unpipe "1.0.0"
-bonjour-service@^1.2.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722"
- integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==
- dependencies:
- fast-deep-equal "^3.1.3"
- multicast-dns "^7.2.5"
-
brace-expansion@^1.1.7:
version "1.1.12"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
@@ -602,7 +384,7 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
-braces@^3.0.2, braces@^3.0.3, braces@~3.0.2:
+braces@^3.0.2, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -629,13 +411,6 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-bundle-name@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889"
- integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==
- dependencies:
- run-applescript "^7.0.0"
-
bytes@3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
@@ -675,7 +450,7 @@ chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chokidar@^3.5.1, chokidar@^3.6.0:
+chokidar@^3.5.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -741,7 +516,7 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-colorette@^2.0.10, colorette@^2.0.14:
+colorette@^2.0.14:
version "2.0.20"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
@@ -756,36 +531,11 @@ commander@^2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-compressible@~2.0.18:
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
- integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
- dependencies:
- mime-db ">= 1.43.0 < 2"
-
-compression@^1.7.4:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79"
- integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==
- dependencies:
- bytes "3.1.2"
- compressible "~2.0.18"
- debug "2.6.9"
- negotiator "~0.6.4"
- on-headers "~1.1.0"
- safe-buffer "5.2.1"
- vary "~1.1.2"
-
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
-connect-history-api-fallback@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
- integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
-
connect@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
@@ -796,38 +546,16 @@ connect@^3.7.0:
parseurl "~1.3.3"
utils-merge "1.0.1"
-content-disposition@0.5.4:
- version "0.5.4"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
- integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
- dependencies:
- safe-buffer "5.2.1"
-
-content-type@~1.0.4, content-type@~1.0.5:
+content-type@~1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
-cookie-signature@1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
- integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
-
-cookie@0.7.1:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
- integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
-
cookie@~0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
-core-util-is@~1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
- integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
-
cors@~2.8.5:
version "2.8.5"
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
@@ -862,13 +590,6 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
-debug@^4.1.0:
- version "4.4.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
- integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
- dependencies:
- ms "^2.1.3"
-
debug@^4.3.4, debug@^4.3.5:
version "4.4.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
@@ -888,44 +609,16 @@ decamelize@^4.0.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
-default-browser-id@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26"
- integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==
-
-default-browser@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf"
- integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==
- dependencies:
- bundle-name "^4.1.0"
- default-browser-id "^5.0.0"
-
-define-lazy-prop@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
- integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
-
depd@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-depd@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
- integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
-
destroy@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
-detect-node@^2.0.4:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
- integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
-
di@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
@@ -936,13 +629,6 @@ diff@^7.0.0:
resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
-dns-packet@^5.2.2:
- version "5.6.1"
- resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f"
- integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==
- dependencies:
- "@leichtgewicht/ip-codec" "^2.0.1"
-
dom-serialize@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
@@ -992,11 +678,6 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
-encodeurl@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
- integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
-
engine.io-parser@~5.2.1:
version "5.2.3"
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f"
@@ -1102,11 +783,6 @@ estraverse@^5.2.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
-etag@~1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
- integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
-
eventemitter3@^4.0.0:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@@ -1117,43 +793,6 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-express@^4.21.2:
- version "4.21.2"
- resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
- integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
- dependencies:
- accepts "~1.3.8"
- array-flatten "1.1.1"
- body-parser "1.20.3"
- content-disposition "0.5.4"
- content-type "~1.0.4"
- cookie "0.7.1"
- cookie-signature "1.0.6"
- debug "2.6.9"
- depd "2.0.0"
- encodeurl "~2.0.0"
- escape-html "~1.0.3"
- etag "~1.8.1"
- finalhandler "1.3.1"
- fresh "0.5.2"
- http-errors "2.0.0"
- merge-descriptors "1.0.3"
- methods "~1.1.2"
- on-finished "2.4.1"
- parseurl "~1.3.3"
- path-to-regexp "0.1.12"
- proxy-addr "~2.0.7"
- qs "6.13.0"
- range-parser "~1.2.1"
- safe-buffer "5.2.1"
- send "0.19.0"
- serve-static "1.16.2"
- setprototypeof "1.2.0"
- statuses "2.0.1"
- type-is "~1.6.18"
- utils-merge "1.0.1"
- vary "~1.1.2"
-
extend@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@@ -1174,13 +813,6 @@ fastest-levenshtein@^1.0.12:
resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
-faye-websocket@^0.11.3:
- version "0.11.4"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
- integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
- dependencies:
- websocket-driver ">=0.5.1"
-
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
@@ -1201,19 +833,6 @@ finalhandler@1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
-finalhandler@1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
- integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
- dependencies:
- debug "2.6.9"
- encodeurl "~2.0.0"
- escape-html "~1.0.3"
- on-finished "2.4.1"
- parseurl "~1.3.3"
- statuses "2.0.1"
- unpipe "~1.0.0"
-
find-up@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
@@ -1258,16 +877,6 @@ format-util@^1.0.5:
resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271"
integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==
-forwarded@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
- integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
-
-fresh@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
- integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
-
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -1328,11 +937,6 @@ glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
-glob-to-regex.js@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz#f71cc9cb8441471a9318626160bc8a35e1306b21"
- integrity sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==
-
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -1372,11 +976,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10,
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-handle-thing@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
- integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
-
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
@@ -1406,21 +1005,6 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-hpack.js@^2.1.6:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
- integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==
- dependencies:
- inherits "^2.0.1"
- obuf "^1.0.0"
- readable-stream "^2.0.1"
- wbuf "^1.1.0"
-
-http-deceiver@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
- integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
-
http-errors@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
@@ -1432,32 +1016,6 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
-http-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
- integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
-
-http-parser-js@>=0.5.1:
- version "0.5.10"
- resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075"
- integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
-
-http-proxy-middleware@^2.0.9:
- version "2.0.9"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef"
- integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==
- dependencies:
- "@types/http-proxy" "^1.17.8"
- http-proxy "^1.18.1"
- is-glob "^4.0.1"
- is-plain-obj "^3.0.0"
- micromatch "^4.0.2"
-
http-proxy@^1.18.1:
version "1.18.1"
resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
@@ -1467,11 +1025,6 @@ http-proxy@^1.18.1:
follow-redirects "^1.0.0"
requires-port "^1.0.0"
-hyperdyperid@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b"
- integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==
-
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -1502,31 +1055,16 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
+inherits@2, inherits@2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-inherits@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
- integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
-
interpret@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4"
integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
-ipaddr.js@1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
- integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
-
-ipaddr.js@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8"
- integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
-
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@@ -1541,11 +1079,6 @@ is-core-module@^2.16.0:
dependencies:
hasown "^2.0.2"
-is-docker@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
- integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
-
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -1563,18 +1096,6 @@ is-glob@^4.0.1, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
-is-inside-container@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
- integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
- dependencies:
- is-docker "^3.0.0"
-
-is-network-error@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512"
- integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==
-
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -1585,11 +1106,6 @@ is-plain-obj@^2.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
-is-plain-obj@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
- integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==
-
is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -1612,18 +1128,6 @@ is-unicode-supported@^0.1.0:
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
-is-wsl@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2"
- integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==
- dependencies:
- is-inside-container "^1.0.0"
-
-isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
-
isbinaryfile@^4.0.8:
version "4.0.10"
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3"
@@ -1753,14 +1257,6 @@ kotlin-web-helpers@2.1.0:
dependencies:
format-util "^1.0.5"
-launch-editor@^2.6.1:
- version "2.11.1"
- resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.11.1.tgz#61a0b7314a42fd84a6cbb564573d9e9ffcf3d72b"
- integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==
- dependencies:
- picocolors "^1.1.1"
- shell-quote "^1.8.3"
-
loader-runner@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
@@ -1819,80 +1315,28 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
-memfs@^4.6.0:
- version "4.43.0"
- resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.43.0.tgz#8aeed4d242e29acf57dfdfe93fec4f84280f8df6"
- integrity sha512-XCdhMy33sgxCwJ4JgjSasLGgOjFm9/i+IEhO03gPHroJeTBhM7ZQ1+v3j7di9nNKtcLGjVvKjHVOkTbVop/R/Q==
- dependencies:
- "@jsonjoy.com/json-pack" "^1.11.0"
- "@jsonjoy.com/util" "^1.9.0"
- glob-to-regex.js "^1.0.1"
- thingies "^2.5.0"
- tree-dump "^1.0.3"
- tslib "^2.0.0"
-
-merge-descriptors@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
- integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
-
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-methods@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
- integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
-
-micromatch@^4.0.2:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
- integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
- dependencies:
- braces "^3.0.3"
- picomatch "^2.3.1"
-
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0:
- version "1.54.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
- integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
-
-mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
+mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
-mime-types@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce"
- integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==
- dependencies:
- mime-db "^1.54.0"
-
-mime@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
mime@^2.5.2:
version "2.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
-minimalistic-assert@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
minimatch@^3.0.4, minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -1955,39 +1399,21 @@ ms@2.0.0:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-ms@2.1.3, ms@^2.1.3:
+ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-multicast-dns@^7.2.5:
- version "7.2.5"
- resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced"
- integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==
- dependencies:
- dns-packet "^5.2.2"
- thunky "^1.0.2"
-
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
-negotiator@~0.6.4:
- version "0.6.4"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7"
- integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
-
neo-async@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-node-forge@^1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
- integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
-
node-releases@^2.0.19:
version "2.0.20"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.20.tgz#e26bb79dbdd1e64a146df389c699014c611cbc27"
@@ -2008,12 +1434,7 @@ object-inspect@^1.13.3:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
-obuf@^1.0.0, obuf@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
- integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
-
-on-finished@2.4.1, on-finished@^2.4.1:
+on-finished@2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
@@ -2027,11 +1448,6 @@ on-finished@~2.3.0:
dependencies:
ee-first "1.1.1"
-on-headers@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65"
- integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==
-
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -2039,16 +1455,6 @@ once@^1.3.0:
dependencies:
wrappy "1"
-open@^10.0.3:
- version "10.2.0"
- resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c"
- integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==
- dependencies:
- default-browser "^5.2.1"
- define-lazy-prop "^3.0.0"
- is-inside-container "^1.0.0"
- wsl-utils "^0.1.0"
-
p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -2077,15 +1483,6 @@ p-locate@^5.0.0:
dependencies:
p-limit "^3.0.2"
-p-retry@^6.2.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af"
- integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==
- dependencies:
- "@types/retry" "0.12.2"
- is-network-error "^1.0.0"
- retry "^0.13.1"
-
p-try@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
@@ -2096,7 +1493,7 @@ package-json-from-dist@^1.0.0:
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
-parseurl@~1.3.2, parseurl@~1.3.3:
+parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
@@ -2129,17 +1526,12 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-path-to-regexp@0.1.12:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
- integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
-
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+picomatch@^2.0.4, picomatch@^2.2.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -2151,19 +1543,6 @@ pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
-process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-proxy-addr@~2.0.7:
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
- integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
- dependencies:
- forwarded "0.2.0"
- ipaddr.js "1.9.1"
-
punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
@@ -2188,7 +1567,7 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
-range-parser@^1.2.1, range-parser@~1.2.1:
+range-parser@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
@@ -2203,28 +1582,6 @@ raw-body@2.5.2:
iconv-lite "0.4.24"
unpipe "1.0.0"
-readable-stream@^2.0.1:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
- integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
-readable-stream@^3.0.6:
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
- integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
readdirp@^4.0.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
@@ -2280,11 +1637,6 @@ resolve@^1.20.0:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-retry@^0.13.1:
- version "0.13.1"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
- integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
-
rfdc@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
@@ -2297,21 +1649,11 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
-run-applescript@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911"
- integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==
-
-safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+safe-buffer@^5.1.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
safe-regex-test@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1"
@@ -2326,7 +1668,7 @@ safe-regex-test@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.2:
+schema-utils@^4.3.0, schema-utils@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae"
integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==
@@ -2336,38 +1678,6 @@ schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3
ajv-formats "^2.1.1"
ajv-keywords "^5.1.0"
-select-hose@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
- integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==
-
-selfsigned@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0"
- integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==
- dependencies:
- "@types/node-forge" "^1.3.0"
- node-forge "^1"
-
-send@0.19.0:
- version "0.19.0"
- resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
- integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
- dependencies:
- debug "2.6.9"
- depd "2.0.0"
- destroy "1.2.0"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "2.0.0"
- mime "1.6.0"
- ms "2.1.3"
- on-finished "2.4.1"
- range-parser "~1.2.1"
- statuses "2.0.1"
-
serialize-javascript@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
@@ -2375,34 +1685,6 @@ serialize-javascript@^6.0.2:
dependencies:
randombytes "^2.1.0"
-serve-index@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
- integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==
- dependencies:
- accepts "~1.3.4"
- batch "0.6.1"
- debug "2.6.9"
- escape-html "~1.0.3"
- http-errors "~1.6.2"
- mime-types "~2.1.17"
- parseurl "~1.3.2"
-
-serve-static@1.16.2:
- version "1.16.2"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
- integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
- dependencies:
- encodeurl "~2.0.0"
- escape-html "~1.0.3"
- parseurl "~1.3.3"
- send "0.19.0"
-
-setprototypeof@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
- integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
-
setprototypeof@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
@@ -2427,11 +1709,6 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-shell-quote@^1.8.3:
- version "1.8.3"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b"
- integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==
-
side-channel-list@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
@@ -2506,15 +1783,6 @@ socket.io@^4.7.2:
socket.io-adapter "~2.5.2"
socket.io-parser "~4.2.4"
-sockjs@^0.3.24:
- version "0.3.24"
- resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
- integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==
- dependencies:
- faye-websocket "^0.11.3"
- uuid "^8.3.2"
- websocket-driver "^0.7.4"
-
source-map-js@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
@@ -2541,35 +1809,12 @@ source-map@^0.6.0, source-map@^0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-spdy-transport@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
- integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
- dependencies:
- debug "^4.1.0"
- detect-node "^2.0.4"
- hpack.js "^2.1.6"
- obuf "^1.1.2"
- readable-stream "^3.0.6"
- wbuf "^1.7.3"
-
-spdy@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
- integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
- dependencies:
- debug "^4.1.0"
- handle-thing "^2.0.0"
- http-deceiver "^1.2.7"
- select-hose "^2.0.0"
- spdy-transport "^3.0.0"
-
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
-"statuses@>= 1.4.0 < 2", statuses@~1.5.0:
+statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
@@ -2601,20 +1846,6 @@ string-width@^5.0.1, string-width@^5.1.2:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -2679,16 +1910,6 @@ terser@^5.31.1:
commander "^2.20.0"
source-map-support "~0.5.20"
-thingies@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f"
- integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==
-
-thunky@^1.0.2:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
- integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
-
tmp@^0.2.1:
version "0.2.5"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8"
@@ -2706,16 +1927,6 @@ toidentifier@1.0.1:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
-tree-dump@^1.0.3:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4"
- integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==
-
-tslib@^2.0.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
- integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
-
type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -2752,22 +1963,12 @@ update-browserslist-db@^1.1.3:
escalade "^3.2.0"
picocolors "^1.1.1"
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
-uuid@^8.3.2:
- version "8.3.2"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
- integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-
-vary@^1, vary@~1.1.2:
+vary@^1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
@@ -2785,13 +1986,6 @@ watchpack@^2.4.1:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-wbuf@^1.1.0, wbuf@^1.7.3:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
- integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
- dependencies:
- minimalistic-assert "^1.0.0"
-
webpack-cli@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207"
@@ -2811,52 +2005,6 @@ webpack-cli@6.0.1:
rechoir "^0.8.0"
webpack-merge "^6.0.1"
-webpack-dev-middleware@^7.4.2:
- version "7.4.3"
- resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.3.tgz#4e23b479a574549334641faa4e00670720f01839"
- integrity sha512-5kA/PzpZzDz5mNOkcNLmU1UdjGeSSxd7rt1akWpI70jMNHLASiBPRaQZn0hgyhvhawfIwSnnLfDABIxL3ueyFg==
- dependencies:
- colorette "^2.0.10"
- memfs "^4.6.0"
- mime-types "^3.0.1"
- on-finished "^2.4.1"
- range-parser "^1.2.1"
- schema-utils "^4.0.0"
-
-webpack-dev-server@5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz#96a143d50c58fef0c79107e61df911728d7ceb39"
- integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==
- dependencies:
- "@types/bonjour" "^3.5.13"
- "@types/connect-history-api-fallback" "^1.5.4"
- "@types/express" "^4.17.21"
- "@types/express-serve-static-core" "^4.17.21"
- "@types/serve-index" "^1.9.4"
- "@types/serve-static" "^1.15.5"
- "@types/sockjs" "^0.3.36"
- "@types/ws" "^8.5.10"
- ansi-html-community "^0.0.8"
- bonjour-service "^1.2.1"
- chokidar "^3.6.0"
- colorette "^2.0.10"
- compression "^1.7.4"
- connect-history-api-fallback "^2.0.0"
- express "^4.21.2"
- graceful-fs "^4.2.6"
- http-proxy-middleware "^2.0.9"
- ipaddr.js "^2.1.0"
- launch-editor "^2.6.1"
- open "^10.0.3"
- p-retry "^6.2.0"
- schema-utils "^4.2.0"
- selfsigned "^2.4.1"
- serve-index "^1.9.1"
- sockjs "^0.3.24"
- spdy "^4.0.2"
- webpack-dev-middleware "^7.4.2"
- ws "^8.18.0"
-
webpack-merge@^4.1.5:
version "4.2.2"
resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
@@ -2909,20 +2057,6 @@ webpack@5.100.2:
watchpack "^2.4.1"
webpack-sources "^3.3.3"
-websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
- version "0.7.4"
- resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
- integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
- dependencies:
- http-parser-js ">=0.5.1"
- safe-buffer ">=5.1.0"
- websocket-extensions ">=0.1.1"
-
-websocket-extensions@>=0.1.1:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
- integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
-
which@^1.2.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -2970,7 +2104,7 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
-ws@8.18.3, ws@^8.18.0:
+ws@8.18.3:
version "8.18.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
@@ -2980,13 +2114,6 @@ ws@~8.17.1:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
-wsl-utils@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab"
- integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==
- dependencies:
- is-wsl "^3.1.0"
-
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
diff --git a/events/README-EVENTS.md b/services/events/README-EVENTS.md
similarity index 99%
rename from events/README-EVENTS.md
rename to services/events/README-EVENTS.md
index 555354c1..ed4a27ac 100644
--- a/events/README-EVENTS.md
+++ b/services/events/README-EVENTS.md
@@ -454,4 +454,4 @@ spec:
**Letzte Aktualisierung**: 25. Juli 2025
-Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../README.md).
+Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../../README.md).
diff --git a/events/events-api/build.gradle.kts b/services/events/events-api/build.gradle.kts
similarity index 100%
rename from events/events-api/build.gradle.kts
rename to services/events/events-api/build.gradle.kts
diff --git a/events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt b/services/events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt
similarity index 100%
rename from events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt
rename to services/events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt
diff --git a/events/events-application/build.gradle.kts b/services/events/events-application/build.gradle.kts
similarity index 100%
rename from events/events-application/build.gradle.kts
rename to services/events/events-application/build.gradle.kts
diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt
similarity index 100%
rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt
rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt
diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt
similarity index 100%
rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt
rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt
diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt
similarity index 100%
rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt
rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt
diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt
similarity index 100%
rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt
rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt
diff --git a/events/events-domain/build.gradle.kts b/services/events/events-domain/build.gradle.kts
similarity index 100%
rename from events/events-domain/build.gradle.kts
rename to services/events/events-domain/build.gradle.kts
diff --git a/events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt b/services/events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt
similarity index 100%
rename from events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt
rename to services/events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt
diff --git a/events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt b/services/events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt
similarity index 100%
rename from events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt
rename to services/events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt
diff --git a/events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt b/services/events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt
similarity index 100%
rename from events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt
rename to services/events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt
diff --git a/events/events-infrastructure/build.gradle.kts b/services/events/events-infrastructure/build.gradle.kts
similarity index 100%
rename from events/events-infrastructure/build.gradle.kts
rename to services/events/events-infrastructure/build.gradle.kts
diff --git a/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt b/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt
similarity index 100%
rename from events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt
rename to services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt
diff --git a/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt b/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt
similarity index 100%
rename from events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt
rename to services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt
diff --git a/events/events-service/build.gradle.kts b/services/events/events-service/build.gradle.kts
similarity index 100%
rename from events/events-service/build.gradle.kts
rename to services/events/events-service/build.gradle.kts
diff --git a/events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt b/services/events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt
similarity index 100%
rename from events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt
rename to services/events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt
diff --git a/events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt b/services/events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt
similarity index 100%
rename from events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt
rename to services/events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt
diff --git a/events/events-service/src/test/resources/logback-test.xml b/services/events/events-service/src/test/resources/logback-test.xml
similarity index 100%
rename from events/events-service/src/test/resources/logback-test.xml
rename to services/events/events-service/src/test/resources/logback-test.xml
diff --git a/horses/README-HORSES.md b/services/horses/README-HORSES.md
similarity index 99%
rename from horses/README-HORSES.md
rename to services/horses/README-HORSES.md
index 9380939b..897e1eea 100644
--- a/horses/README-HORSES.md
+++ b/services/horses/README-HORSES.md
@@ -530,4 +530,4 @@ spec:
**Letzte Aktualisierung**: 25. Juli 2025
-Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../README.md).
+Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../../README.md).
diff --git a/horses/horses-api/build.gradle.kts b/services/horses/horses-api/build.gradle.kts
similarity index 100%
rename from horses/horses-api/build.gradle.kts
rename to services/horses/horses-api/build.gradle.kts
diff --git a/horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt b/services/horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt
similarity index 100%
rename from horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt
rename to services/horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt
diff --git a/horses/horses-application/build.gradle.kts b/services/horses/horses-application/build.gradle.kts
similarity index 100%
rename from horses/horses-application/build.gradle.kts
rename to services/horses/horses-application/build.gradle.kts
diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt
similarity index 100%
rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt
rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt
diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt
similarity index 100%
rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt
rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt
diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt
similarity index 100%
rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt
rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt
diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt
similarity index 100%
rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt
rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt
diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt
similarity index 100%
rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt
rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt
diff --git a/horses/horses-domain/build.gradle.kts b/services/horses/horses-domain/build.gradle.kts
similarity index 100%
rename from horses/horses-domain/build.gradle.kts
rename to services/horses/horses-domain/build.gradle.kts
diff --git a/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt b/services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt
similarity index 100%
rename from horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt
rename to services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt
diff --git a/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt b/services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt
similarity index 100%
rename from horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt
rename to services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt
diff --git a/horses/horses-infrastructure/build.gradle.kts b/services/horses/horses-infrastructure/build.gradle.kts
similarity index 100%
rename from horses/horses-infrastructure/build.gradle.kts
rename to services/horses/horses-infrastructure/build.gradle.kts
diff --git a/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt b/services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt
similarity index 100%
rename from horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt
rename to services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt
diff --git a/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt b/services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt
similarity index 100%
rename from horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt
rename to services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt
diff --git a/horses/horses-service/build.gradle.kts b/services/horses/horses-service/build.gradle.kts
similarity index 100%
rename from horses/horses-service/build.gradle.kts
rename to services/horses/horses-service/build.gradle.kts
diff --git a/horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt b/services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt
similarity index 100%
rename from horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt
rename to services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt
diff --git a/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt b/services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt
similarity index 100%
rename from horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt
rename to services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt
diff --git a/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt b/services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt
similarity index 100%
rename from horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt
rename to services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt
diff --git a/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt b/services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt
similarity index 100%
rename from horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt
rename to services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt
diff --git a/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt b/services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt
similarity index 100%
rename from horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt
rename to services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt
diff --git a/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt b/services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt
similarity index 100%
rename from horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt
rename to services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt
diff --git a/horses/horses-service/src/test/resources/logback-test.xml b/services/horses/horses-service/src/test/resources/logback-test.xml
similarity index 100%
rename from horses/horses-service/src/test/resources/logback-test.xml
rename to services/horses/horses-service/src/test/resources/logback-test.xml
diff --git a/masterdata/README-MASTERDATA.md b/services/masterdata/README-MASTERDATA.md
similarity index 100%
rename from masterdata/README-MASTERDATA.md
rename to services/masterdata/README-MASTERDATA.md
diff --git a/masterdata/masterdata-api/build.gradle.kts b/services/masterdata/masterdata-api/build.gradle.kts
similarity index 100%
rename from masterdata/masterdata-api/build.gradle.kts
rename to services/masterdata/masterdata-api/build.gradle.kts
diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt
similarity index 100%
rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt
rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt
diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt
similarity index 100%
rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt
rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt
diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt
similarity index 100%
rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt
rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt
diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt
similarity index 100%
rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt
rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt
diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt
similarity index 100%
rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt
rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt
diff --git a/masterdata/masterdata-application/build.gradle.kts b/services/masterdata/masterdata-application/build.gradle.kts
similarity index 100%
rename from masterdata/masterdata-application/build.gradle.kts
rename to services/masterdata/masterdata-application/build.gradle.kts
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt
diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt
similarity index 100%
rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt
rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt
diff --git a/masterdata/masterdata-domain/build.gradle.kts b/services/masterdata/masterdata-domain/build.gradle.kts
similarity index 100%
rename from masterdata/masterdata-domain/build.gradle.kts
rename to services/masterdata/masterdata-domain/build.gradle.kts
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt
diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt
similarity index 100%
rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt
rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt
diff --git a/masterdata/masterdata-infrastructure/build.gradle.kts b/services/masterdata/masterdata-infrastructure/build.gradle.kts
similarity index 100%
rename from masterdata/masterdata-infrastructure/build.gradle.kts
rename to services/masterdata/masterdata-infrastructure/build.gradle.kts
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt
diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt
similarity index 100%
rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt
rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt
diff --git a/masterdata/masterdata-service/build.gradle.kts b/services/masterdata/masterdata-service/build.gradle.kts
similarity index 100%
rename from masterdata/masterdata-service/build.gradle.kts
rename to services/masterdata/masterdata-service/build.gradle.kts
diff --git a/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt b/services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt
similarity index 100%
rename from masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt
rename to services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt
diff --git a/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt b/services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt
similarity index 100%
rename from masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt
rename to services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt
diff --git a/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt b/services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt
similarity index 100%
rename from masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt
rename to services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt
diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql
similarity index 100%
rename from masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql
rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql
diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql
similarity index 100%
rename from masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql
rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql
diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql
similarity index 100%
rename from masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql
rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql
diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql
similarity index 100%
rename from masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql
rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql
diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql
similarity index 100%
rename from masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql
rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql
diff --git a/masterdata/masterdata-service/src/test/resources/logback-test.xml b/services/masterdata/masterdata-service/src/test/resources/logback-test.xml
similarity index 100%
rename from masterdata/masterdata-service/src/test/resources/logback-test.xml
rename to services/masterdata/masterdata-service/src/test/resources/logback-test.xml
diff --git a/members/README-MEMBERS.md b/services/members/README-MEMBERS.md
similarity index 99%
rename from members/README-MEMBERS.md
rename to services/members/README-MEMBERS.md
index bcfe304a..9cff1622 100644
--- a/members/README-MEMBERS.md
+++ b/services/members/README-MEMBERS.md
@@ -330,4 +330,4 @@ spec:
**Letzte Aktualisierung**: 25. Juli 2025
-Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../README.md).
+Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../../README.md).
diff --git a/members/members-api/build.gradle.kts b/services/members/members-api/build.gradle.kts
similarity index 100%
rename from members/members-api/build.gradle.kts
rename to services/members/members-api/build.gradle.kts
diff --git a/members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt b/services/members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt
similarity index 100%
rename from members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt
rename to services/members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt
diff --git a/members/members-application/build.gradle.kts b/services/members/members-application/build.gradle.kts
similarity index 100%
rename from members/members-application/build.gradle.kts
rename to services/members/members-application/build.gradle.kts
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt
diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt
similarity index 100%
rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt
rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt
diff --git a/members/members-domain/build.gradle.kts b/services/members/members-domain/build.gradle.kts
similarity index 100%
rename from members/members-domain/build.gradle.kts
rename to services/members/members-domain/build.gradle.kts
diff --git a/members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt b/services/members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt
similarity index 100%
rename from members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt
rename to services/members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt
diff --git a/members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt b/services/members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt
similarity index 100%
rename from members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt
rename to services/members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt
diff --git a/members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt b/services/members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt
similarity index 100%
rename from members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt
rename to services/members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt
diff --git a/members/members-infrastructure/build.gradle.kts b/services/members/members-infrastructure/build.gradle.kts
similarity index 100%
rename from members/members-infrastructure/build.gradle.kts
rename to services/members/members-infrastructure/build.gradle.kts
diff --git a/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt b/services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt
similarity index 100%
rename from members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt
rename to services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt
diff --git a/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt b/services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt
similarity index 100%
rename from members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt
rename to services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt
diff --git a/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt b/services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt
similarity index 100%
rename from members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt
rename to services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt
diff --git a/members/members-service/build.gradle.kts b/services/members/members-service/build.gradle.kts
similarity index 100%
rename from members/members-service/build.gradle.kts
rename to services/members/members-service/build.gradle.kts
diff --git a/members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt b/services/members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt
similarity index 100%
rename from members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt
rename to services/members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt
diff --git a/members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt b/services/members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt
similarity index 100%
rename from members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt
rename to services/members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt
diff --git a/members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt b/services/members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt
similarity index 100%
rename from members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt
rename to services/members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt
diff --git a/members/members-service/src/test/resources/logback-test.xml b/services/members/members-service/src/test/resources/logback-test.xml
similarity index 100%
rename from members/members-service/src/test/resources/logback-test.xml
rename to services/members/members-service/src/test/resources/logback-test.xml
diff --git a/services/ping/ping-api/build.gradle.kts b/services/ping/ping-api/build.gradle.kts
new file mode 100644
index 00000000..1286d67a
--- /dev/null
+++ b/services/ping/ping-api/build.gradle.kts
@@ -0,0 +1,34 @@
+plugins {
+ alias(libs.plugins.kotlinMultiplatform)
+ alias(libs.plugins.kotlinSerialization)
+}
+
+group = "at.mocode"
+version = "1.0.0"
+
+kotlin {
+ // JVM target for backend usage
+ jvm()
+
+ // JS target for frontend usage (Compose/Browser)
+ js {
+ browser()
+ // no need for binaries.executable() in a library
+ }
+
+ // Align toolchain with project (see composeApp uses 21)
+ jvmToolchain(21)
+
+ sourceSets {
+ val commonMain by getting {
+ dependencies {
+ implementation(libs.kotlinx.serialization.json)
+ }
+ }
+ val commonTest by getting {
+ dependencies {
+ implementation(libs.kotlin.test)
+ }
+ }
+ }
+}
diff --git a/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt
new file mode 100644
index 00000000..56c0a256
--- /dev/null
+++ b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt
@@ -0,0 +1,7 @@
+package at.mocode.ping.api
+
+interface PingApi {
+ suspend fun simplePing(): PingResponse
+ suspend fun enhancedPing(simulate: Boolean = false): EnhancedPingResponse
+ suspend fun healthCheck(): HealthResponse
+}
diff --git a/client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt
similarity index 61%
rename from client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt
rename to services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt
index c81001bc..b2101614 100644
--- a/client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt
+++ b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt
@@ -1,21 +1,17 @@
-package at.mocode.model
+package at.mocode.ping.api
import kotlinx.serialization.Serializable
@Serializable
-data class PingResponse(
- val status: String,
- val timestamp: String,
- val service: String
-)
+data class PingResponse(val status: String, val timestamp: String, val service: String)
@Serializable
data class EnhancedPingResponse(
val status: String,
val timestamp: String,
val service: String,
- val circuitBreakerState: String? = null,
- val responseTime: Long? = null
+ val circuitBreakerState: String,
+ val responseTime: Long
)
@Serializable
diff --git a/temp/ping-service/build.gradle.kts b/services/ping/ping-service/build.gradle.kts
similarity index 90%
rename from temp/ping-service/build.gradle.kts
rename to services/ping/ping-service/build.gradle.kts
index 5e55377e..10161ec6 100644
--- a/temp/ping-service/build.gradle.kts
+++ b/services/ping/ping-service/build.gradle.kts
@@ -23,7 +23,7 @@ tasks.withType {
// Configure the main class for the executable JAR
springBoot {
- mainClass.set("at.mocode.temp.pingservice.PingServiceApplicationKt")
+ mainClass.set("at.mocode.ping.service.PingServiceApplicationKt")
buildInfo()
}
@@ -34,12 +34,17 @@ dependencies {
// Provide common Kotlin dependencies (coroutines, serialization, logging)
implementation(projects.platform.platformDependencies)
+ // Contract module for type-safe DTOs and API interface
+ implementation(projects.services.ping.pingApi)
+
// Monitoring client: tracing + zipkin + defaults
implementation(projects.infrastructure.monitoring.monitoringClient)
// === Core Spring Boot Dependencies ===
// Web starter for REST endpoints
implementation(libs.spring.boot.starter.web)
+ // Jackson Kotlin module for data classes and Kotlin features
+ implementation(libs.jackson.module.kotlin)
// Kotlin reflection for Spring Boot Kotlin serialization
implementation("org.jetbrains.kotlin:kotlin-reflect")
diff --git a/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt
new file mode 100644
index 00000000..81a161d4
--- /dev/null
+++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt
@@ -0,0 +1,87 @@
+package at.mocode.ping.service
+
+import at.mocode.ping.api.PingResponse
+import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry
+import org.springframework.http.MediaType
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.*
+import java.time.OffsetDateTime
+import java.time.format.DateTimeFormatter
+import java.util.UUID
+
+@RestController
+@CrossOrigin(
+ origins = ["http://localhost:8080", "http://localhost:8083", "http://localhost:4000"],
+ methods = [RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS],
+ allowedHeaders = ["*"],
+ allowCredentials = "true"
+)
+class LegacyPingController(
+ private val pingService: PingServiceCircuitBreaker,
+ private val circuitBreakerRegistry: CircuitBreakerRegistry
+) {
+
+ @GetMapping("/ping", produces = [MediaType.APPLICATION_JSON_VALUE])
+ fun legacySimplePing(): ResponseEntity {
+ val now = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
+ val resp = PingResponse(
+ status = "pong",
+ timestamp = now,
+ service = "ping-service"
+ )
+ return ResponseEntity
+ .ok()
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(resp)
+ }
+
+ @GetMapping("/ping/enhanced")
+ fun legacyEnhanced(@RequestParam(required = false, defaultValue = "false") simulate: Boolean): Map {
+ val dto = pingService.ping(simulate)
+ val map = mutableMapOf(
+ "status" to dto.status,
+ "timestamp" to dto.timestamp,
+ "service" to dto.service,
+ "circuitBreaker" to dto.circuitBreakerState
+ )
+ if (dto.status.equals("fallback", ignoreCase = true) || dto.service.contains("fallback")) {
+ map["message"] = "Service temporarily unavailable"
+ map["error"] = UUID.randomUUID().toString()
+ }
+ return map
+ }
+
+ @GetMapping("/ping/health")
+ fun legacyHealth(): Map {
+ val dto = pingService.healthCheck()
+ val state = circuitBreakerRegistry
+ .circuitBreaker(PingServiceCircuitBreaker.PING_CIRCUIT_BREAKER)
+ .state
+ val cb = if (state.name == "OPEN") "OPEN" else "CLOSED"
+ val map = mutableMapOf(
+ "status" to if (dto.healthy) "UP" else "DOWN",
+ "timestamp" to dto.timestamp,
+ "circuitBreaker" to cb
+ )
+ if (!dto.healthy) {
+ map["message"] = "Health check temporarily unavailable"
+ }
+ return map
+ }
+
+ @GetMapping("/ping/test-failure")
+ fun legacyTestFailure(): Map {
+ val dto = pingService.ping(simulateFailure = true)
+ val map = mutableMapOf(
+ "status" to dto.status,
+ "timestamp" to dto.timestamp,
+ "service" to dto.service,
+ "circuitBreaker" to dto.circuitBreakerState
+ )
+ if (dto.status.equals("fallback", ignoreCase = true) || dto.service.contains("fallback")) {
+ map["message"] = "Service temporarily unavailable"
+ map["error"] = UUID.randomUUID().toString()
+ }
+ return map
+ }
+}
diff --git a/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt
new file mode 100644
index 00000000..a73f0837
--- /dev/null
+++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt
@@ -0,0 +1,40 @@
+package at.mocode.ping.service
+
+import at.mocode.ping.api.EnhancedPingResponse
+import at.mocode.ping.api.HealthResponse
+import at.mocode.ping.api.PingApi
+import at.mocode.ping.api.PingResponse
+import org.springframework.web.bind.annotation.*
+import java.time.OffsetDateTime
+import java.time.format.DateTimeFormatter
+
+@RestController
+@CrossOrigin(
+ origins = ["http://localhost:8080", "http://localhost:8083", "http://localhost:4000"],
+ methods = [RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS],
+ allowedHeaders = ["*"],
+ allowCredentials = "true"
+)
+class PingController(
+ private val pingService: PingServiceCircuitBreaker
+) : PingApi {
+
+ // Contract endpoints
+ @GetMapping("/api/ping/simple")
+ override suspend fun simplePing(): PingResponse {
+ val now = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
+ return PingResponse(
+ status = "pong",
+ timestamp = now,
+ service = "ping-service"
+ )
+ }
+
+ @GetMapping("/api/ping/enhanced")
+ override suspend fun enhancedPing(
+ @RequestParam(required = false, defaultValue = "false") simulate: Boolean
+ ): EnhancedPingResponse = pingService.ping(simulate)
+
+ @GetMapping("/api/ping/health")
+ override suspend fun healthCheck(): HealthResponse = pingService.healthCheck()
+}
diff --git a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceApplication.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceApplication.kt
similarity index 97%
rename from temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceApplication.kt
rename to services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceApplication.kt
index 99c9264b..04b78dc2 100644
--- a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceApplication.kt
+++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceApplication.kt
@@ -1,4 +1,4 @@
-package at.mocode.temp.pingservice
+package at.mocode.ping.service
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
diff --git a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreaker.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceCircuitBreaker.kt
similarity index 61%
rename from temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreaker.kt
rename to services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceCircuitBreaker.kt
index 3ecfbc25..f257998e 100644
--- a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreaker.kt
+++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceCircuitBreaker.kt
@@ -1,5 +1,7 @@
-package at.mocode.temp.pingservice
+package at.mocode.ping.service
+import at.mocode.ping.api.EnhancedPingResponse
+import at.mocode.ping.api.HealthResponse
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@@ -24,13 +26,13 @@ class PingServiceCircuitBreaker {
}
/**
- * Primary ping method with circuit breaker protection
+ * Primary ping method with circuit breaker protection returning DTO directly
*
* @param simulateFailure - if true, randomly throws exceptions to test circuit breaker
- * @return Map containing ping response with timestamp and status
*/
@CircuitBreaker(name = PING_CIRCUIT_BREAKER, fallbackMethod = "fallbackPing")
- fun ping(simulateFailure: Boolean = false): Map {
+ fun ping(simulateFailure: Boolean = false): EnhancedPingResponse {
+ val start = System.nanoTime()
logger.info("Executing ping service call...")
if (simulateFailure && Random.nextDouble() < 0.6) {
@@ -39,13 +41,15 @@ class PingServiceCircuitBreaker {
}
val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter)
+ val elapsedMs = (System.nanoTime() - start) / 1_000_000
logger.info("Ping service call successful")
- return mapOf(
- "status" to "pong",
- "timestamp" to currentTime,
- "service" to "ping-service",
- "circuitBreaker" to "CLOSED"
+ return EnhancedPingResponse(
+ status = "pong",
+ timestamp = currentTime,
+ service = "ping-service",
+ circuitBreakerState = "CLOSED",
+ responseTime = elapsedMs
)
}
@@ -54,55 +58,52 @@ class PingServiceCircuitBreaker {
*
* @param simulateFailure - original parameter (ignored in fallback)
* @param exception - the exception that triggered the fallback
- * @return Map containing fallback response
*/
- fun fallbackPing(simulateFailure: Boolean = false, exception: Exception): Map {
+ fun fallbackPing(simulateFailure: Boolean = false, exception: Exception): EnhancedPingResponse {
+ val start = System.nanoTime()
// Die volle Exception nur loggen, nicht an den Client weitergeben.
logger.warn("Circuit breaker fallback triggered due to: {}", exception.toString())
val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter)
- val correlatedId = java.util.UUID.randomUUID().toString()
+ val elapsedMs = (System.nanoTime() - start) / 1_000_000
- return mapOf(
- "status" to "fallback",
- "message" to "Service temporarily unavailable",
- "timestamp" to currentTime,
- "service" to "ping-service-fallback",
- "circuitBreaker" to "OPEN",
- "error" to correlatedId // Diese ID kann für Support-Anfragen genutzt werden.
+ return EnhancedPingResponse(
+ status = "fallback",
+ timestamp = currentTime,
+ service = "ping-service-fallback",
+ circuitBreakerState = "OPEN",
+ responseTime = elapsedMs
)
}
/**
- * Health check method with circuit breaker protection
+ * Health check method with circuit breaker protection returning DTO directly
*/
@CircuitBreaker(name = PING_CIRCUIT_BREAKER, fallbackMethod = "fallbackHealth")
- fun healthCheck(): Map {
+ fun healthCheck(): HealthResponse {
logger.info("Executing health check...")
- // Health check is now deterministic for reliable integration testing
- // Random failures were causing intermittent test failures
-
val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter)
- return mapOf(
- "status" to "UP",
- "timestamp" to currentTime,
- "circuitBreaker" to "CLOSED"
+ return HealthResponse(
+ status = "pong",
+ timestamp = currentTime,
+ service = "ping-service",
+ healthy = true
)
}
/**
- * Fallback for health check
+ * Fallback for health check returning DTO
*/
- fun fallbackHealth(exception: Exception): Map {
+ fun fallbackHealth(exception: Exception): HealthResponse {
logger.warn("Health check fallback triggered: {}", exception.message)
val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter)
- return mapOf(
- "status" to "DOWN",
- "message" to "Health check temporarily unavailable",
- "timestamp" to currentTime,
- "circuitBreaker" to "OPEN"
+ return HealthResponse(
+ status = "down",
+ timestamp = currentTime,
+ service = "ping-service",
+ healthy = false
)
}
}
diff --git a/temp/ping-service/src/main/resources/application.yml b/services/ping/ping-service/src/main/resources/application.yml
similarity index 100%
rename from temp/ping-service/src/main/resources/application.yml
rename to services/ping/ping-service/src/main/resources/application.yml
diff --git a/temp/ping-service/src/main/resources/logback-spring.xml b/services/ping/ping-service/src/main/resources/logback-spring.xml
similarity index 100%
rename from temp/ping-service/src/main/resources/logback-spring.xml
rename to services/ping/ping-service/src/main/resources/logback-spring.xml
diff --git a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerIntegrationTest.kt b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerIntegrationTest.kt
similarity index 99%
rename from temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerIntegrationTest.kt
rename to services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerIntegrationTest.kt
index 823f8940..aa5aa18b 100644
--- a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerIntegrationTest.kt
+++ b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerIntegrationTest.kt
@@ -1,4 +1,4 @@
-package at.mocode.temp.pingservice
+package at.mocode.ping.service
import io.github.resilience4j.circuitbreaker.CircuitBreaker
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry
diff --git a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerTest.kt b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerTest.kt
similarity index 83%
rename from temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerTest.kt
rename to services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerTest.kt
index 540708fd..075dccd9 100644
--- a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerTest.kt
+++ b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerTest.kt
@@ -1,6 +1,7 @@
-package at.mocode.temp.pingservice
+package at.mocode.ping.service
import io.mockk.mockk
+import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
@@ -11,7 +12,7 @@ import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.*
-@WebMvcTest(PingController::class)
+@WebMvcTest(LegacyPingController::class)
@Import(PingControllerTest.TestConfig::class)
class PingControllerTest {
@@ -22,6 +23,9 @@ class PingControllerTest {
class TestConfig {
@Bean
fun pingServiceCircuitBreaker(): PingServiceCircuitBreaker = mockk()
+
+ @Bean
+ fun circuitBreakerRegistry(): CircuitBreakerRegistry = mockk()
}
@Test
diff --git a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreakerTest.kt b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingServiceCircuitBreakerTest.kt
similarity index 59%
rename from temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreakerTest.kt
rename to services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingServiceCircuitBreakerTest.kt
index 2e308adb..04a57125 100644
--- a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreakerTest.kt
+++ b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingServiceCircuitBreakerTest.kt
@@ -1,4 +1,4 @@
-package at.mocode.temp.pingservice
+package at.mocode.ping.service
import io.github.resilience4j.circuitbreaker.CircuitBreaker
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry
@@ -12,7 +12,7 @@ import kotlin.math.ceil
/**
* Comprehensive test suite for PingServiceCircuitBreaker
- * Tests circuit breaker behavior, fallback methods, and state transitions
+ * Updated to assert DTOs instead of Maps.
*/
@SpringBootTest
class PingServiceCircuitBreakerTest {
@@ -43,10 +43,11 @@ class PingServiceCircuitBreakerTest {
val result = pingServiceCircuitBreaker.ping(simulateFailure = false)
// Then
- assertThat(result["status"]).isEqualTo("pong")
- assertThat(result["service"]).isEqualTo("ping-service")
- assertThat(result["circuitBreaker"]).isEqualTo("CLOSED")
- assertThat(result).containsKeys("timestamp")
+ assertThat(result.status).isEqualTo("pong")
+ assertThat(result.service).isEqualTo("ping-service")
+ assertThat(result.circuitBreakerState).isEqualTo("CLOSED")
+ assertThat(result.timestamp).isNotBlank()
+ assertThat(result.responseTime).isGreaterThanOrEqualTo(0)
assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED)
}
@@ -55,20 +56,18 @@ class PingServiceCircuitBreakerTest {
// Given
assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED)
- // When - single failure should not open circuit breaker (needs 4 failures minimum)
- // Try multiple times since failure simulation is probabilistic (60% chance)
- var result: Map
- var attempts = 0
- do {
+ // When - try until we hit a simulated failure (60% chance)
+ var result = pingServiceCircuitBreaker.ping(simulateFailure = true)
+ var attempts = 1
+ while (result.status == "pong" && attempts < 10) {
result = pingServiceCircuitBreaker.ping(simulateFailure = true)
attempts++
- } while (result["status"] == "pong" && attempts < 10)
+ }
- // Then - should get fallback response eventually, but circuit breaker might still be closed after just one failure
- assertThat(result["status"]).isEqualTo("fallback")
- assertThat(result["service"]).isEqualTo("ping-service-fallback")
- assertThat(result["circuitBreaker"]).isEqualTo("OPEN")
- assertThat(result).containsKeys("timestamp", "message", "error")
+ // Then - should get fallback response eventually
+ assertThat(result.status).isEqualTo("fallback")
+ assertThat(result.service).isEqualTo("ping-service-fallback")
+ assertThat(result.circuitBreakerState).isEqualTo("OPEN")
logger.info("Circuit breaker state after single failure (after {} attempts): {}", attempts, circuitBreaker.state)
}
@@ -78,7 +77,6 @@ class PingServiceCircuitBreakerTest {
assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED)
// When - trigger multiple failures to reach minimum-number-of-calls (4) and failure threshold (60%)
- // Keep calling until we get enough failures to trigger the circuit breaker
var failureCount = 0
var totalCalls = 0
val maxAttempts = 20 // Prevent infinite loop
@@ -86,22 +84,18 @@ class PingServiceCircuitBreakerTest {
while (circuitBreaker.state == CircuitBreaker.State.CLOSED && totalCalls < maxAttempts) {
val result = pingServiceCircuitBreaker.ping(simulateFailure = true)
totalCalls++
-
- if (result["status"] == "fallback") {
- failureCount++
- }
-
- logger.info("Attempt {}: Circuit breaker state = {}, Response status = {}, Failures so far = {}",
- totalCalls, circuitBreaker.state, result["status"], failureCount)
+ if (result.status == "fallback") failureCount++
+ logger.info(
+ "Attempt {}: Circuit breaker state = {}, Response status = {}, Failures so far = {}",
+ totalCalls, circuitBreaker.state, result.status, failureCount
+ )
}
// Then - circuit breaker should be open after sufficient failures
- logger.info("Final circuit breaker state: {} after {} total calls with {} failures",
- circuitBreaker.state, totalCalls, failureCount)
-
- // The circuit breaker should eventually open due to failure rate threshold
- // Note: Due to the minimum calls requirement (4) and failure rate threshold (60%),
- // it might take several attempts depending on random simulation
+ logger.info(
+ "Final circuit breaker state: {} after {} total calls with {} failures",
+ circuitBreaker.state, totalCalls, failureCount
+ )
if (totalCalls >= 4 && failureCount >= ceil(totalCalls * 0.6)) {
assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.OPEN)
}
@@ -117,10 +111,9 @@ class PingServiceCircuitBreakerTest {
val result = pingServiceCircuitBreaker.ping(simulateFailure = false)
// Then
- assertThat(result["status"]).isEqualTo("fallback")
- assertThat(result["service"]).isEqualTo("ping-service-fallback")
- assertThat(result["circuitBreaker"]).isEqualTo("OPEN")
- assertThat(result["message"]).isEqualTo("Service temporarily unavailable")
+ assertThat(result.status).isEqualTo("fallback")
+ assertThat(result.service).isEqualTo("ping-service-fallback")
+ assertThat(result.circuitBreakerState).isEqualTo("OPEN")
}
@Test
@@ -128,19 +121,13 @@ class PingServiceCircuitBreakerTest {
// Given
assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED)
- // When - retry if we get random failure (10% chance in health check method)
- var result: Map
- var attempts = 0
- do {
- result = pingServiceCircuitBreaker.healthCheck()
- attempts++
- } while (result["status"] == "DOWN" && attempts < 15) // 15 attempts should be enough to get a success
+ // When
+ val result = pingServiceCircuitBreaker.healthCheck()
// Then
- assertThat(result["status"]).isEqualTo("UP")
- assertThat(result["circuitBreaker"]).isEqualTo("CLOSED")
- assertThat(result).containsKeys("timestamp")
- logger.info("Health check succeeded after {} attempts", attempts)
+ assertThat(result.healthy).isTrue()
+ assertThat(result.status).isEqualTo("pong")
+ assertThat(result.timestamp).isNotBlank()
}
@Test
@@ -153,9 +140,8 @@ class PingServiceCircuitBreakerTest {
val result = pingServiceCircuitBreaker.healthCheck()
// Then
- assertThat(result["status"]).isEqualTo("DOWN")
- assertThat(result["circuitBreaker"]).isEqualTo("OPEN")
- assertThat(result["message"]).isEqualTo("Health check temporarily unavailable")
+ assertThat(result.healthy).isFalse()
+ assertThat(result.status).isEqualTo("down")
}
@Test
@@ -179,7 +165,7 @@ class PingServiceCircuitBreakerTest {
val result = pingServiceCircuitBreaker.ping(simulateFailure = false)
// Then
- assertThat(result["status"]).isEqualTo("pong")
+ assertThat(result.status).isEqualTo("pong")
logger.info("Circuit breaker state after successful call in HALF_OPEN: {}", circuitBreaker.state)
}
@@ -187,12 +173,9 @@ class PingServiceCircuitBreakerTest {
fun `should track circuit breaker metrics`() {
// Given
val metrics = circuitBreaker.metrics
-
- // When
- val initialFailureRate = metrics.failureRate
val initialNumberOfCalls = metrics.numberOfBufferedCalls
- // Execute some successful calls
+ // When - execute some successful calls
repeat(3) {
pingServiceCircuitBreaker.ping(simulateFailure = false)
}
@@ -200,11 +183,13 @@ class PingServiceCircuitBreakerTest {
// Then
val newMetrics = circuitBreaker.metrics
assertThat(newMetrics.numberOfBufferedCalls).isGreaterThan(initialNumberOfCalls)
- logger.info("Circuit breaker metrics - Calls: {}, Failure rate: {}%, Successful calls: {}, Failed calls: {}",
- newMetrics.numberOfBufferedCalls,
- newMetrics.failureRate,
- newMetrics.numberOfSuccessfulCalls,
- newMetrics.numberOfFailedCalls)
+ logger.info(
+ "Circuit breaker metrics - Calls: {}, Failure rate: {}%, Successful calls: {}, Failed calls: {}",
+ newMetrics.numberOfBufferedCalls,
+ newMetrics.failureRate,
+ newMetrics.numberOfSuccessfulCalls,
+ newMetrics.numberOfFailedCalls
+ )
}
@Test
@@ -213,20 +198,19 @@ class PingServiceCircuitBreakerTest {
assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED)
// When - execute concurrent calls
- val futures = (1..10).map { index ->
+ val threads = (1..10).map { index ->
Thread {
val result = pingServiceCircuitBreaker.ping(simulateFailure = false)
- logger.info("Concurrent call {}: status = {}", index, result["status"])
+ logger.info("Concurrent call {}: status = {}", index, result.status)
}
}
- futures.forEach { it.start() }
- futures.forEach { it.join() }
+ threads.forEach { it.start() }
+ threads.forEach { it.join() }
- // Then
+ // Then - verify circuit breaker recorded calls
val metrics = circuitBreaker.metrics
- assertThat(metrics.numberOfBufferedCalls).isEqualTo(10)
- assertThat(metrics.numberOfSuccessfulCalls).isEqualTo(10)
- assertThat(metrics.numberOfFailedCalls).isEqualTo(0)
+ assertThat(metrics.numberOfBufferedCalls).isGreaterThanOrEqualTo(10)
+ assertThat(metrics.numberOfSuccessfulCalls).isGreaterThanOrEqualTo(10)
}
}
diff --git a/temp/ping-service/src/test/resources/application-test.yml b/services/ping/ping-service/src/test/resources/application-test.yml
similarity index 100%
rename from temp/ping-service/src/test/resources/application-test.yml
rename to services/ping/ping-service/src/test/resources/application-test.yml
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 04119964..8faa9f9e 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -55,12 +55,11 @@ include(":infrastructure:monitoring:monitoring-client")
include(":infrastructure:monitoring:monitoring-server")
// Temporary modules
-include(":temp:ping-service")
+include(":services:ping:ping-api")
+include(":services:ping:ping-service")
// Client modules
-include(":client")
-include(":client:composeApp")
-include(":client:shared")
+include(":clients:ping-client")
// Documentation module
include(":docs")
diff --git a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt b/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt
deleted file mode 100644
index 5cd837cb..00000000
--- a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-package at.mocode.temp.pingservice
-
-import org.springframework.web.bind.annotation.CrossOrigin
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.RequestMethod
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
-import java.time.OffsetDateTime
-import java.time.format.DateTimeFormatter
-
-@RestController
-@CrossOrigin(
- origins = ["http://localhost:8080", "http://localhost:8083", "http://localhost:4000"],
- methods = [RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS],
- allowedHeaders = ["*"],
- allowCredentials = "true"
-)
-class PingController(
- private val pingService: PingServiceCircuitBreaker
-) {
-
- /**
- * Standard ping endpoint - maintains backward compatibility
- * NOW HANDLES BOTH /ping AND /ping/ping paths for Gateway compatibility
- */
- @GetMapping("/ping", "/ping/ping")
- fun ping(): Map {
- val now = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
- return mapOf(
- "status" to "pong",
- "timestamp" to now,
- "service" to "ping-service"
- )
- }
-
- /**
- * Enhanced ping endpoint with circuit breaker protection
- */
- @GetMapping("/ping/enhanced")
- fun enhancedPing(@RequestParam(defaultValue = "false") simulate: Boolean): Map {
- // Delegate to service with circuit breaker
- return pingService.ping(simulateFailure = simulate)
- }
-
- /**
- * Health check endpoint with circuit breaker protection
- */
- @GetMapping("/ping/health")
- fun health(): Map {
- return pingService.healthCheck()
- }
-
- /**
- * Endpoint to test circuit breaker behavior by forcing failures
- * Uses simulate=true to increase chance of fallback
- */
- @GetMapping("/ping/test-failure")
- fun testFailure(): Map {
- return try {
- pingService.ping(simulateFailure = true)
- } catch (ex: Exception) {
- // Although CircuitBreaker should handle it, ensure safe fallback
- pingService.fallbackPing(simulateFailure = true, exception = ex)
- }
- }
-}