## Server
- Messages-Tabelle (id, sender_id, receiver_id, body, sent_at, delivered_at)
- MessageRepository: save/getUndelivered/getConversation/markDelivered (JOIN statt N+1)
- POST /api/messages, GET /api/messages/{userId}: Nachrichten senden/abrufen
- GET /api/users: User-Liste fuer authentifizierte User (ohne eigenen Account)
- WebSocketManager: notifyNewMessage() + isOnline()
- WebSocketRoutes: unzugestellte Nachrichten bei Reconnect pushen
- LoginResponse: userId + username ergaenzt
- Server-Dependency: kotlinx.serialization fuer shared
## App
- MessageEntity + MessageDao (Room, Migration 3->4)
- KrisenvorratDatabase v4, Migrations.MIGRATION_3_4
- MessageRepositoryImpl: Offline-First (isPending), drain bei WebSocket-Connect
- WebSocketEvent.NewMessage -> MessageDto aus shared
- WebSocketClientImpl: new_message-Event parsen
- AUTH_USER_ID in SettingsKeys, SyncServiceImpl speichert userId bei Login
- UserListScreen + UserListViewModel: User-Liste anzeigen
- ChatScreen + ChatViewModel: WhatsApp-Style Chat (links/rechts, Zeitstempel)
- Navigation: Screen.UserList, Screen.Chat, MESSAGES in Bottom-Nav
- RepositoryModule: MessageRepository gebunden
## Tests
- 234 Tests, 0 Fehler
56 lines
1.5 KiB
Text
56 lines
1.5 KiB
Text
plugins {
|
|
alias(libs.plugins.kotlin.jvm)
|
|
alias(libs.plugins.kotlin.serialization)
|
|
alias(libs.plugins.ktor)
|
|
}
|
|
|
|
application {
|
|
mainClass.set("de.krisenvorrat.server.ApplicationKt")
|
|
}
|
|
|
|
ktor {
|
|
fatJar {
|
|
archiveFileName.set("server.jar")
|
|
}
|
|
}
|
|
|
|
java {
|
|
sourceCompatibility = JavaVersion.VERSION_11
|
|
targetCompatibility = JavaVersion.VERSION_11
|
|
}
|
|
|
|
kotlin {
|
|
compilerOptions {
|
|
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11)
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation(project(":shared"))
|
|
|
|
implementation(libs.ktor.server.core)
|
|
implementation(libs.ktor.server.netty)
|
|
implementation(libs.ktor.server.content.negotiation)
|
|
implementation(libs.ktor.server.status.pages)
|
|
implementation(libs.ktor.server.auth)
|
|
implementation(libs.ktor.server.auth.jwt)
|
|
implementation(libs.ktor.server.websockets)
|
|
implementation(libs.ktor.server.call.logging)
|
|
implementation(libs.ktor.serialization.kotlinx.json)
|
|
implementation(libs.jbcrypt)
|
|
implementation(libs.logback.classic)
|
|
implementation(libs.exposed.core)
|
|
implementation(libs.exposed.jdbc)
|
|
implementation(libs.h2.database)
|
|
|
|
testImplementation(libs.ktor.server.test.host)
|
|
testImplementation(libs.ktor.client.websockets)
|
|
testImplementation(libs.junit)
|
|
testImplementation(libs.kotlinx.serialization.json)
|
|
}
|
|
|
|
tasks {
|
|
named("distZip") { dependsOn("shadowJar") }
|
|
named("distTar") { dependsOn("shadowJar") }
|
|
named("startScripts") { dependsOn("shadowJar") }
|
|
}
|