- server config outsourced

- test integrated
This commit is contained in:
stefan 2025-04-18 15:15:42 +02:00
parent 44cef36d00
commit b999cb5832
7 changed files with 150 additions and 13 deletions

103
analysis.md Normal file
View File

@ -0,0 +1,103 @@
# Analysis of Meldestelle Project Setups
## Project Overview
Meldestelle is a Kotlin Multiplatform project targeting three platforms:
1. Web (Kotlin/Wasm)
2. Desktop (JVM)
3. Server (Ktor on JVM)
The project uses a shared module for common code and platform-specific implementations.
## Shared Module Setup
- **Purpose**: Contains code shared between all platforms
- **Configuration**:
- Uses Kotlin Multiplatform plugin
- Targets JVM and Wasm/JS
- No explicit dependencies in commonMain
- **Key Components**:
- `Constants.kt`: Defines server port (8080)
- `Greeting.kt`: Common greeting functionality
- `Platform.kt`: Interface with expect/actual pattern for platform-specific implementations
- **Platform Implementations**:
- JVM: Returns "Java [version]"
- Wasm/JS: Returns "Web with Kotlin/Wasm"
## Web (Wasm/JS) Setup
- **Configuration**:
- Uses experimental Wasm/JS target
- Configures webpack for browser output
- Sets up static paths for debugging
- **UI Implementation**:
- Uses ComposeViewport to attach to document body
- Uses common App composable
- **Resources**:
- Simple HTML template with title "Meldestelle"
- Basic CSS for full viewport styling
- Empty JS file (likely generated during build)
- **Build Output**: Generates composeApp.js
## Desktop Setup
- **Configuration**:
- Uses JVM target
- Configures native distributions (DMG, MSI, DEB)
- Sets main class to "at.mocode.MainKt"
- **UI Implementation**:
- Uses Compose for Desktop's Window API
- Sets window title to "Meldestelle"
- Uses common App composable
- **Dependencies**:
- Compose Desktop for current OS
- Kotlinx Coroutines Swing
## Server Setup
- **Configuration**:
- Uses Kotlin JVM plugin
- Uses Ktor plugin
- Sets main class to "at.mocode.ApplicationKt"
- **Implementation**:
- Uses Ktor with Netty engine
- Runs on port 8080 (from shared Constants)
- Simple GET endpoint at "/"
- Returns "Ktor: [greeting]" using shared Greeting class
- **Dependencies**:
- Shared module
- Logback for logging
- Ktor server core and Netty
- Testing dependencies
## Common UI
- **Implementation**:
- Simple Material Design UI
- Button to toggle content visibility
- Shows Compose Multiplatform logo and greeting when visible
- Uses platform-specific greeting implementation
## Observations and Recommendations
### Strengths
1. **Code Sharing**: Effectively shares code between platforms
2. **Platform Abstraction**: Good use of expect/actual pattern
3. **Build Configuration**: Clean separation of build configurations
### Potential Improvements
1. **Dependencies**: The shared module has no explicit dependencies in commonMain
2. **Documentation**: Limited inline documentation
3. **Testing**: No visible tests for client-side code
4. **Resource Handling**: Basic resource handling, could be expanded
5. **Error Handling**: No visible error handling in server endpoints
6. **Configuration**: Hard-coded server port, could use configuration file
7. **Security**: No visible security measures in server setup
8. **Logging**: Minimal logging configuration
### Recommendations
1. Add proper dependency management in shared module
2. Implement comprehensive testing for all platforms
3. Add proper error handling in server endpoints
4. Use configuration files for server settings
5. Implement security measures for server (CORS, authentication)
6. Enhance logging configuration
7. Add more inline documentation
8. Consider adding a CI/CD pipeline configuration
## Conclusion
The Meldestelle project demonstrates a well-structured Kotlin Multiplatform application targeting Web, Desktop, and Server. The project effectively shares code between platforms while allowing for platform-specific implementations. With some improvements in areas like testing, error handling, and configuration, the project could be more robust and production-ready.

View File

@ -8,6 +8,7 @@ ktor = "3.1.2"
ktor-tests = "2.3.13"
logback = "1.5.18"
junit-jupiter = "5.12.0"
junit-jupiter-version = "5.8.1"
[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
@ -24,6 +25,10 @@ ktor-server-tests = { module = "io.ktor:ktor-server-tests-jvm", version.ref = "k
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit-jupiter" }
jupiter-junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit-jupiter" }
# ... andere libraries ...
ktor-server-config-yaml = { module = "io.ktor:ktor-server-config-yaml", version.ref = "ktor" }
junit-junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit-jupiter-version" }
[plugins]
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

View File

@ -20,4 +20,6 @@ dependencies {
testImplementation(libs.kotlin.test.junit)
testImplementation(libs.junit.jupiter)
testImplementation(libs.jupiter.junit.jupiter)
implementation(libs.ktor.server.config.yaml)
testImplementation(libs.junit.junit.jupiter)
}

View File

@ -1,14 +1,12 @@
package at.mocode
import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun main() {
embeddedServer(Netty, port = SERVER_PORT, host = "0.0.0.0", module = Application::module)
.start(wait = true)
fun main(args: Array<String>) {
EngineMain.main(args)
}
fun Application.module() {
@ -17,4 +15,4 @@ fun Application.module() {
call.respondText("Ktor: ${Greeting().greet()}")
}
}
}
}

View File

@ -0,0 +1,19 @@
# Grundkonfiguration für Ktor in YAML
ktor:
deployment:
# Der Port, auf dem der Server lauschen soll
port: 8080
# port: ${PORT:8080} # Alternative: Nutzt Env-Variable PORT, sonst 8080
# Optional für Entwicklung: Server bei Änderungen neu laden
# watch:
# - classes
# - resources
application:
# Hier wird Ktor gesagt, welche Funktion die Konfiguration enthält
# PASSE DEN PFAD AN, falls deine Application.kt oder module() anders heißt/liegt!
modules:
- at.mocode.ApplicationKt.module
# Wenn Application.kt direkt unter at.mocode liegt:
# - at.mocode.ApplicationKt.module

View File

@ -1,15 +1,27 @@
package at.mocode
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import io.ktor.server.testing.* // Wichtig für testApplication
import kotlin.test.* // Wichtig für assertEquals, assertTrue etc.
class ApplicationTest {
@Test
fun main() {
}
@Test
fun module() {
fun testRootRoute() = testApplication {
application {
module() // Ruft deine Konfigurationsfunktion auf
}
// Sendet eine GET-Anfrage an "/" innerhalb der Test-App
val response = client.get("/")
// Überprüfungen (Assertions)
assertEquals(HttpStatusCode.OK, response.status, "Status Code should be OK")
val content = response.bodyAsText() // Holt den HTML-Body als Text
assertTrue(content.contains("Ktor: Hello, Java 21.0.6!"), "Welcome message missing")
}
}

View File

@ -1,3 +1 @@
package at.mocode
const val SERVER_PORT = 8080