diff --git a/books/buildnumber.properties b/books/buildnumber.properties index 37787a4..f903dd5 100644 --- a/books/buildnumber.properties +++ b/books/buildnumber.properties @@ -1,3 +1,3 @@ #auto generated -#Sun Feb 08 23:42:46 CET 2026 -build.number=224 +#Mon Feb 09 23:38:51 CET 2026 +build.number=226 diff --git a/books/src/commonMain/kotlin/net/keinekekse/app/App.kt b/books/src/commonMain/kotlin/net/keinekekse/app/App.kt index 4bdb836..f436853 100644 --- a/books/src/commonMain/kotlin/net/keinekekse/app/App.kt +++ b/books/src/commonMain/kotlin/net/keinekekse/app/App.kt @@ -23,7 +23,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import net.keinekekse.app.books.generated.resources.Res import net.keinekekse.app.books.generated.resources.compose_multiplatform -import net.keinekekse.app.books.ui.theme.AppTheme import org.jetbrains.compose.resources.painterResource import org.koin.compose.koinInject import org.koin.core.annotation.Single @@ -33,13 +32,13 @@ private val logger = KotlinLogging.logger {} @Composable @Preview fun App() { - /*MaterialTheme*/ - /* - eigenes Theme -> https://material-foundation.github.io/material-theme-builder/ - den Download in den source code übernehmen (in Theme.kt sind Anpassungen nötig) - per default hat die generierte Klasse den Namen AppTheme. - */ - AppTheme { + MaterialTheme { + /* + eigenes Theme -> https://material-foundation.github.io/material-theme-builder/ + den Download in den source code übernehmen (in Theme.kt sind Anpassungen nötig) + per default hat die generierte Klasse den Namen AppTheme. +// AppTheme { + */ val test = koinInject() var showContent by remember { mutableStateOf(false) } Column( @@ -81,8 +80,12 @@ class TestAuth(val httpClient: HttpClient) { private val srv = "https://kas.keinekekse.net/" suspend fun request(url: String) { logger.debug { "connecting" } - val response = httpClient.get(srv + url) +// val response = httpClient.get(srv + "testdb/books") +// val books: List = response.body() + + val response = httpClient.get(srv + url + "testdb/books") val body = response.bodyAsText() + logger.debug { "call to $url" } logger.debug { response.status } logger.debug { body } diff --git a/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt b/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt index beffa4d..bd3f900 100644 --- a/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt +++ b/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt @@ -4,13 +4,13 @@ import net.keinekekse.version.Version object VERSION: Version { override val version = "1.0.0" - override val fullVersion = "1.0.0+build.224" + override val fullVersion = "1.0.0+build.226" override val major = 1 override val minor = 0 override val patch = 0 override val preRelease = "" - override val buildMetadata = "build.224" - override val buildDate = "2026-02-08T22:42:46.561391Z" + override val buildMetadata = "build.226" + override val buildDate = "2026-02-09T22:38:51.084372Z" override val displayName = "Books App" override val copyright = "Copyright (c) 2026 Hartmut Bauer" override val name = "books" diff --git a/server/buildnumber.properties b/server/buildnumber.properties index 2752d5a..636d780 100644 --- a/server/buildnumber.properties +++ b/server/buildnumber.properties @@ -1,3 +1,3 @@ #auto generated -#Sun Feb 08 23:42:57 CET 2026 -build.number=43 +#Tue Feb 10 00:04:01 CET 2026 +build.number=50 diff --git a/server/src/main/kotlin/net/keinekekse/app/Application.kt b/server/src/main/kotlin/net/keinekekse/app/Application.kt index eed72ee..6f8bc5e 100644 --- a/server/src/main/kotlin/net/keinekekse/app/Application.kt +++ b/server/src/main/kotlin/net/keinekekse/app/Application.kt @@ -3,10 +3,7 @@ package net.keinekekse.app import io.github.oshai.kotlinlogging.KotlinLogging import io.ktor.server.application.* import net.keinekekse.app.server.VERSION -import net.keinekekse.app.server.config.configureDatabase -import net.keinekekse.app.server.config.configureKoin -import net.keinekekse.app.server.config.configureRouting -import net.keinekekse.app.server.config.configureSecurity +import net.keinekekse.app.server.config.* private val logger = KotlinLogging.logger {} @@ -22,13 +19,22 @@ fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args) //} fun Application.module() { - logger.info { "\n**\n** Starting ${VERSION.displayName} - ${VERSION.description} ${VERSION.fullVersion}\n**" } + logger.info { + """ + + ** + ** Starting ${VERSION.displayName} - ${VERSION.description} ${VERSION.fullVersion} + ** + """.trimIndent() + } + configureSerialization() configureKoin() configureSecurity() - configureRouting() configureDatabase() + configureRouting() + /* // DB-Test transaction { diff --git a/server/src/main/kotlin/net/keinekekse/app/server/Version.kt b/server/src/main/kotlin/net/keinekekse/app/server/Version.kt index 1e94f47..a690d90 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/Version.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/Version.kt @@ -3,14 +3,14 @@ package net.keinekekse.app.server import net.keinekekse.version.Version object VERSION: Version { - override val version = "0.1.0-beta.1+build.43" - override val fullVersion = "0.1.0-beta.1+build.43" + override val version = "0.1.0-beta.1+build.50" + override val fullVersion = "0.1.0-beta.1+build.50" override val major = 0 override val minor = 1 override val patch = 0 override val preRelease = "beta.1" - override val buildMetadata = "build.43" - override val buildDate = "2026-02-08T22:42:57.727025Z" + override val buildMetadata = "build.50" + override val buildDate = "2026-02-09T23:04:01.715682Z" override val displayName = "kAS" override val copyright = "Copyright (c) 2026 Hartmut Bauer" override val name = "server" diff --git a/server/src/main/kotlin/net/keinekekse/app/server/config/koin.kt b/server/src/main/kotlin/net/keinekekse/app/server/config/koin.kt index f763a6f..5df4384 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/config/koin.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/config/koin.kt @@ -2,12 +2,12 @@ package net.keinekekse.app.server.config import io.ktor.server.application.* import net.keinekekse.app.server.di.KoinApp -import org.koin.dsl.koinConfiguration +import org.koin.ktor.plugin.Koin import org.koin.logger.slf4jLogger import org.koin.plugin.module.dsl.withConfiguration fun Application.configureKoin() { - koinConfiguration { + install(Koin) { slf4jLogger() withConfiguration() } diff --git a/server/src/main/kotlin/net/keinekekse/app/server/config/routing.kt b/server/src/main/kotlin/net/keinekekse/app/server/config/routing.kt index 37b1ece..927f114 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/config/routing.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/config/routing.kt @@ -6,6 +6,7 @@ import io.ktor.server.auth.* import io.ktor.server.response.* import io.ktor.server.routing.* import net.keinekekse.app.server.VERSION +import net.keinekekse.app.server.testdb.testDbRoute private val logger = KotlinLogging.logger {} @@ -22,5 +23,7 @@ fun Application.configureRouting() { call.respondText("Ktor ${VERSION.displayName} ${VERSION.fullVersion} - principal=${principal?.name}") } } + + testDbRoute() } } diff --git a/server/src/main/kotlin/net/keinekekse/app/server/config/serialzation.kt b/server/src/main/kotlin/net/keinekekse/app/server/config/serialzation.kt new file mode 100644 index 0000000..73bc7bc --- /dev/null +++ b/server/src/main/kotlin/net/keinekekse/app/server/config/serialzation.kt @@ -0,0 +1,17 @@ +package net.keinekekse.app.server.config + +import io.ktor.serialization.kotlinx.json.* +import io.ktor.server.application.* +import io.ktor.server.plugins.contentnegotiation.* + +fun Application.configureSerialization() { + install(ContentNegotiation) { + json( + json = kotlinx.serialization.json.Json { + prettyPrint = true +// isLenient = true + ignoreUnknownKeys = true + } + ) + } +} diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/db/BookDAO.kt b/server/src/main/kotlin/net/keinekekse/app/server/testdb/db/BookDAO.kt index 475b8a7..44e1336 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/db/BookDAO.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/testdb/db/BookDAO.kt @@ -1,6 +1,6 @@ package net.keinekekse.app.server.testdb.db -import net.keinekekse.app.server.testdb.model.* +import net.keinekekse.app.book.model.* import org.jetbrains.exposed.v1.core.dao.id.EntityID import org.jetbrains.exposed.v1.core.dao.id.IntIdTable import org.jetbrains.exposed.v1.dao.IntEntity diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepository.kt b/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepository.kt index dd59420..197ec01 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepository.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepository.kt @@ -1,5 +1,9 @@ package net.keinekekse.app.server.testdb.model +import net.keinekekse.app.book.model.Artist +import net.keinekekse.app.book.model.Book +import net.keinekekse.app.book.model.Series + interface BookRepository { suspend fun allBooks(): List suspend fun bookById(id: Int): Book? diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepositoryImpl.kt b/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepositoryImpl.kt index 86c0c6c..ea679e9 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepositoryImpl.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/BookRepositoryImpl.kt @@ -1,12 +1,21 @@ package net.keinekekse.app.server.testdb.model +import net.keinekekse.app.book.model.Artist +import net.keinekekse.app.book.model.Book +import net.keinekekse.app.book.model.Series +import net.keinekekse.app.server.testdb.db.BookDAO +import net.keinekekse.app.server.testdb.db.daoToModel +import org.jetbrains.exposed.v1.jdbc.transactions.suspendTransaction +import org.koin.core.annotation.Single + +@Single class BookRepositoryImpl : BookRepository { - override suspend fun allBooks(): List { - TODO("Not yet implemented") + override suspend fun allBooks(): List = suspendTransaction { + BookDAO.all().map(::daoToModel) } - override suspend fun bookById(id: Int): Book? { - TODO("Not yet implemented") + override suspend fun bookById(id: Int): Book? = suspendTransaction { + BookDAO.findById(id)?.let { daoToModel(it) } } override suspend fun booksBySeries(series: Series): List { diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/testDbRoute.kt b/server/src/main/kotlin/net/keinekekse/app/server/testdb/testDbRoute.kt new file mode 100644 index 0000000..b8a6fc6 --- /dev/null +++ b/server/src/main/kotlin/net/keinekekse/app/server/testdb/testDbRoute.kt @@ -0,0 +1,28 @@ +package net.keinekekse.app.server.testdb + +import io.ktor.http.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import net.keinekekse.app.server.testdb.model.BookRepository +import org.koin.ktor.ext.inject + +fun Route.testDbRoute() { + val repository: BookRepository by inject() + +// authenticate("auth-KC") { + route("/testdb") { + get("/books") { +// call.respondText("Test DB route") + val books = repository.allBooks() + call.respond(books) + } + get("/book/{id}") { + // TODO safe toInt conv + val id = call.parameters["id"]!!.toInt() + repository.bookById(id)?.let { call.respond(it) } + ?: call.respondText("Book with id $id not found", status = HttpStatusCode.NotFound) + } + + } +// } +} diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Artist.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Artist.kt similarity index 77% rename from server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Artist.kt rename to shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Artist.kt index dc85382..c7a0763 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Artist.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Artist.kt @@ -1,4 +1,4 @@ -package net.keinekekse.app.server.testdb.model +package net.keinekekse.app.book.model import kotlinx.serialization.Serializable diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/ArtistRole.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/ArtistRole.kt similarity index 73% rename from server/src/main/kotlin/net/keinekekse/app/server/testdb/model/ArtistRole.kt rename to shared/src/commonMain/kotlin/net/keinekekse/app/book/model/ArtistRole.kt index bc6cd61..504cc06 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/ArtistRole.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/ArtistRole.kt @@ -1,4 +1,4 @@ -package net.keinekekse.app.server.testdb.model +package net.keinekekse.app.book.model import kotlinx.serialization.Serializable diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Book.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Book.kt similarity index 87% rename from server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Book.kt rename to shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Book.kt index 69c76c5..f3560c8 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Book.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Book.kt @@ -1,4 +1,4 @@ -package net.keinekekse.app.server.testdb.model +package net.keinekekse.app.book.model import kotlinx.serialization.Serializable diff --git a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Series.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Series.kt similarity index 69% rename from server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Series.kt rename to shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Series.kt index 6b6da16..0a353a1 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/testdb/model/Series.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/book/model/Series.kt @@ -1,4 +1,4 @@ -package net.keinekekse.app.server.testdb.model +package net.keinekekse.app.book.model import kotlinx.serialization.Serializable