refactor(01-05): rewrite Application.kt with ContentNegotiation, Flyway boot, /health

- Remove wildcard Ktor imports (D-11 allWarningsAsErrors safety) — all imports explicit
- Install ContentNegotiation { json() } for @Serializable response bodies
- Call Database.migrate(this) at boot — fails loudly if Postgres unreachable
- Extract configureRouting() extension so tests can compose routing without DB
- Replace template root greeting with GET /health → {"status":"ok"} (D-16)
- main() shape unchanged: embeddedServer(Netty, SERVER_PORT, "0.0.0.0", ...)
This commit is contained in:
2026-04-24 18:22:37 +02:00
parent 24018efe67
commit daefe6c26d

View File

@@ -1,20 +1,36 @@
package dev.ulfrx.recipe package dev.ulfrx.recipe
import io.ktor.server.application.* import io.ktor.serialization.kotlinx.json.json
import io.ktor.server.engine.* import io.ktor.server.application.Application
import io.ktor.server.netty.* import io.ktor.server.application.install
import io.ktor.server.response.* import io.ktor.server.engine.embeddedServer
import io.ktor.server.routing.* import io.ktor.server.netty.Netty
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
import io.ktor.server.response.respond
import io.ktor.server.routing.get
import io.ktor.server.routing.routing
import kotlinx.serialization.Serializable
fun main() { fun main() {
embeddedServer(Netty, port = SERVER_PORT, host = "0.0.0.0", module = Application::module) embeddedServer(Netty, port = SERVER_PORT, host = "0.0.0.0", module = Application::module)
.start(wait = true) .start(wait = true)
} }
@Serializable
private data class Health(val status: String)
fun Application.module() { fun Application.module() {
install(ContentNegotiation) {
json()
}
Database.migrate(this)
configureRouting()
}
fun Application.configureRouting() {
routing { routing {
get("/") { get("/health") {
call.respondText("Ktor: ${Greeting().greet()}") call.respond(Health(status = "ok"))
} }
} }
} }